1、List 和 Set 区别
- List允许重复的对象,允许多个null元素,有序容器,通过索引访问list中的元素,常用的实现类有ArrayList、LinkList和Vector。
- Set不允许重复对象,只允许一个null元素,无序容器,无法保证元素的顺序。常见实现类有HashSet、LinkHashSet、TreeSet,TreeSet通过Comparetor或Comparable维持排序顺序。TreeSet还实现了SortSet接口,因此它是一个基于Compare和Compareto定义的有序容器。
2、List 和 Map 区别
Map不是collection的子接口或者实现类。Map是一个接口。Map的每一个元素包含两个对象,即键和值。Map元素中的值可以相同,但必须保持键的唯一性。Map值可以有任意多个null,但键最多只能有一个。常见的实现类有HashMap、LinkedHashMap、Hashtable和TreeMap。TreeMap通过comparator和comparable维持排序顺序。
3、Arraylist 与 LinkedList 区别
- ArraList访问速度方面优于LinkedList,LinkedList需要移动指针,而ArrayList不需要。
- LinkedList在增加和删除数据方面更加方便,ArrayList需要移动数据和改变数组大小,而LinkedList不需要。
- 数据结构不同。ArrayList是动态数组的数据结构,LinkedList是链表的数据结构。
- 简单来说ArraList适于查找,LinkedList适于增添和删除。
4、ArrayList 与 Vector 区别
- Vector是线程安全的,ArrayList不是线程安全的。
- 当数组容量不够用的时候,Vector容量增加1倍,ArrayList增加0.5倍。
5、HashMap 和 Hashtable 的区别
- 线程安全。HashMap不是线程安全的。HashTable是线程安全,所有元素操作都用synchronized修饰。
- 性能优劣。HashTable是线程安全的,每个方法都要阻塞线程,所以性能比HashMap差。
- NULL。HashTable键和值都不能为Null,HashMap键和值都可以为空。
- 实现方式。HashTable继承了Dictionary类,HashMap继承了AbstractMap类。
- 容量扩容。HashMap初始容量为16,HashTable为11,负载因子均为0.75。当现有容量大于纵容连*负载因子时,HashMap容量翻倍,HasTable容量翻倍+1。
- 迭代器。HashMap的Iterator迭代器时fail-fast的,HashTable的Enumerator不是fail-fast的。当其它线程增加或删除HashMap时,会报ConcurrentModificatioinException异常,而HashTable不会。
6、HashSet 和 HashMap 区别
- 实现方式。HashSet实现了Set接口,HashMap实现了Map接口。
- 存储对象。HashSet进存储对象,HashMap存储键值对。
- 添加元素。HashSet调用set方法添加元素,HashMap调用put方法添加元素。
- hashcode。HashSet使用成员对象计算Hashcode并用equals判断两个对象是否相同,HashMap使用键计算hashcode。
- 查找速度。HashMap比HashSet快,它使用唯一的键获取对象。
7、HashMap 和 ConcurrentHashMap 的区别
- ConcurrentHashMap底层采用数组+链表实现,线程安全。
- 通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。
- Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。
- 有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。
- 扩容:段内扩容(段内元素超过该段对应Entry数组长度的75%触发扩容,不会对整个Map进行扩容),插入前检测需不需要扩容,有效避免无效扩容。
- 使用 ConcurrentHashMap,其底层采用分段的数组+链表实现,线程安全,通过把 Map 分为 N 个 Segment(部分),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。
Hashtable 之所以效率低主要是使用了 synchronized 关键字对 put 等操作进行加锁,而 synchronized 关键字加锁是对整张 Hash 表的,即每次锁住整张表让线程独占,致使效率低下,而 ConcurrentHashMap 在对象中保存了一个 Segment 数组,即将整个Hash表划分为多个分段;而每个Segment元素,即每个分段则类似于一个Hashtable;这样,在执行put操作时首先根据hash算法定位到元素属于哪个Segment,然后对该Segment加锁即可,因此, ConcurrentHashMap 在多线程并发编程中可是实现多线程put操作。
8、HashMap和ConcurrentHashMap 的工作原理及代码实现
链接