java集合类是开发中经常用到的,比如ArrayList、HashMap、HashSet等,下面来系统的说一下。
Collection类图
Collections与Collection
- Collection:是一个集合接口,提供了对集合对象进行基本操作的通用接口方法;
- Collections:是针对集合类的一个包装类,它提供了一系列静态方法实现对各种集合的搜索、排序以及线程安全化的操作,其中的大多数方法都用于处理线性表。
List、Set、Map有序问题
这里的有序和无序不是指集合中的排序,而是是否按照元素添加的顺序来存储对象。
-
List是按照元素的添加顺序来存储对象的,因此是有序的。他的实现类ArrayList、LinkedList、Vector都是有序的。元素可以重复 (有索引)。 通过元素的equals()方法判断是否重复。
-
Map是无序的,它的存储结构是哈希表<key,value>键值对,map中插入元素是根据key计算出的哈希值来存储元素的,因此他不是按照元素的添加顺序来存储对象的,所以Map是无序的。它的实现类有:HashMap、TableMap和TreeMap。
其中LinkedHashMap是有序的,hashMap用来保证存储的值键值对,list用来保证插入的顺序和存储的顺序一致。
-
Set是无序的,并且set中的元素不能重复 (没有索引)。set的底层实现其实是Map,它是计算key的哈希值来确定元素在数组中的存放位置,所以是无序的,应为在Map中key的值不能重复,所以set中的元素不能重复。它的实现类有:haseSet、TreeSet。 遍历只能用Iterator迭代器和增强for, 不能使用普通for遍历。
其中LinkedHashSet是有序的,其中haseSet用来保证数据唯一,List用来保证插入的顺序和存储的顺序一致。
List
ArrayList、LinkedList、Vector
ArrayList与Vector都是便于查找元素,在首末位置增加、删除元素尚可,如若在指定位置删除、增加元素,用LinkedList更高效。
ArrayList与LinkedList都是线程不安全的,Vector是线程安全的。
LinkedList 结构是双向循环链表。
- 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ];
- 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
- 所有的List中可以有null元素,例如[ tom,null,1 ];
- 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。
Set
HashSet、TreeSet
Map
HashMap
HashMap源码和底层结构
HashMap使用的存储结构:
transient Node<K,V>[] table;
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
}
HashMap的数据结构,底层是数组,数组中的每一项又是链表。
HashMap的存取实现:put元素时,根据key的hashCode重新计算hash值,根据hash值得到此元素在数组中的位置(即下标),插入链表。
HashMap为何线程不安全
《Java并发编程的艺术》一书中是这样说的:
HashMap在并发执行put操作时会引起死循环,导致CPU利用率接近100%。因为多线程会导致HashMap的Node链表形成环形数据结构,一旦形成环形数据结构,Node的next节点永远不为空,就会在获取Node时产生死循环。
死循环并不是发生在put操作时,而是发生在扩容时。详细的解释可以看下面几篇博客:
疫苗:JAVA HASHMAP的死循环
ConCurrentHashMap
线程安全,采用分段锁机制,拆分成N个Hashtable的Map。
在jdk1.8之后,采用CAS算法(无锁算法),是一种底层操作系统的算法,效率高。
concurrentLevel=16
HashMap、Hashtable、TreeMap
- HashMap:允许空键值(key是null可以,value是null也可以),线程不安全,性能上会优于Hashtable;
- Hashtable:不允许空键值,线程是安全的。其实现如下:
public synchronized V get(Object key) {
// 省略实现
}
public synchronized V put(K key, V value) {
// 省略实现
}
线程安全的Map:Hashtable,ConcurrentHashMap和synchronized Map
几种线程安全的Map解析
https://blog.csdn.net/BenjaminYoung29/article/details/79317940