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; } }