Java集合框架常见面试题
集合框架第一篇。
ArrayList和LinkedList和Vector
1.存储结构不同 : ArrayList底层为数组,LinkedList为链表。
2. 存储元素特点不同:ArrayList元素可重复且有序,LinkedList元素不可重复且无序,两者都是List接口的实现类。
3. 底层结构不同:ArrayList数据结构为数组,连续的存储空间,内存占用大,LinkedList数据结构为链表,不连续的节点组成的链表,内存占用少。
4. 时间复杂度不同:ArrayList时间复杂度为O(1),空间为O(n),LinkedList相反,且ArrayList支持随机访问,适合查询,修改,LinkedList适合删除和新增。
5. Vector线程安全,不能过载。
HashSet和HashMap、HashTable
1.存储特点不同: HashSet元素不可重复且唯一,无序,HashMap存储key-value,键值可以为Null, key可重复,无序。HashTable相比HashMap键值对不可为null。
2.底层结构: HashSet:底层为hashMap,,每次put元素,都会调用hashMap的putMethod,将值存放到hashMap的key上,value为固定的对象。通过计算元素的hashCode值,得到索引,并存储到对应数组中的位置。如果元素已存在,则调用该元素的equalsMethod与新增的元素进行比较,相等则不存储。
HashMap:底层为数组+链表(1.7),数组+链表+红黑树(1.8),put元素,调用key的hashCode方法计算索引,然后将value存储到数组中,如果该位置已有元素,则将已有元素存储到链表的末尾,新的元素存储到链表的头部。这样解决了hashCode冲突问题。
jdk1.8以后优化:链表节点超过8个,自动转换为红黑树,红黑树节点小于6个自动转换为链表。
3.hashMap去掉了hashTable的contains方法,新增了containsValue And ContainsKey Method。
Iterator迭代器特点
1.Iterator只有单向指针,向前移动。
2.Often Method: Next(), HasNext(),remove()
3.ListIterator适用于List集合,双向指针。
Arrays的ArrayList和util包下的ArrayList区别?
1.Arrays是数组的工具类,Arrays的asList方法是将数组转换为内部类ArrayList,特点是数组长度是固定。
2.util包下的ArrayList才是动态数组。可以将asList Method返回的值作为ArrayList的构造方法参数,转换为真正的ArrayList。
怎样计算HashCode值?
这个回复吧
ConcurrentHashMap?
1.采用分段锁机制,每一段都是一个HashMap,写加锁,查询不加锁。
2.线程安全。