JDK8 java集合关系图
Iterator
遍历集合的接口,接口中声明了如下方法:
- hasNext():判断集合是否遍历完毕,如果没有,返回true;
- next():返回下一个元素;
- remove():从集合中删除由next()返回的元素
Collection
java中除了Map接口,其余的三个集合List、Set、Queue都继承了Collection接口。这些接口都定义在java.util包下。
Collection接口的iterator()和toArray()方法都用于返回集合中的所有元素,前者返回一个Iterator对象,后者返回一个数组。
List
List的主要特征是元素以线性方式存储,集合中的元素是有序、可重复的。从上图可以看到,List有两个实现类:
- ArrayList:ArrayList代表长度可变的数组,能够快速对数组进行随机访问,但插入和删除元素速度较慢。
- LinkedList:在实现中采用链式数据结构。对顺序访问进行了优化,向LinkedList中添加和删除元素的速度较快,随机访问的速度较慢。
Set
Set不保存重复的元素,并且是无序的。
- HashSet:为快速查找而设计的Set。存入HashSet的元素必须重写hashCode()方法。HashSet中的元素没有顺序可循,这是由于处于速度原因的考虑,HashSet使用了散列;
- TreeSet:实现了SortedSet接口,保持次序的Set,元素必须实现Comparable接口。TreeSet将元素存储在红黑树的数据结构中;
- LinkedHashSet:继承了HashSet,具有HashSet的查找速度,也使用了散列(哈希表)来存储元素,但LinkedHashSet使用了链表来维护元素的插入顺序,元素也必须重写hashCode()方法。
Map
Map是一种把键对象和对象进行映射的集合,键是唯一的,而值对象仍可以是Map类型,依次类推就形成了多级映射。
- HashMap:Map基于哈希表的实现,插入和查询键值对的开销是固定的,HashMap不是线程安全的,HashMap最多只允许一条记录的键为null;允许多条记录的值为 null;
- HashTable:HashTable是线程安全的,不允许键值为null;
- TreeMap:实现了SortedMap接口,基于红黑树的实现,具有排序功能的Map;
- LinkedHashMap:内部使用双向链表保证了数据插入的顺序;遍历LinkedHashMap时,可以选择插入顺序遍历,也可以按照LRU(最近最少使用)的次序遍历;
- ConcurrentHashMap:线程安全的HashMap,比HashTable性能更好,替代了HashTable
HashSet和HashMap的负载因子
HashSet和HashMap都使用哈希算法来存取元素,哈希表中的每个位置也被称为桶(bucket),在发成哈希冲突的时候,在桶中以链式的形式存放多个元素。
HashSet和HashMap都具有以下属性:
- 容量(capacity):哈希表中桶的数量,上图一共6个桶,容量为6;
- 初始容量(initial capacity):可以在创建HashSet和HashMap的构造方法中传入;
- 大小(size):元素的数目
- 负载因子:等于size/capacity;负载因子为0,表示空的哈希表。轻负载的哈希表具有冲突少、适合插入和查找的优点,但是遍历元素较慢;如果负载因子较高,虽然会降低对内存空间的要求,但会缩短查找数据的时间,因为查找的时候也是根据hashCode先找桶,再在桶里找数据。