单列集合
Collection 是 单列集合 的根接口。
Collection有两个重要的子接口,分别是List和Set接口。
Set
Set集合的特点:
无序:元素存入和取出的顺序无法保证一致性。
不重复:重复的元素不会被存入。
无索引:集合中没有索引,无法通过索引操作元素。
Set集合常用方法
迭代器、增强for循环
Iterator迭代器
lJDK中提供了一个Iterator接口,称为迭代器,可以实现单列集合元素的遍历。
lCollection接口中提供了iterator()方法,可以获取迭代器对象。
迭代器的方法
迭代器原理
并发修改异常
产生原因:
当使用迭代器或者增强for循环遍历集合时,在迭代过程中调用集合类自身的remove或者add等方法改变集合的元素个数时,就会产生ConcurrentModificationException,即并发修改异常。
解决办法:
1.使用普通for循环遍历元素,在循环中使用集合自带的add或remove方法增删元素即可。
2.如果使用迭代器遍历集合,在迭代过程中如果需要删除元素,可以使用迭代器自带的remove方法。
增强for循环
它是JDK5之后出现的,其内部原理是一个Iterator迭代器。
数组和Collection集合都可以使用增强for循环。
作用:简化迭代器遍历的语法。
增强for循环原理.
增强for使用注意:
需要遍历的集合或数组不能为null。
遍历过程中不能增删集合元素,否则会出现并发修改异常。
HashSet集合
HashSet特点
存储的元素是无序不重复的。
底层数据结构是哈希表,具有良好的存储和查找性能。
HashSet集合没有索引,只能通过迭代器或增强for循环遍历集合。
常用方法
哈希表
哈希表,也叫散列表,常用数组实现,元素根据哈希值计算在哈希表(数组)中的存储位置。
l如果元素出现哈希冲突(在哈希表中存储位置相同),则采用链表挂载元素。
哈希值
哈希值代表对象的某种特征,使用int整数表示。
lObject类中提供了hashCode( )方法,可以根据对象的内存地址计算出哈希值。
lJava类可以重写hashCode方法,自定义哈希值的计算规则。
元素添加流程
- 先调用元素的hashCode()方法获取哈希值,确定存储位置。
2. 如果存储位置为空,直接存入元素。
3. 如果存储位置不为空,调用equals()方法和该位置的所有元素逐一比较,如果有返回true,表示要存入的元素已经存在,元素将不再重复添加。
结论:HashSet存储自定义对象时,需要重写对象的 hashCode 和 equals 方法。
案例
HashSet数组扩容(了解)
扩容机制
l哈希数组的初始长度默认是16。
l当存储的元素个数超过阈值时,数组会进行扩容。 (阈值 = 数组长度 扩容因子)
l默认的扩容因子是0.75,也就是当元素个数到达 160.75=12时,哈希表会进行扩容,每次扩容为原先的 2倍。
扩容的目的是为了降低哈希冲突,以便缩短链表的长度,提高元素比较和查找的性能
HashSet链表树化(了解)
LinkedHashSet(了解)
lLinkedHashSet继承了HashSet,底层在哈希表的基础上,又维护了一个双向链表。
l LinkedHashSet通过双向链表实现了元素的存取有序性。
TreeSet集合
TreeSet集合特点
TreeSet是Set接口下的集合。
元素无索引,不重复。
TreeSet集合会自动对元素进行排序。
排序规则
元素为数字时,默认按照升序排序。(从小到大)
元素为字符串时,按照字符的编码值升序排序。
如果元素为自定义类型,需要指定排序规则。
TreeSet自然排序
TreeSet集合可以对实现Comparable接口的元素自动排序。
compareTo方法排序原理
如果返回值为负数,认为当前存入的元素是较小值,存左边。
如果返回值为正数,认为当前存入的元素是较大值,存右边。
如果返回值为0,认为两个元素一样,不存入集合。
TreeSet比较器排序
没有实现Comparable接口的元素,无法实现自动排序。
此时可以在TreeSet的构造方法中传入Comparator比较器,实现排序。
Comparator比较器排序:
l使用TreeSet的带参构造方法创建集合对象。
lTreeSet的构造方法必须接收Comparator的实现类对象,并重写compare(T o1, T o2)方法。
lcompare方法的参数o1表示要添加的元素,o2表示集合中的元素,返回值规则如下。
如果返回值为负数,认为当前存入的元素是较小值,存左边。
如果返回值为正数,认为当前存入的元素是较大值,存右边。
如果返回值为0,认为两个元素一样,不存入集合。
两种比较方式小结
自然排序:自定义类实现Comparable接口,重写compareTo方法。
比较器排序:TreeSet带参构造方法传入Comparator的实现类对象,重写compare方法。
当两种排序规则同时出现时,TreeSet集合会使用比较器进行排序。
Set集合总结
Set接口下的元素都是无索引,不重复的。
HashSet:底层数据结构是哈希表,查询快,增删快。
LinkedHashSet:继承了HashSet集合,元素存取顺序一致。
TreeSet:底层结构是红黑树,可以对元素进行排序。