java 面试突击-(31-40)
Posted 栗子~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 面试突击-(31-40)相关的知识,希望对你有一定的参考价值。
文章目录
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
java 面试突击-(31-40)
31 不建议使用LinkedList的原因?
因为根据链表的属性,LinkedList必须使用迭代器才能遍历,对下标访问不太友好,非常不方便。
32 HsahMap和HashTable的区别?
目前HashTable已经不常用了,由concurrentHashMap所代替;
HashMap和HashTable的底层实现都差不多,都是由数组加链表组成,
最主要的区别就是HashTable里面每个方法都加了synchronized,所以HashTable是线程安全的,
而HashTable是线程不安全的,
区别:
HashMap允许key和value为null,HashTable不允许。
hashTable同步的,而HashMap是非同步的,
hashMap效率上比hashTable要高。
33 HsahMap的底层实现是什么?
底层实现:数组加链表;
哈希表:既满足了数据的快速查询(根据关键码值key value 而直接进行访问的数据结构),也不会占用太多的内存空间,十分方便。哈希表是数组加链表组成;
HashMap是基于哈希表的Map接口的非同步实现。实现HashMap对数据的操作,允许有一个null键,多个null值,
初始数组为16。
HashMap底层就是一个数组结构,数组中的每一项又是一个链表。数组+链表结构,新建一个HashMap的时候,就会初始化一个数组。Entry就是数组中的元素,每个Entry其实就是一个key-value的键值对,它持有一个指向下一个元素的引用,这就构成了链表,HashMap底层将key-value当成一个整体来处理,这个整体就是一个Entry对象。HashMap底层采用一个Entry【】数组来保存所有的key-value键值对,当需要存储一个Entry对象时,会根据hash算法来决定在其数组中的位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry对象时,也会根据hash算法找到其在数组中的存储位置, 在根据equals方法从该位置上的链表中取出Entry;
注:jdk 8 以后,链表长度为8,数组长度超过64时链表转为红黑树,元素以内部类Node节点存在。
- 计算key的hash值,二次hash对数组长度取模,对应到数组下标。 没有发生hash冲突时,则直接创建Node存入数组
- 发生hash冲突时,先进去equals
- 进行比较,相同取代该元素,不同,则判断链表的高度达到8,数组长度到64时,链表转为红黑树,当链表长度低于6时,从红黑树转为链表。
34 HsahMap的底层数组的扩容机制?
当hashmap中的元素个数超过数组大小loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,默认情况下,数组大小为16,那么当hashmap中元素个数超过160.75=12的时候,就把数组的大小扩展为2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知hashmap中元素的个数,那么预设元素的个数能够有效的提高hashmap的性能。
35 concurrentHashMap的原理是什么?
concurrentHashMap是线程安全的;
concurrentHashMap相比Hashtable采取的是分段锁的方法,
jdk7是用分段锁实现。
jdk8:
原理: synchronized+CAS+Node+红黑树,其中Node的vale和next都由volatile修饰
CAS:乐观锁
查找,替换,赋值都采用CAS
hash冲突,扩容采用synchronized
写加锁,读不加锁
注:其中数组采用volatile修饰的原因是扩容的时候被线程感知,不用读取脏数据。
36 concurrentHashMap怎么保证读的时候不加锁?
因为Node的成员val是用volatile关键字修饰的;
被volatile关键字修饰的变量来保证可见性、有序性,而普通的共享变量不能保证可见性的原因是普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
37 list的底层实现
ArrayList底层由数组实现,在实例化一个ArrayList时没给予构造函数数组个数参数时,集合中的数组默认是10的容量,在调用add方法时如果容量已满,会将数组的容量扩大1.5倍的容量。
38 如何决定使用 HashMap 还是 TreeMap?
对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。
对于一个有序的key集合进行遍历,TreeMap是更好的选择。(基于collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。)
39 说一下 HashSet 的实现原理?
HashSet底层由HashMap实现
HashSet的值存放于HashMap的key上
HashMap的value统一为PRESENT
40 迭代器 Iterator 是什么?
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
创作不易、点关注、不迷路
点击主页、更精彩 !!!
以上是关于java 面试突击-(31-40)的主要内容,如果未能解决你的问题,请参考以下文章