单列集合Collection、list、set
目录
一、collection
二、list集合
1、ArrayList集合底层原理
2、LinkedList集合
三、set系列集合
1、Set集合的实现类
2、HashSet底层原理
3、LinkedHashSet底层原理
4、TreeSet的特点
5、如何使用好集合
一、collection
collection是单列集合的顶层接口,他的功能是全部单列集合都可以继承使用的。
collection常用方法
方法名 | 说明 |
public boolean add(E e) | 把给定的对象添加到当前集合中 |
public void clear() | 清空集合中所有的元素 |
public boolean remove(E e) | 把给定的对象在当前集合中删除 |
public boolean contains(object obj) | 判断当前集合中是否包含给定的对象 |
public boolean isEmpty() | 判断当前集合是否为空 |
public int size() | 返回集合中元素的个数/集合的长度 |
二、list集合
特点:
1、有序:存和取的元素顺序一致有索引
2、可以通过索引操作元素可重复
3、存储的元素可以重复
List集合的特有方法
collection的方法List都继承了
List集合因为有索引,所以多了很多索引操作的方法。
方法名 | 说明 |
void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
E get(int index) | 返回指定索引处的元素 |
1、ArrayList集合底层原理
1、利用空参创建的集合,在底层创建一个默认长度为10的数组
2、添加第一个元素时,底层会创建一个新的长度为10的数组,存满时会扩容1.5倍
3、如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准
2、LinkedList集合
底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。
特有方法 | 说明 |
public void addFirst(E e) | 在该列表开头插入指定的元素 |
public void addLast(E e) | 将指定的元素追加到此列表的末尾 |
public E getFirst() | 返回此列表中的第一个元素 |
public E getLast() | 返回此列表中的最后一个元素 |
public E removeFirst() | 从此列表中删除并返回第一个元素 |
public E removeLast() | 从此列表中删除并返回最后一个元素 |
三、set系列集合
特点:
1、无序:存取顺序不一致
2、不重复:可以去除重复
3、无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
1、Set集合的实现类
HashSet :无序、不重复、无索引
LinkedHashSet:有序、不重复、无索引
TreeSet:可排序、不重复、无索引
Set接口中的方法上基本上与collection的API一致。
2、HashSet底层原理
HashSet集合底层采取哈希表存储数据
哈希表是一种对于增删改查数据性能都较好的结构
JDK8以后,当链表长度超过8,而且数组长度大于等于64时,自动转换为红黑树
如果集合中存储的是自定义对象,必须要重写hashCode和equals方法
JDK8以前:新元素存入数组,老元素挂在新元素下面
JDK8以后:新元素直接挂在老元素下面
哈希表组成
JDK8之前:数组+链表
JDK8开始:数组+链表+红黑树
哈希值
根据hashCode方法算出来的int类型的整数
该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算
一般情况下,会重写hashcode方法,利用对象内部的属性值计算哈希值
对象的哈希值特点
如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)
3、LinkedHashSet底层原理
有序、不重复、无索引。
这里的有序指的是保证存储和取出的元素顺序一致
原理:底层数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺
序。
- LinkedHashSet集合的特点和原理是怎么样的?
有序、不重复、无索引
底层基于哈希表,使用双链表记录添加顺序
2.在以后如果要数据去重,我们使用哪个?
默认使用HashSet
如果要求去重且存取有序,才使用LinkedHashSet
4、TreeSet的特点
不重复、无索引、可排序
可排序:按照元素的默认规则(有小到大)排序。
TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。
TreeSet集合默认的规则
对于数值类型:Integer , Double,默认按照从小到大的顺序进行排序。
对于字符、字符串类型:按照字符在ASCII码表中的数字升序进行排序。
TreeSet的两种比较方式
方式一:默认排序/自然排序:Javabean类实现Comparable接口指定比较规则
方式二:比较器排序:创建TreeSet对象时候,传递比较器Comparator指定规则
使用原则:默认使用第一种,如果第一种不能满足当前需求,就使用第二种
方法返回值的特点
负数:表示当前要添加的元素是小的,存左边
正数:表示当前要添加的元素是大的,存右边
0:表示当前要添加的元素已经存在,舍弃
5、如何使用好集合
1.如果想要集合中的元素可重复
用ArrayList集合,基于数组的。(用的最多)
2.如果想要集合中的元素可重复,而且当前的增删操作明显多于查询
用LinkedList集合,基于链表的。
3.如果想对集合中的元素去重
用HashSet集合,基于哈希表的。(用的最多)
4.如果想对集合中的元素去重,而且保证存取顺序
用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet。
5.如果想对集合中的元素进行排序
用Treeset集合,基于红黑树。后续也可以用List集合实现排序。
注:总结来自于哔哩哔哩java视频、从入门到起飞尼古拉斯阿玮老师
还没有评论,来说两句吧...