1 Collection单列集合、Map双列集合
1.1 Collection单列集合
每个元素只包含一个值
1.1.1 Collection单列集合及其实现类
1.1.1.1 list集合与Array数组
list集合:添加的元素是有序的、可重复的、有索引
- list转换为数组:调用List实现类(多态)的toArray方法
Array数组:数组只能存储一类元素、数组有索引、可以重复、
数组初始化时需要指定大小
list无需
- 数组转换成list:调用Arrays(加s的大部分情况都是工具类)的asList方法。
1.1.1.1.1 ArrayList
ArrayList底层
基于
数组实现:查询较快、增删较慢
- 查询较快:查询时候有索引
- 增删较慢:每增加或者删除一个,后边的元素都需要移动
底层基于数组实现,特点:有序、可重复、有索引
1.1.1.1.2 LinekdList
LinekdList底层基于双向循环链表实现:查询较慢、增删较快
- 查询慢:双向链表有头、尾节点查询一个一个查找需确认这两个节点所以慢
- 增删快:根据头尾节点便可完成删除、增加操作
基于双向链表实现:有序、可重复、有索引
1.1.1.1.2 Vector
Vector:线程安全的,性能低,已逐渐被ArrayList取代。
1.1.1.1.2.1 ArrayList、Vector (线程安全)的区别是什么
Vector | ArrayList |
---|---|
线程安全的 | 线程不安全(单线程使用) |
扩容时,Vector扩容100% | ArrayList 扩容50%(节省内存) |
单线程环境,我们使用ArrayList |
1.1.1.1.2.2 哪些集合类是线程安全的
① Vector:比ArrayList多了同步锁机制
② Stack :堆栈类,先进后出,不常用
③ Hashtable:比HashtMap就多了个线程安全(性能就低了),所以还是建议HashtMap
1.1.1.2 Set集合
无序(存取顺序不一致)、不重复、无索引
1.1.1.2.1 HashSet
HashSet:无序、不重复、无索引
1.1.1.2.1.1 HashSet底层原理(JDK8前后)
JDK8之前:哈希表=数组+链表
① 创建长度16的数组,默认加载因子0.75,数组名table。
② 使用元素的哈希表对数组长度求余,计算存入位置。
③ 判断当前位置是否为null,如果是null直接存入。
④ 如果不为null,表示有元素,则用equals(Object的方法底层还是“==”)进行比较。
- JDK8之前,新元素存入数组,占老元素位置,老元素挂新的下边。
- JDK8之后,新元素挂老元素下边。
JDK8以后:哈希表=数组+链表+红黑树
① 链表特点:增删快(有头尾节点),查询慢(需确认头尾节点)
② 当链表长度大于8且数组长度大于64时,将链表自定转为红黑树。
注意:红黑树数据小于6,自动切换为链表。
③ 新元素存储进数组时,直接挂在老元素下边(JDK8之前,将老元素挂新元素下边)
1.1.1.2.2 LinkedHashSet
LinkedHashSet(底层有链表):有序、不重复、无索引
1.1.1.2.3 TreeSet
TreeSet(底层有树,树可以排序):排序(默认升序,联想左小右大)、不重复、无索引