Java 中的集合
A、java中的集合分为Value(Collection),Key - Value(Map)
存储值又分为 list 和 set。
list 是有序的,可以重复的
set 是无序的,不可以重复的。根据 equals 和 hashcode 判断,也就是说一个对象要存储在set中,必须重写equals 和 hashcode 方法
B、list的实现类:ArrayList、Vector、LinkedList(双向循环链表)
1. 底层数据结构
ArrayList、Vector底层依赖数组,查询效率较高、增删效率较低(Vector 是线程安全的,整体效率比ArrayList 低)
LinkedList底层依赖双向循环链表,增删效率高,查询效率低
2. 存储元素方面
ArrayList、Vector、LinkedList中的元素有序,可重复允许null值
3. 扩容方面
ArrayList 一次扩容1.5倍
Vector 根据增量扩容,增量为0,扩容两倍;否则原容量 + 增量
LinkedList 没有扩容
4. 线程安全方面
ArrayList、LinkedList 线程不安全(如果有多个线程需要同时访问List集合中的元素可以考虑使用Collections将集合包装成线程安全的集合)
Vector 线程安全
C、set 接口实现类:HashSet、LinkedHashSet、TreeSet
HashSet
- 不能有相同的元素,可以有一个null元素,存入的元素是无序的
- 底层数据结构是哈希表,哈希表就是存储一系列的表,哈希值是由对象的hashCode() 生成
- 确保唯一性的两个方法:hashCode() 和 equals() 方法
- 非线程安全
LinkedHashSet
- 不能有相同的元素,可以有一个null 值,元素严格按照放入的顺序排列
- 底层数据结构由哈希表和链表组成
- 链表保证了元素的有序即存储和取出一致,哈希表保证了元素的唯一性
- 非线程安全
TreeSet
- 不能有相同的元素,不可以有null 值,根据元素的自然排序进行排序
- 底层的数据结构是红黑树(一种自平衡二叉查找树)
- 非线程安全
D、Map的实现类:HashMap、HashTable、TreeMap、LinkedHashMap
HashMap
-
线程不安全,效率高。允许null 键和null 值
-
是基于哈希表的Map接口实现。哈希表的作用是用来保证键的唯一性的。
-
常用实例化方法:
new HashMap<Object,Object>();
HashTable
- 线程安全,效率低。不允许null 键和null 值
LinkedHashMap
-
是基于Map接口的哈希表和链接列表实现有序
-
由哈希表保证键的唯一性
-
由链表保证键的有序(存储和取出的顺序一致)
-
常用实例化方法:
new LinkedHashMap<Object,Object>();
TreeMap
-
是基于红黑树的Map接口的实现
-
构造方法
TreeMap(); //使用键的自然顺序构造一个新的、空的数映射 //构造一个新的、空的树映射,该映射根据给定比较器进行排序 TreeMap(Comparator<?super K>comparator)
HashMap 与 HashTable,HashTable 与 ConcurrentHashMap的区别
- HashMap是可以把null 作为Key 或者Value 的,而HashTable 是不可以的
- HashMap 是线程不安全的,效率较高。而HashTable是线程安全的,效率较低
- ConcurrentHashMap也是线程安全的,就是把一个大的Map,分成若干个小的Map并分别加上锁,因此效率高于HashTable。
本文来自博客园,作者:小白yun,转载请注明原文链接:https://www.cnblogs.com/siheng/p/12549694.html
浙公网安备 33010602011771号