1.Main1.java
import java.util.HashSet;
import java.util.Set;
public class Main1 {
/**
* 1 : Set
* 1.完全集成Collection的方法,没有自己新增的方法
* 2.元素不能重复,允许有一个null
* 3.Set是无序的,不会按照添加的顺序去排序
* 4.关于判断每个对象元素是否相等,使用的是equals方法,每加入一个元素,就遍历一遍集合
* 两个User对象user1(1,"小明")和user2(1,"小明")因为就算属性都相同,内存地址也不相同,但是equals调用的方法是比较内存地址
* 因此如果想人为修改判断条件让user1和user2相同,需要重写父类的equals方法
* 但是因为add源码追踪看到还有hashcode的比较,因此还有重写hashcode方法
*
* */
public static void main(String[] args) {
/**
* 1.创建一个HashSet的集合
* */
Set<String> set=new HashSet<String>();
set.add("赵1");
set.add("赵2");
set.add("赵3");
set.add("赵1"); // 重复元素会被剔除
set.add(null); // 允许null值
set.add(null); // 允许null值
System.out.println(set); // [null, 赵2, 赵1, 赵3]
/**
* 2.判断对象是否重复
* */
Set<User> s2=new HashSet<User>();
s2.add(new User(1,"小明"));
s2.add(new User(2,"小红"));
s2.add(new User(1,"小明"));
/* System.out.println(s2);
* 单独重写 equals 让然是有重复的
* [User [id=1, name=小明], User [id=1, name=小明], User [id=2, name=小红]]
* */
System.out.println(s2);
/*
* 重写 equals + hashCode 方法后,就可以去除重复对象了
* [User [id=1, name=小明], User [id=2, name=小红]]
* */
}
}
2.User.java
public class User {
private int id;
private String name;
// 1.传一个带参数的构造法方法
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 2.重写toString方法
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
// 3.重写equals方法
@Override
public boolean equals(Object obj) {
// 3.1先判断传入的obj是否是User类型
if(!(obj instanceof User)) {
return false;
}else {
// 3.2父类强转换为子类,因为父类不能使用子类特有的属性和方法
User user=(User) obj;
if(id==user.id &&
name!=null && user.name!=null &&
name.equals(user.name)) {
return true;
}else {
return false;
}
}
}
// 4.因为重写equals方法,同步的要修改hashCode方法
@Override
public int hashCode() {
return 1;
}
}
转载于:https://blog.51cto.com/13634837/2086972