单列集合

Collection 是 单列集合 的根接口。
Collection有两个重要的子接口,分别是ListSet接口。
image.png
image.png

Set

Set集合的特点:

无序:元素存入和取出的顺序无法保证一致性。
不重复:重复的元素不会被存入。
无索引:集合中没有索引,无法通过索引操作元素。

Set集合常用方法

image.png
注意:Set集合需要使用迭代器进行遍历。

迭代器、增强for循环

Iterator迭代器

lJDK中提供了一个Iterator接口,称为迭代器,可以实现单列集合元素的遍历。
lCollection接口中提供了iterator()方法,可以获取迭代器对象。

迭代器的方法

image.png

迭代器原理

image.png

并发修改异常

产生原因:
当使用迭代器或者增强for循环遍历集合时,在迭代过程中调用集合类自身的remove或者add等方法改变集合的元素个数时,就会产生ConcurrentModificationException,即并发修改异常。
image.png
解决办法:
1.使用普通for循环遍历元素,在循环中使用集合自带的add或remove方法增删元素即可。
2.如果使用迭代器遍历集合,在迭代过程中如果需要删除元素,可以使用迭代器自带的remove方法。

增强for循环

它是JDK5之后出现的,其内部原理是一个Iterator迭代器。
数组和Collection集合都可以使用增强for循环。
作用:简化迭代器遍历的语法。
image.png

增强for循环原理.

image.png
增强for使用注意:
需要遍历的集合或数组不能为null。
遍历过程中不能增删集合元素,否则会出现并发修改异常。

HashSet集合

HashSet特点

存储的元素是无序不重复的。
底层数据结构是哈希表,具有良好的存储和查找性能。
HashSet集合没有索引,只能通过迭代器或增强for循环遍历集合。

常用方法

image.png

HashSet的底层使用了哈希表存储元素。

哈希表

哈希表,也叫散列表,常用数组实现,元素根据哈希值计算在哈希表(数组)中的存储位置。
l如果元素出现哈希冲突(在哈希表中存储位置相同),则采用链表挂载元素。
哈希值
哈希值代表对象的某种特征,使用int整数表示。
lObject类中提供了hashCode( )方法,可以根据对象的内存地址计算出哈希值
lJava类可以重写hashCode方法,自定义哈希值的计算规则。

元素添加流程

  1. 先调用元素的hashCode()方法获取哈希值,确定存储位置。
    2. 如果存储位置为空,直接存入元素。
    3. 如果存储位置不为空,调用equals()方法和该位置的所有元素逐一比较,如果有返回true,表示要存入的元素已经存在,元素将不再重复添加。

image.png
结论:HashSet存储自定义对象时,需要重写对象的 hashCode 和 equals 方法。

案例

image.png

HashSet数组扩容(了解)

扩容机制

l哈希数组的初始长度默认是16。
l当存储的元素个数超过阈值时,数组会进行扩容。 (阈值 = 数组长度 扩容因子)
l默认的扩容因子是0.75,也就是当元素个数到达 16
0.75=12时,哈希表会进行扩容,每次扩容为原先的 2倍。
扩容的目的是为了降低哈希冲突,以便缩短链表的长度,提高元素比较和查找的性能

HashSet链表树化(了解)

image.png

LinkedHashSet(了解)

lLinkedHashSet继承了HashSet,底层在哈希表的基础上,又维护了一个双向链表。
l LinkedHashSet通过双向链表实现了元素的存取有序性

TreeSet集合

TreeSet集合特点

TreeSet是Set接口下的集合。
元素无索引,不重复。
TreeSet集合会自动对元素进行排序。

排序规则

元素为数字时,默认按照升序排序。(从小到大)
元素为字符串时,按照字符的编码值升序排序。
如果元素为自定义类型,需要指定排序规则。

TreeSet自然排序

TreeSet集合可以对实现Comparable接口的元素自动排序。
image.png

compareTo方法排序原理

如果返回值为负数,认为当前存入的元素是较小值,存左边。
如果返回值为正数,认为当前存入的元素是较大值,存右边。
如果返回值为0,认为两个元素一样,不存入集合。

TreeSet比较器排序

没有实现Comparable接口的元素,无法实现自动排序。
此时可以在TreeSet的构造方法中传入Comparator比较器,实现排序。

Comparator比较器排序:

l使用TreeSet的带参构造方法创建集合对象。
lTreeSet的构造方法必须接收Comparator的实现类对象,并重写compare(T o1, T o2)方法
lcompare方法的参数o1表示要添加的元素,o2表示集合中的元素,返回值规则如下。
如果返回值为负数,认为当前存入的元素是较小值,存左边。
如果返回值为正数,认为当前存入的元素是较大值,存右边。
如果返回值为0,认为两个元素一样,不存入集合。
image.png

两种比较方式小结

自然排序:自定义类实现Comparable接口,重写compareTo方法。
比较器排序:TreeSet带参构造方法传入Comparator的实现类对象,重写compare方法。
当两种排序规则同时出现时,TreeSet集合会使用比较器进行排序。

Set集合总结

Set接口下的元素都是无索引,不重复的。
HashSet:底层数据结构是哈希表,查询快,增删快。

LinkedHashSet:继承了HashSet集合,元素存取顺序一致。
TreeSet:底层结构是红黑树,可以对元素进行排序。