15.Set系列,可变参数、Collections

一.Set系列

1.1 Set系列集合特点

无序、不可重复、无索引。Set集合的功能基本上与Collection的API一致。

无序:存取顺序不一致。

不可重复:可以去除重复。

无索引:因为没有索引,所以没有带索引的方法、不能使用普通for循环遍历、也不能通过索引来获取元素。

1.2 Set集合实现类特点

HashSet:无序、不重复、无索引

LinkedHashSet:有序、不重复、无索引

TreeSet:排序、不重复、无索引

1.3 HashSet

1.3.1 特点

无序、不重复、无索引

1.3.2 优点

因为底层是哈希表,所以元素的增删改查性能都非常好。

1.3.3 在理解原理之前要知道的几个概念。

哈希值:是JDK根据对象的地址,按照某种规则算出来的int类型的数值。

Object的API:public int hashcode()方法用来返回对象的哈希值。

对象的哈希值特点:

1. 同一个对象多次调用hashcode方法返回的哈希值是相同的。

2. 默认情况下,不同对象的哈希值是不同的。

1.3.4 底层原理

HashSet的底层原理是哈希表。在JDK7之前哈希表=数组+链表,Jdk8之后哈希表=数组+链表+红黑树。

1.3.5 哈希表的形成过程/元素的存入过程(Jdk8的版本)

1. 创建一个默认长度为16的数组,数组名为table。

2. 把要存入的元素的地址计算成哈希值,再让哈希值对数组长度取余,将取余结果存入数组的相应位置。

3. 判断数组的当前位置是否为null,如果是null直接存入,如果位置不为null,代表这个位置有一个或多个元素,再调用equals方法比较其元素值,如果要存入的元素与这个位置的某一个元素重复,则不存,如果都不重复,则存入。存入后,如果这个位置的链表长度>8,则自动转换为红黑树,当链表长度小于6的时候自动转回链表。

4. 当数组存满到 16*0.75=12时,数组就自动扩容到原来的二倍,再把原来数组的元素复制到新数组。

1.3.6 注意事项

如果希望HashSet认为二个内容一样的对象是重复的,则需要让对象重写Object的equals和hashcode方法。

1.4 linkedHashSet

1.4.1 特点

有序、不重复、无索引

1.4.2 优点

因为底层也是哈希表,所以元素的增删改查性能都非常好。。

1.4.3 linkedHashSet的底层原理

底层数据结构依然是哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序。

1.5 TreeSet

1.5.1 特点

排序、不重复、无索引

1.5.2 优点

底层是红黑树,所以所以元素的增删改查性能都非常好。

1.5.3 底层原理

TreeSet的底层是红黑树。

1.5.4 注意事项

TreeSet集合是一定要排序的

1. 具有值特性的默认升序排序。

2. 对于字符串类型:默认按照首字符的编号升序排序。

3. 自定义类型要指定排序规则,有二种方法:

第一种:让自定义的类实现comparable接口,并重写接口里面的comparaTo方法定制比较规则。

第二种:在创建TreeSet集合对象时在构造器中通过匿名内部类创建一个比较器对象进行排序。

如果TreeSet集合存储的对象有实现比较规则,集合也自带比较器,默认使用集合自带的比较器排序。

二.可变参数

2.1 可变参数概述

可变参数用在形参中可以接收多个数据。

2.2 可变参数的格式

数据类型...参数名称

2.3 可变参数的作用

1. 接收参数非常灵活,方便。可以不接收参数,可以接收1个或多个参数,也可以接收一个数组。

2. 可变参数在方法内部实际上是一个数组。

三.Collections

3.1 什么是Collections

Collections不属于集合体系,而是用来操作集合的工具类。

3.2 Collections常用API

添加元素:

add(Collection<T> c, T element): 向集合中添加一个元素。
addAll(Collection<? super T> c, T... elements): 将一组元素添加到集合中。

删除元素:

remove(Collection<?> c, Object element): 从集合中移除指定的元素。
removeIf(Collection<E> c, Predicate<? super E> filter): 根据条件删除集合中的元素。

查找和判断:

contains(Collection<?> c, Object element): 判断集合中是否包含指定元素。
isEmpty(Collection<?> c): 判断集合是否为空。
size(Collection<?> c): 返回集合的大小。

排序和比较:

sort(List<T> list): 对列表进行排序。
reverse(List<?> list): 反转列表中的元素。
max(Collection<? extends T> coll): 返回集合中的最大元素。
min(Collection<? extends T> coll): 返回集合中的最小元素。

创建集合:

//创建一个包含单个元素的List类型的不可变集合,此集合无法再添加新元素
List<String> list = Collections.singletonList("element");
//创建一个包含单个元素的Set类型的不可变集合,此集合无法再添加新元素
Set<String> set = Collections.singleton("element");

其他:

synchronizedCollection(Collection<T> c): 返回一个线程安全的集合。
unmodifiableCollection(Collection<? extends T> c): 返回一个不可修改的集合。

为什么Collections只能对List系列的集合进行排序?

因为HashSet和LinkedHashSet的底层是哈希表,每一个元素的位置都是根据哈希值被唯一确定下来了,不能够再排序。TreSet本身就能进行排序,所以不需要Collections的帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真滴book理喻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值