概述:
- List、Set、Map都是接口,前两个继承至Collection接口,Map为独立接口。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191118102159920.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x5MjcwODE2OTYyOA==,size_16,color_FFFFFF,t_70)
List有序,可重复
1.ArrayList
底层:数组;查询快,增删慢。
线程不安全,效率高。
getter()、setter()方法快
当容量不够时,扩展当前容量*1.5+1
注意: 谨慎使用subList方法。
subList返回的是ArrayList的内部类,数据是原ArrayList的视图,改动subList的返回值会对元数据产生变动。
代替方法:
list.stream().skip(strart).limit(end).collect(Collectors.toList());
2.Vector
底层:数组;查询慢,增删慢。
线程安全,效率低。
当容量不够时,默认扩展一倍
3.LinkedList
底层:链表;查询慢,增删快。
线程不安全,效率高。
4.CopyOnWriteArrayList
并发情况下,读场景远远大于写场景的时候使用;
他的写场景会复制一份相同的数组去写,读写互不干扰,所有读更快。
Set无序,唯一性
1.HashSet
底层:哈希表;存取速度快
依赖hashCode()、equals()保证唯一性。
注意:内部的实现原理实际用到的是HashMap;
2.LinkedHashSet
底层:链表和哈希表
元素有序:链表;
唯一性:哈希表。
3.TreeSet
底层:红黑树
元素有序:自然排序、比较器排序
唯一性:根据比较的返回值是否为0。
HashSet<String> hashSet = new HashSet<>();
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
TreeSet<String> treeSet = new TreeSet<>();
for (String data : Arrays.asList("1", "2", "4", "-5", "3")) {
hashSet.add(data);
linkedHashSet.add(data);
treeSet.add(data);
}
System.out.println("HashSet :" + hashSet);
System.out.println("LinkedHashSet :" + linkedHashSet);
System.out.println("TreeSet :" + treeSet);
Set中三个实现类是否有序的结果:
HashSet :[1, 2, 3, 4, -5]
LinkedHashSet :[1, 2, 4, -5, 3]
TreeSet :[-5, 1, 2, 3, 4]
Map概述
Map接口有HashMap、TreeMap、HashTable三个实现类
1.HashMap
键不可重复,值可重复,无序
底层:哈希表
线程不安全,效率高
当空间占用比例超过0.75,扩容变为原来的2倍
允许key值为null,value为null
推荐: 在不用考虑线程安全的情况下使用
2.HashTable
键不可重复,值可重复,无序
底层:哈希表
线程安全,效率低,全程sychronized同步锁
3.TreeMap
底层:二叉树,有序的
键不可重复,值可重复
4.ConcurrentHashMap
线程安全且高效的,jdk1.7使用segment分段锁机制,jdk1.8使用cas无锁机制,锁的粒度更细了.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)