假設我有員工類,具有正確覆蓋的等于和哈希碼方法。public class Employee {private int eno;private String firstName;private String lastName;@Overridepublic int hashCode() { System.out.println("hashcode called"); final int prime = 31; int result = 1; result = prime * result + eno; result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); result = prime * result + ((lastName == null) ? 0 : lastName.hashCode()); return result;}@Overridepublic boolean equals(Object obj) { System.out.println("equals called"); if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Employee other = (Employee) obj; if (eno != other.eno) return false; if (firstName == null) { if (other.firstName != null) return false; } else if (!firstName.equals(other.firstName)) return false; if (lastName == null) { if (other.lastName != null) return false; } else if (!lastName.equals(other.lastName)) return false; return true;}}測試類如下class Test { public static void main(String[] args) { Employee e1 = new Employee(1, "Karan", "Mehara"); Employee e2 = new Employee(2, "Rajesh", "Shukla"); Set<Employee> emps= new HashSet<>(); emps.add(e1); emps.add(e2); System.out.println(emps); // No such requirement just for testing purpose modifying e2.setEno(1); e2.setFirstName("Karan"); e2.setLastName("Mehara"); System.out.println(emps); emps.stream().distinct().forEach(System.out::println); }員工 [eno=1, 名字=Karan, lastName=Mehara]員工 [eno=1, 名字=Karan, lastName=Mehara]為什么 distinct() 方法返回重復的元素??根據雇員類的 equals() 和 hashcode() 方法,這兩個對象是相同的。我觀察到,當我調用 distinct() method equals() 和 hashcode() 方法時,它不會獲得對 Set 實現流的調用,但它會獲得對 List 實現流的調用。根據JavaDoc的說法,distinct()返回由該流的不同元素(根據Object.equals(Object))組成的流。
添加回答
舉報
0/150
提交
取消
