一.Set接口的概述
-
Set接口是Collection的子接口,未额外提供自己的方法,即使用的方法为Collection中的方法
-
Set不允许包含相同的元素,即不可重复性
如果试加入两个相同元素,则加入失败
-
Set判断是否相等
不适用 == ,而是使用equals()方法
二.Set接口的实现类
-
HashSet 无序
-
LinkedHashSet
LinkedHashSet作为HashSet的子类,在添加数据时,每个数据还维护了两个引用,记录此数据的前一个数据和后一个数据
优点:
对于频繁的遍历操作,LinkedHashSet效率高于HashSet
-
TreeSet 有序
三.HashSet
-
作为Set接口的主要实现类
-
底层为数组和链表,也作为HashMap的单列
-
按照Hash算法存储集合中的元素,因此具有很好的存取,查找,删除性能
①特点:
-
不保证元素排列顺序
-
不是线程安全的
-
集合元素可为null
②HashSet集合判断元素是否相等,要求既快又安全
- 当我们使用equals()方法时是线程安全的,但当数据非常多时,需要一个一个进行比较,执行效率非常低;当我们使用hashCode()方法时,执行效率很高,但是线程不安全;所以需要结合equals()和hashCode()方法进行判断元素是否相等
- 通过hashCode()方法首先进行判断,之后使用equals()方法判断两元素内容是否相等
- 对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Object obj)方法,以实现对象相等规则,即"相等对象必有相等散列码"
四.TreeSet
-
可以按照对象的指定属性进行排序
-
必须实现Comparable或Comparator接口
-
底层结构为二叉树(红黑树),可实现自行旋转
1.向TreeSet中添加的数据,要求是相同类的对象,否则报错(ClassCastException)
Integer默认按照数字大小排序
String 默认按照字母顺序排序
2.两种排序方式:
自然排序和选择排序,即java比较器
①自然排序 : 实现Comparable接口
-
自然排序中,比较两个对象是否相同的标准为:
comparTo()返回0,不再是equals()
public int compareTo(Object o){
if (o instanceof User){
User user = (User)o;
return this.name.compareTo(user.name);
} else {
throw new RuntimeException("输入类型不匹配!");
}
}
②定制排序
-
使用comparator排序,比较两个对象是否相等的标准为:
compare()返回0,不再是equals()
Comparator com = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof User && o2 instanceof User){
User u1 = (User)o1;
User u2 = (User)o2;
return Integer.compare(u1.getAge(),u2.getAge());
}else {
throw new RuntimeException("输入类型不匹配");
}
}
}