培训资源搜索网

当前位置: 首页 » 讲师文章 » 人力资源 » 正文

牛人面试与问答

放大字体  缩小字体 发布日期:2019-09-10  浏览次数:236
核心提示:1: 多线程的实现方式 有几种答:继承Thread、实现 runable 接口 、callable 接口。其中前两种方式线程执行完后都没有返回值,只
 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 进行查看线程相应的状态。
 
 
[ 讲师文章搜索 ]  [ 加入收藏 ]  [ 告诉好友 ]  [ 打印本文 ]  [ 违规举报 ]  [ 关闭窗口 ]

 
0条 [查看全部]  相关评论

 
推荐图文
推荐讲师文章
点击排行

新手指南
会员服务
机构服务
帮助中心
关注我们
手机网站: m.pxzys.com

0792-8198528

周一至周五 8:00-18:00
(其他时间联系在线客服)

24小时在线客服