Set<User> userSet = new HashSet<>(); User user1= new User("aa","11"); User user2= new User("aa","11"); userSet.add(user1); userSet.add(user2); System.out.println("set size"+userSet.size()); Iterator iterator = userSet.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next().toString()); }
創建兩個相同的對象 沒有重寫對象的equals方法和hashcode方法 默認使用object的。並且依次添加到set中,成功添加了兩個
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return Objects.equals(username, user.username) && Objects.equals(pwd, user.pwd); } @Override public int hashCode() { return Objects.hash(username, pwd); }
重寫方法之后只添加成功了一個對象 set的大小為1
如果只是重寫equals方法 不重寫hashcode方法 set中任然有兩個對象 並且hashcode不同,set集合區分兩個對象是否相同是使用hashcode值進行區分的。
Object類的equals方法 :比較兩個對象是否是同一個引用 java.lang.Object
public boolean equals(Object obj) { return (this == obj); }
關於equals方法和hashcode方法。
注:String類型的equals方法 只比較內容 不比較是否來引用同一個對象
public static void main(String[] args) { Set<User> userSet = new HashSet<>(); User user1= new User("aa","11"); User user2= new User("aa","11"); userSet.add(user1); userSet.add(user2); System.out.println("set size"+userSet.size()); Iterator iterator = userSet.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next().toString()); } System.out.println("equals?:"+user1.equals(user2)); System.out.println("user1:hashcode:"+user1.hashCode()); System.out.println("user2:hashcode:"+user2.hashCode()); } } class User{ String username; String pwd; public User(String username, String pwd) { this.username = username; this.pwd = pwd; } @Override public String toString() { return "User{" + "username='" + username + '\'' + ", pwd='" + pwd + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return Objects.equals(username, user.username) && Objects.equals(user.pwd,pwd); } }