集合
集合的前提:数据结构
-
动态数组
特点:查询和修改开,增加和删除相对较慢
特殊点:数组的初始长度默认为10,如果长度不够了,则会新建一个新的长度,然后通过copy方法把原有的数据搬到新的数组中,这个过程成为扩容。扩容的扩容算法就是(当前数组长度*3)/2+1
为什么查改快、增删慢?
因为数组有下标,我们可以通过下标直接找到;
因为我们的数组是一个连续的块型内存,增加和删除都是要改变数组的长度,从而使得后面的数据都需要进行移动,他就是慢在这个移动数据上
-
链表
特点:增加删除快,查询和修改慢
为什么增删快,修改慢?
因为链表中的数据只需要指向下一个数据就可以了,所以查询和修改的方式就需要从头开始挨个找,
增删就是只需要修改一下上一个的指向修改数据和修改数据指向下一个即可,如果修改数据时删除的话,就直接上一个指向下一个
- 红黑树
简介:红黑树是一个平衡二叉查找树,此处需要你去百度了解一下红黑树的
红黑树特性:
特性1:每个节点要么红色要么黑色
特性2:最上面的节点叫根节点,是黑色的
特性3:每个叶子节点如果为Nil就是黑色的
特性4:红色的子节点一定是黑色
特性5:任意一个节点到每个叶子节点的路径都包含同数量的黑色节点
-
哈希表(hash表)
特点:增删改查性能都很好的一种数据结构
哈希表在JDK8前,采用的数组+链表的形式
JDK8后,采用数组+链表+红黑树的形式
哈希表存储:根据对象地址计算的int类型的值进行存储
集合分为三种
List、Set和Map
其中List和Set继承了java.utils.Collection接口,而map则是java.utils.map
List
list的显著特点就是 添加元素是有序,可重复,有索引
常用子类:ArrayList、LinkedList
ArrayList:底层数据结构是数组,查询快,增删满,且线程不安全,效率高
LinkedList:底层数据结构是链表,查询慢,增删快,且线程不安全,效率高
Vector:底层数据结构是数组,查询快,增删慢,且线程安全,效率低
对比
Vector和ArrayList区别
相同:底层数据结构都是数组
不同:Vector因为是线程安全的,所以效率低
ArrayList因为线程不安全,所以效率高
ArrayList和LinkedList的区别
ArrayList:底层数组,查询快,增删慢 线程不安全
LinkedList:底层链表,增删快,查改慢 线程安全
如果需要线程安全:
可以用Collections工具类中的synchronizeList为ArrayList加锁,从而变成线程安全的
LinkedList也同上
当然,我们亦可以使用java.util.concurrent下的CopyOnWriteArrayList替代Arraylist
Set
特点:添加元素无序、不重复,无索引
常用:HashSet、TreeSet
HashSet:无序、不重复、无索引;
ListedHashSet:有序,不重复,无索引;底层数据结构为hash表,但是采用的双链表
TreeSet:按照大小默认升序排序、不重复、无索引;排序也可根据字符串首个字符编号升序
HashSet1.7版本原理解析:数组+链表+(结合哈希算法)
- 创建一个默认长度为16的数组,数组名为table
- 根据元素的哈希值跟数组的长度求余计算出应存入的位置(哈希算法)
- 判断当前位置是否为null,如果是null直接存入
- 如果位置不为null,表示有元素,则会调用equals方法比较
- 如果一样,则不存,如果不一样,则存储数组
- JDK7新元素指向老元素位置,指向老元素
- JDK8中寻元素放在老元素下面
- 当前挂在同意索引下的元素如果过多的时候,查询性能降低,从JDK8起,当链表长度超过8的时候,会自动转换为红黑树
- 当数组存满(数组长度*0.75)的时候,会自动扩容,每次扩容原先的两倍
结论:
- 哈希表是一种对增删改查数据性能都较好的结构
- 如果希望set认为两个对象的内容完全相同,我们需要重写equals和hashcode方法
以上使用情况
- 如果希望元素可以重复,又有索引,索引查询要快
- 使用ArrayList集合,基于数组的(使用最多)
- 如果希望元素可以重复,又有索引,增删首尾要快
- 使用LinkedList集合,基于链表
- 如果希望增删改查都快,但是元素不能重复,且无索引,无序
- 使用HashSet集合,基于哈希表的
- 如果希望增删改查都快,但是元素不能重复,且无索引,有序
- 用LinkHashSet集合,基于哈希表的双链表
- 如果要对对象进行排序
- 用TreeSet集合,基于红黑树,后续也可以用List集合实现排序
Map
Map是双列集合的祖宗接口,他的功能是双列集合都可以继承使用的
特点:键值对
HashMap
特点:HashMap是Map里面的一个实现类,特点都是由键决定的:无序、不重复、无索引
实际上:Set系列集合的底层就是Map实现的,只是Set集合中的元素只要键数据,不要值数据而已
LinkedList
特点:由键决定是否有序,不重复,无索引(此处有序仅保证存入和取出先后顺序一致)
原理:底层hash表,但是多了一个双链表
TreeMap
特点:由键决定特性:不重复,无索引、可排序;(按键排序,默认从小到大)
以上图片资源来源网络;如涉及盗版侵权请联系作者处理