List
一、LinkList:是List接口的一种实现,基于链表的数据结构,地址不连续,查询和删除比较快,线程非安全
二、ArrayList:List接口的一种实现,基于动态数组的数据结构,地址连续,查询效率高,线程非安全
三、Vector:与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,是线程安全的。(即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。)
常用方法
方法 | 解释 |
---|---|
boolen add(E e) | 尾插e |
Set
一、TreeSet:底层是红黑树,且元素自动排序,靠自然排序比较器保证有序。根据比较的返回值是否是0来保证元素的唯一性,不允许放入null值 。适用于排序场景
二、HashSet:底层是哈希表,不允许有重复的值,存储数据时会调用HashCode方法,得到Hash值,以此决定值的存放位置。
线程非安全:即使存储的值相同,但是Hash值不同,依旧会存放在不同的位置。
唯一性:元素重写hashCode方法和equals方法来判断两个元素是否相等,如果相等则覆盖原来的元素
三、LinkedHashSet 链表维护元素的插入顺序,底层采用链表和哈希表,链表保证元素顺序和存储顺序一致,哈希表保证元素的唯一性。线程不安全。
Map
一、HashMap:基于Hash桶,通过hash函数计算Hash地址,需要复写equals和hashcode方法,线程非安全,适用于Map中插入,删除和定位元素。
在JDK1.7及之前,是用数组加链表的方式存储的。当链表的长度特别长的时候,查询效率将直线下降,查询的时间复杂度为 O(n)。
JDK1.8 把它设计为达到一个特定的阈值(当一个hash值上的链表长度大于8时)之后,就将链表转化为红黑树。
这里简单说下红黑树的特点:
- 每个节点只有两种颜色:红色或者黑色
- 根节点必须是黑色
- 每个叶子节点(NIL)都是黑色的空节点
- 从根节点到叶子节点,不能出现两个连续的红色节点
- 从任一节点出发,到它下边的子节点的路径包含的黑色节点数目都相同
- 由于红黑树,是一个自平衡的二叉搜索树,因此可以使查询的时间复杂度降为O(logn)。
hash冲突的解决方法:
开放定址法(查询产生冲突的地址的下一个地址是否被占用,直到寻找到空的地址),再散列法,链地址法等。hashmap采用的就是链地址法,jdk1.7中,当冲突时,在冲突的地址上生成一个链表,将冲突的元素的key,通过equals进行比较,相同即覆盖,不同则添加到链表上,此时如果链表过长,效率就会大大降低,查找和添加操作的时间复杂度都为O(n);但是在jdk1.8中如果链表长度大于8,链表就会转化为红黑树,时间复杂度也降为了O(logn),性能得到了很大的优化。
PUT方法
二、TreeMap:基于红黑树实现,适用于按自然顺序或自定义顺序遍历键(key),线程非安全。