亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果是lisi覆蓋zhangsan,或者輸出zhangsan忽略lisi。那調用的equals?

如果是lisi覆蓋zhangsan,或者輸出zhangsan忽略lisi。那調用的equals?

智慧大石 2022-05-01 14:10:21
我想問下HashSet類中的Set.add方法,如果add相同的兩個對象,是不是通過equals方法對比后,只在堆內存中生成一個對象?到底是覆蓋第一個還是忽略后面的那個呢?我做了個實驗,第一步:設定一個Student類,并且重寫了該類中的equals方法,返回值的boolean類型為true(因為我要查明是覆蓋還是忽略,所以讓他不管相同還是不相同都返回true)。第二部:生成HashSet類并向上轉型為Set,之后生成兩個不同對象并且使用Set.add()添加。具體代碼如下import java.util.Set;import java.util.HashSet;import java.util.Iterator;class Student{ String name ; int age; public Student() { } public Student(String name, int age) { this.name = name ; this.age = age ; } public boolean equals(Object o) { System.out.println("equals"); return true; } public static void main(String args []) { Set set = new HashSet(); Student s1 = new Student("zhangsan",20); Student s2 = new Student("lisi",21); System.out.println(s1.equals(s2)); set.add(s1); set.add(s2); Iterator it = set.iterator(); while(it.hasNext()) { Student s = (Student)it.next(); System.out.println(s.name); } }} 結果為:equalstruelisizhangsan 
查看完整描述

2 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

這個就要說一下所謂的散列的概念了。像Set,Map這種東東在判斷你的兩個對象是否是一樣的時候先回去判斷你的hashCode方法返回的值是否一致,如果一致再去判斷equals方法返回的值。所以,這個地方,你想玩的話,hashCode方法是需要重寫的啦,像這種hashCode和equals方法在重寫的時候有許多java規約性的東西。這里順便就說一下散列桶這個東西吧,在Set,Map這種容器里面存放對象數據的時候,這些數據以存在以hashCode為單位的散列桶里面的,hashCode相同的對象就會被放在同一個散列桶里面,在查找的時候會先定位到散列桶,然后再用equals方法去匹配散列桶里面的具體對象。所以,如果你定義的對象需要被存放在這類容器里面的話,hashCode和equals方法的重寫就需要好好考慮一下了,不然會非常影響效率的。

查看完整回答
反對 回復 2022-05-04
?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

import java.text.DateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class test {
static class Student {
String name;
int age;

public Student() {
}

public Student(String name, int age) {
this.name = name;
this.age = age;
}

public int hashCode(){
return 1000;
}
public boolean equals(Object o) {
return true;
}

public static void main(String args[]) {
Set set = new HashSet();
Student s1 = new Student("zhangsan", 20);
Student s2 = new Student("lisi", 21);
System.out.println(s1.equals(s2));
set.add(s1);
set.add(s2);
Iterator it = set.iterator();
while (it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s.name);
}
}
}

}

把代碼改了一下 這下運行一下你該明白了
運行結果是
true
zhangsan



查看完整回答
反對 回復 2022-05-04
  • 2 回答
  • 0 關注
  • 412 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號