Set接口的特点:不允许有重复的元素,没有索引值,不能使用普通for循环
一、HashSet集合
HashSet集合是一个无序集合,即存储元素和取出元素的顺序可能不一致,底层是一个哈希表结构
哈希值:是一个十进制整数,由系统给出,是一个逻辑地址
在Object类中有一个方法用来获取哈希值:int hashCode(); //返回该对象的哈希值
哈希表结构:数组+链表,将哈希值相同的元素放在一个数组位置,再使用链表或红黑树在此位置上把所有哈希值相同的元素连在一起
Set集合不允许存储重复元素的原理:
Set集合在调用add方法添加元素时,会调用hashCode方法和equals方法来判断元素是否重复,哈希值相同且equals方法返回true时,就不会把这个元素存入集合中
由此,HashSet存储自定义类型元素时必须重写hashCode方法和equals方法
二、LinkedHashSet集合
LinkedHashSet集合由哈希表和双向链表实现,双向链表用来存储元素的顺序,因此该集合具有可预知的迭代顺序,即输入和输出顺序相同
三、Collections集合工具类
Collections位于java.utils包下,用于集合的相关操作,部分方法如下:
上述四个方法均为静态方法,注意使用时用类名Collections调用
1.addAll方法
该方法参数列表中的T...elements代表可变参数,可变参数指的是该参数的类型已确定但个数不确定,一个方法的参数列表中只能有一个可变参数,当有多个参数时可变参数必须在最后一个位置
addAll方法能够向集合中添加任意个元素,关键就在于这个可变参数
2.shuffle方法
该方法参数列表中的List<?> list中的?代表泛型通配符,不知道是用什么类型数据接收时就可以使用泛型通配符,泛型通配符只能用来接受数据,不能用来存储数据
3.默认规则sort方法
将集合中元素按照默认规则排序,默认规则一般指升序
sort方法适用前提:被排序的集合里面存储的元素必须实现Comparable接口,重写其中的compareTo方法定义排序的规则
public int compareTo(类名 对象名){
return this.变量名-对象名.变量名; //升序排序,后者减前者则为倒序,0则为相等
}
4.有规则sort方法
按照Comparator指定的规则排序
代码举例:
Collections.sort(list,new Comparator(Integer){
public int compare(Integer o1,Integer o2){
return o1-o2; //升序
}
})