Java刷题笔记----->集合类
1.ArrayList与Vector的区别?
一般提到某某集合区别,感觉必有线程安全
Arrylist线程不安全,Vector反之
2.HashMap和HashTable的区别?
几个方面:线程是否安全,效率问题,对Null Key和Null value的支持,初始容量大小和每次扩容量大小的不同,底层数据结构的不同(这又涉及到链表和红黑树了,而面试很喜欢考红黑树。。。)
3.HashMap和HashSet的区别?
HashMap | HashSet |
---|---|
实现了Map接口 | 实现Set接口 |
4.HashMap多线程操作导致死循环问题
原因在于并发下的Rehash会造成元素之间形成一个循环列表。不过JDK1.8后解决了这个问题,但是不建议在多线程下使用HahsMap,因为多线程下HashMap还是会存在其他问题比如数据丢失。并发环境下推荐使用ConcurrentHashMap。
5.集合框架底层数据结构总结
1. List
- Arraylist : Object[] 数组
- Vector : Object[] 数组
- LinkedList : 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
2. Set - HashSet (无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素
- LinkedHashSet : LinkedHashSet 是 HashSet 的子类,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的 LinkedHashMap 其内部是基于 HashMap 实现一样, 不过还是有一点点区别的
- TreeSet (有序,唯一): 红黑树(自平衡的排序二叉树)
3. Map - HashMap : JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链 表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突 时有了较大的变化,当链表⻓度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如 果当前数组的⻓度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链 表转化为红黑树,以减少搜索时间
- LinkedHashMap : LinkedHashMap 继承自 HashMap ,所以它的底层仍然是基于拉链式散 列结构即由数组和链表或红黑树组成。另外, LinkedHashMap 在上面结构的基础上,增加 了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的 操作,实现了访问顺序相关逻辑。
- Hashtable : 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的
- TreeMap : 红黑树(自平衡的排序二叉树)
6.如何选用集合?
主要根据集合的特点来选用,比如我们需要根据键值获取到元素值时就选用 Map 接口下的集 合,需要排序时选择 TreeMap ,不需要排序时就选择 HashMap ,需要保证线程安全就选用
ConcurrentHashMap 。
当我们只需要存放元素值时,就选择实现 Collection 接口的集合,需要保证元素唯一时选择实现 Set 接口的集合比如 TreeSet 或 HashSet ,不需要就选择实现 List 接口的比如 ArrayList 或 LinkedList ,然后再根据实现这些接口的集合的特点来选用。
稍微看了下:红黑树工作原理