接口继承关系
集合类存放于java.util包中,主要有3中:sat(集)、list(列表包含Queue)和map(映射)。
1.Collection:Collection是集合List、Set、Queue最基本的接口。
2.Iterator:迭代器,可以通过迭代器遍历集合中的数据。
3.Map:是映射表的基础接口。
集合框架
graph TD
Collection --> List
List --> ArrayList
ArrayList --> 排列有序可以重复
ArrayList --> 底层使用数组
ArrayList --> 速度快,增删慢,getter和setter方法快
ArrayList --> 线程不安全
ArrayList --> 当容量不够使,ArrayList是当前容量*1.5+1
List --> Vector
Vector --> 排列有序可重复
Vector --> 底层用数组
Vector --> 速度快,增删慢
Vector --> 线程安全,效率低
Vector --> 当容量不够使,Vector默认扩展一倍容量
List --> LinkedList
LinkedList --> 排列有序,可重复
LinkedList --> 底层使用双向循环链表数据结构
LinkedList --> 查询慢,增删快,add和remove方法快
LinkedList --> 线程,不安全
graph TD
Collection --> Set
Set --> HashSet
HashSet --> 排列无序,不可重复
HashSet --> 底层使用Hash表实现
HashSet --> 存取速度快
HashSet --> 内部是HashMap
Set --> TreeSet
TreeSet --> 排列无须不可重复
TreeSet --> 底层使用二叉树实现
TreeSet --> 排序存储
TreeSet --> 内部是TreeMap和SortedSet
Set --> LinkedHashSet
LinkedHashSet --> 采用Hash表存储,并用双向链表记录插入顺序
LinkedHashSet --> 内部是LinkedHashMap
HashSet
HashSet存储元素的顺序并不是按照存入的顺序(和List存储方式不同),而是按照哈希值来存的所以取数据也是按照哈希值取得。元素的哈希值是通过元素的hashcode方法来获取的,HashSet首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals方法,如果equals结果为true,HashSet就视为同一个元素。反之不是同一个元素。
HashMap
HashMap根据键的hashcode值存储数据的,大多数情况下可以直接定位到它的值,因而具有很快的速度,但遍历顺序却是不确定的。HashMap最多只允许一条记录的键为null,允许多条记录的值为null。hashMap线程非安全,即任一时刻可以有多个线程同时写HashMap,可能导致数据的不一致。如果需要满足线程安全,可以用Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。
我们知道,查找的时候,根据Hash值我们能够快速定位到数组的具体下标,但是之后的话,需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决于链表的长度,为了降低这一部分开销,在JAVA8中,当链表的元素超过了8个以后,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度。
HashMap TreeMap LinkedHashMap
一般情况下,我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。