1、重点
Set集合(去掉重复元素,排序)
2、三个集合的特点
A、Set 不能出现重复元素、元素的输出无顺序
B、List 可以有重复元素、有顺序
C、Map 键值对的集合,Map的键是Set集合
3、判断两个对象是否是同一个对象,我们的判断标准是两个对象的各个属性值是否一样。
4、Set集合判断是否是重复元素时的两个依据
A)两个对象的哈希码是否相同
B)两个对象使用equals比较时是否为真
默认情况下,equals功能==是完全一样的,所以,为了让equals比较对象的属性值是否相等,必须重写equals方法。
5、equals方法的重写规则
A、考虑三种特殊的情况
比较的两个引用(this和obj)是否指向同一个对象
参数obj是否为null
参数obj和this是否是同一类型
B、考虑两对象的属性值是否相同
C、equals方法的代码实现
public boolean equals(Object obj) {
System.out.println("正在调用equals方法比较两个对象的属性是否相同");
//比较this和参数obj是否相等
//考虑三种特殊的情况
//比较的两个引用(this和obj)是否指向同一个对象
if(this == obj) return true;
//参数obj是否为null
if(obj == null) return false;
//参数obj和this是否是同一类型
if(!(obj instanceof Student)) return false;
//判断两个对象的所有属性值是否相同
Student anObject = (Student) obj;
if(this.sid == anObject.sid
&& this.name.equals(anObject.name)
&& this.birthday.equals(anObject.birthday)){
return true;
} else {
return false;
}
6、hashCode()方法重写
该方法是一个native方法,用于为对象产生一个哈希码。
7、自动生成hashCode()和equals()方法
8、TreeSet可以对Set集合中的元素进行排序
如果不排序,不能使用TreeSet,只能使用HashSet
9、排序规则
对集合中的元素进行排序,必须定义排序规则
比较对象的哪个属性?
返回的结果是大于0、等于0还是小于0?
而排序必须要涉及到属性的比较,对象的排序本质一就是属性的排序
只要是比较,就会产生三个结果:大于0、等于0、小于0
10、自然排序
集合元素的类型实现Comparable接口,并实现compareTo(Object obj)方法
比较的是this和obj的大小
示例:
public class Student implements Comparable<Student>{
@Override
public int compareTo(Student o) {
//比较this和o的关系
if(this.sid > o.sid)
return 1;
else if(this.sid == o.sid)
return 0;
else
return -1;
}
}
自然排序的缺点:只能允许一种排序方式
11、客户化排序
必须定义一个单独的排序类,排序类要实现Compartor接口,并实现compare(Object o1, Object o2),对o1和o2进行比较。
示例:
public class IDSorted implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
return o1.getSid() - o2.getSid();
}
}
使用排序类
IDSorted idSorted = new IDSorted();
Set<Student> set = new TreeSet<Student>(idSorted);
客户化排序更灵活,因为从设计的角度来说,客户化排序符合开-闭原则
小结:如果TreeSet的构造方法不带任何参数,则使用自然排序
如果TreeSet的构造方法中指定了排序类,则使用客户化排序
12、List的排序
Collections.sort(list, new IDSorted()); 对List进行客户化排序
Collections.sort(list); 对List进行自然排序
13、集合的交集、并集、差集
已知有两个集合:
Set<String> list1 = new HashSet<String>();
list1.add("aa");
list1.add("bb");
list1.add("cc");
Set<String> list2 = new HashSet<String>();
list2.add("cc");
list2.add("dd");
list2.add("ee");
并集
list1.addAll(list2);
for(String a : list1){
System.out.println(a);
}
交集
list1.retainAll(list2);
for(String a : list1){
System.out.println(a);
}
差集
list1.removeAll(list2);
for(String a : list1){
System.out.println(a);
}