首页 课程 师资 教程 报名

高级Java工程师面试题

  • 2020-01-10 15:59:43
  • 2382次 动力节点


高级Java工程师面试题


  HashMap的get和put原理


  PUT原理:当调用HashMap的put方法传递key和value时,先调用key的hashcode方法。通过key的Hash值来找到Bucket----‘桶’的位置,然后迭代这个位置的Entry列表 判断是否存在key的hashcode和equals完全相同的key,如果完全相同则覆盖value, 否则插入到entry链的头部。


  HashMap在put时的Entry链形成的场景?


  当程序试图将一个key-value对放入HashMap中时,程序首先根据该 key 的 hashCode() 返回值决定该 Entry 的存储位置:如果这两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry 的 value,但key不会覆盖。


  如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部


  GET原理:根据该 key 的 hashCode 值计算它的 hash 码,遍历并循环取出 Entry 数组中指定索引处的Entry值,如果该 Entry 的 key 与被搜索 key 相同 ,且Enrty的hash值跟key的hash码相同,然后看是否是Entry链,如果是则迭代这个位置的Entry列表,判断是否存在key的hashcode和equals完全相同的key,如果完全相同则获取value。


  HashMap的rehash


  HashMap初始容量大小为16,一般来说,当有数据要插入时,都会检查容量有没有超过设定的thredhold,如果超过,需要增大Hash表的尺寸,但是这样一来,整个Hash表里的元素都需要被重算一遍。这叫rehash,这个成本相当的大


  HashMap的线程不安全问题


  比如put操作时,有两个线程A和B,首先A希望插入一个key-value对到HashMap中,首先计算记录所要落到的桶的索引BucketIndex坐标,然后获取到该桶里面的Entry链表header头结点,此时线程A的时间片用完了,而此时线程B被调度得以执行,和线程A一样执行,只不过线程B成功将记录插到了桶里面,假设线程A插入的记录计算出来的桶索引和线程B要插入的记录计算出来的桶索引是一样的,那么当线程B成功插入之后,线程A再次被调度运行时,它依然持有过期的链表头但是它对此一无所知,以至于它认为它应该这样做,如此一来就覆盖了线程B插入的记录,这样线程B插入的记录就凭空消失了,造成了数据不一致的行为。另一个不安全的体现是是get操作可能由于resize而死循环。


  HashMap和Hashtable的区别


  相同点:1 都实现了Map接口 2 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异


  不同点:1 hashMap允许NULL作为key和value,而hashtable不允许 2 hashMap线程不安全,Hashtable线程安全 3 hashMap速度快于hashtable 4 HashMap 把 Hashtable的contains方法去掉了,改成containsvalue和containsKey,避免引起误会 5 Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现


  为什么collection没有实现clonable接口


  Collection接口有很多不同的集合实现形式,而clonable只对具体的对象有意义。


  为什map没有实现collection接口


  Set 和List 都继承了Conllection,Map没有继承于Collection接口,Map提供的是key-Value的映射,而Collection代表一组对象。


  Map接口的实现有哪些,区别是什么


  HashMap,LinkedHashMap,Hashtable,TreeMap。


  LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序 Hashtable和HashMap类似,它继承自Dictionary类,不同的是它不允许键或值为空。TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器


  方法区卸载Class的条件


  1 该类所有的实例已经被回收 2 加载该类的ClassLoader已经被回收 4该类对应的java.lang.Class对象没有任何地方被引用


  Ps:方法区除了回收无用class,也回收废弃常量,即没有被引用常量


  可以作为GC Roots的对象包括哪些


  虚拟机栈(栈帧中的局部变量表)中引用的变量 方法区中类静态属性引用的对象 方法区中常量引用的对象 本地方法栈中JNI引用的变量


  JVM运行时内存模型


  方法区、堆、虚拟机栈、本地方法栈、程序计数器


  Netty的ByteBuffer的引用计数器机制


  从netty的4.x版本开始,netty使用引用计数机制进行部分对象的管理,通过该机制netty可以很好的实现自己的共享资源池。如果应用需要一个资源,可以从netty自己的共享资源池中获取,新获取的资源对象的引用计数被初始化为1,可以通过资源对象的retain方法增加引用计数,当引用计数为0的时候该资源对象拥有的资源将会被回收。


  判断对象是否存活的两种方法


  1 引用计数法:缺点是对循环引用的对象无法回收 2 可达性分析


高级Java工程师面试题


      以上就是动力节点Java培训机构小编介绍的“高级Java工程师面试题”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。


相关推荐


最新最全java面试题及答案(初级到高级)


史上最全的中高级JAVA工程师面试题及答案汇总


Java高级开发工程师面试题


2019史上最全java面试题题库大全800题


哪有资深java工程师面试题


选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交