一.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的帮助。