您当前的位置:博兴在线首页 >> 分类信息首页 >> 招聘求职首页 >> 文章列表 >> 文章详细内容

面试技巧

牛人面试与问答

发布时间:2018-05-30   来源:博兴在线网友
牛人面试与问答01

面试

1: 多线程的实现方式 有几种

答:继承Thread、实现 runable 接口 、callable 接口。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。

2: 谈谈你对HashMap的理解,HashMap怎么解决碰撞问题的

答:讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能。

数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)

线性链表:对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂度为O(n)

二叉树:对一棵相对平衡的有序二叉树,对其进行插入,查找,删除等操作,平均复杂度均为O(logn)。

哈希表:相比上述几种数据结构,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成,时间复杂度为O(1),接下来我们就来看看哈希表是如何实现达到惊艳的常数阶O(1)的。

我们知道,数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构(像栈,队列,树,图等是从逻辑结构去抽象的,映射到内存中,也这两种物理组织形式),而在上面我们提到过,在数组中根据下标查找某个元素,一次定位就可以达到,哈希表利用了这种特性,哈希表的主干就是数组。

比如我们要新增或查找某个元素,我们通过把当前元素的关键字 通过某个函数映射到数组中的某个位置,通过数组下标一次定位就可完成操作。

存储位置 = f(关键字)

其中,这个函数f一般称为哈希函数,这个函数的设计好坏会直接影响到哈希表的优劣。举个例子,比如我们要在哈希表中执行插入操作:

牛人面试与问答01


查找操作同理,先通过哈希函数计算出实际存储地址,然后从数组中对应地址取出即可。

哈希冲突

然而万事无完美,如果两个不同的元素,通过哈希函数得出的实际存储地址相同怎么办?也就是说,当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞。前面我们提到过,哈希函数的设计至关重要,好的哈希函数会尽可能地保证 计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。那么哈希冲突如何解决呢?哈希冲突的解决方案有多种:开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法,链地址法,而HashMap即是采用了链地址法,也就是数组+链表的方式

3: get和post的基本区别

get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制get安全性非常低,post安全性较高。但是执行效率却比Post方法好。 get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

4. 谈谈JVM

一、JVM 内存模型

根据JVM规范,JVM内存共分为虚拟机栈,堆,方法区,程序计数器、本地方法栈。

牛人面试与问答01


虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建

程序计数器 :JVM支持多个线程同时运行,每个线程都有自己的程序计数器。倘若当前执行的是 JVM 的方法,则该程序计数器中保存当前执行指令的地址;倘若执行的是native 方法,则PC寄存器中为空。

堆内存:是 JVM 所有线程共享的部分,在虚拟机启动的时候就已经创建。所有的对象和数组都在堆上进行分配。这部分空间可通过 GC 进行回收。当申请不到空间时会抛出 OutOfMemoryError。

方法区:也是所有线程共享。主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分

二、PermGen(永久代)

绝大部分 Java 程序员应该都见过 "java.lang.OutOfMemoryError: PermGen space "这个异常。这里的 “PermGen space”其实指的就是方法区。不过方法区和“PermGen space”又有着本质的区别。前者是 JVM 的规范,而后者则是 JVM 规范的一种实现,并且只有 HotSpot 才有 “PermGen space”,而对于其他类型的虚拟机,如 JRockit(Oracle)、J9(IBM) 并没有“PermGen space”。由于方法区主要存储类的相关信息,所以对于动态生成类的情况比较容易出现永久代的内存溢出。最典型的场景就是,在 jsp 页面比较多的情况,容易出现永久代内存溢出。我们现在通过动态生成类来模拟 “PermGen space”的内存溢出:

三、Metaspace(元空间)

其实,移除永久代的工作从JDK1.7就开始了。JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。但永久代仍存在于JDK1.7中,并没完全移除。JDK1.8开始已不存在永久代,叫Metaspace(元空间)。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过以下参数来指定元空间的大小:

5. 讲讲什么情况下回出现内存溢出,内存泄漏

堆-OOM:堆 空间设置 太小、或者 new对象够多,超过JVM设定的值。

栈-OOM:栈空间设置太小,或者线程太多、 一个线程对应一个栈。

方法区-OOM:加载类过多,或者静态变量太多,或者常量太多。

6. 如果我们项目中使用一个线程,我怎样查看该线程相应的状态。

可以通过JVM自带的工具 来查看线程的状态 如:Jconsole 或者 jvisualvm 进行查看线程相应的状态。

登录后发表评论。

职场资讯更多>>

简历帮助更多>>

面试技巧更多>>

电话:0543-2166169 传真:"" 邮箱:boxingzaixian@163.com
地址:山东省博兴县胜利一路409号 邮编:256500
Copyright © 2004-2019 博兴在线 版权所有  技术支持:城市联盟
鲁ICP备09023384号  电信与信息服务业务经营许可证090779号 人力资源服务许可证110114718441号
分类小帮手
本站客服帮助
""