Java 集合的 Set 接口
Set类型与List类型的区别
Set: 无序、不可重复
List: 有序、可重复
1、HashSet
HashSet的存储结构:HashMap
特点:
HashSet通过比较存放的哈希码(hashCode)来确定对象存放的位置
当两个对象的哈希值相等时,HashSet通过对象的equals方法来判断两个对象是否相同,如果相同则丢弃该对象
由于判断元素是否存在的依据是hashCode和equals方法,所以我们在使用时通常重写类的这两个方法,来达到自定义对象比较规则的目的。
该比较只实现判断两个对象是否相同,从而达到存放不重复的效果,并无排序功能。
重写hashCode()和equals(Object obj)方法实现对象比较
/*** 重写hashCode方法*/@Overridepublic inthashCode() {returnID;
}/*** 重写equals方法,必须在执行hashCode方法得到相同哈希值之后才进入该方法*/@Overridepublic booleanequals(Object obj) {if (this ==obj)return true;if (obj == null)return false;if (getClass() !=obj.getClass())return false;
Student other=(Student) obj;if (ID !=other.ID)return false;return true;
}
习题:已知ArrayList集合s1, 现要实现将s1中重复的元素移除
方法1:
HashSet s2 = new HashSet(s1);
方法2:
HashSet s2 = new HashSet();
s2.addAll(s1);
方法3:
HashSet s2 = new HashSet();for(String string : s1) {
s2.add(string);
}
2、TreeSet
TreeSet使用元素的自然顺序对元素进行排序,或者根据创建set时提供的Comparator进行排序。
构造方法
构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。
Comparator super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序。该比较器为实现了Comparator接口的类的实体对象。
自然顺序的规则
TreeSet使用的元素的自然顺序由元素自己提供比较规则。
通常这个比较规则有两种实现方法:
元素对象实现Comparable接口,并实现接口的CompareTo方法
TreeSet在实例化的时候传入一个该元素对象的比较器,该比较器实现了Comparator接口,并实现接口的compare方法
实现Comparable接口:
public class Student implements Comparable{
…/*** 重写Comparable接口的compareTo方法,将o的name属性与本对象的name属性对比*/@Overridepublic intcompareTo(Student o) {returnname.compareTo(o.name);
}
}
传入比较器:
比较器类
public class MyComparator implements Comparator{
@Overridepublic intcompare(Student o1, Student o2) {return o1.getAge() -o2.getAge();
}
}
构造方法
HashSet stuList = new HashSet(new MyComparator());
练习:使用TreeSet对存储字符串并根据字符串长度排序
代码实现:
public static voidmain(String[] args) {//实例化TreeSet,并通过匿名类传入比较器
TreeSet tSet = new TreeSet(new Comparator() {
@Overridepublic intcompare(String o1, String o2) {return o2.length() -o1.length();
}
}
);
tSet.add("asd");
tSet.add("asd1");
tSet.add("asd111");
tSet.add("asd11");
System.out.println(tSet);
}
打印结果:
[asd111, asd11, asd1, asd]