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

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

==運算符在Java檢查內存地址中的作用

==運算符在Java檢查內存地址中的作用

米琪卡哇伊 2022-06-04 15:36:30
直到今天,我還相信具有相同哈希碼的兩個對象意味著它們都具有相同的內存位置。但下面的一段代碼完全講述了一個不同的故事:學生實體:公共類學生實現 Comparable {int id;int marks;String Subject;public int getId() {    return id;}public void setId(int id) {    this.id = id;}public int getMarks() {    return marks;}public void setMarks(int marks) {    this.marks = marks;}public String getSubjects() {    return Subject;}public void setSubject(String subject) {    Subject = subject;}public Student() {}public Student(int id, String subject, int marks) {    super();    this.id = id;    this.marks = marks;    Subject = subject;}@Overridepublic int compareTo(Student o) {    if (this.getId()>(o.getId()))    return 1;    if (this.getId()<(o.getId()))    return -1;    return 1;}    @Override    public int hashCode() {        final int prime = 31;        int result = 1;        result = prime * result + ((Subject == null) ? 0 : Subject.hashCode());        result = prime * result + id;        result = prime * result + marks;        return result;    }    @Override    public boolean equals(Object obj) {        if (this == obj)            return true;        if (obj == null)            return false;        if (getClass() != obj.getClass())            return false;        Student other = (Student) obj;        if (Subject == null) {            if (other.Subject != null)                return false;        } else if (!Subject.equals(other.Subject))            return false;        if (id != other.id)            return false;        if (marks != other.marks)            return false;        return true;    }}
查看完整描述

3 回答

?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

好吧,hashCode()總是返回內存地址并不完全正確。在您的特定情況下,您正在覆蓋該函數以基本上返回Subject引用的 hashCode。

您的評估顯示以下輸出:

stringops.Student@955a0720

這可能有點令人困惑,因為這實際上不是裸內存地址,而是對toString()對象方法的調用。

看看Java是如何實現的 toString

getClass().getName() + '@' + Integer.toHexString(hashCode())

所以,事實上,這兩個對象有不同的內存位置,但是因為你覆蓋hashCode()你不會看到它們。此外,沒有辦法覆蓋 Java 如何選擇對象的內存地址(可能除了一些 hack),但是,兩個對象不能具有相同的地址。

下次請包含更多文本而不是屏幕截圖,以提高其他人對您的問題的搜索能力。


查看完整回答
反對 回復 2022-06-04
?
Helenr

TA貢獻1780條經驗 獲得超4個贊

您剛剛正確地確定了兩個不同的對象——即不在同一內存地址的兩個對象——確實可以具有相同的哈希碼。規則是,如果兩個對象通過該.equals()方法相等,那么它們應該產生相同的哈希碼。除了這個和“不同的對象應該嘗試有不同的哈希碼”的一般想法之外,沒有要求不同位置的對象應該有不同的哈希值。

不過,這是一件好事。例如,String每個具有相同字符序列的兩個不同對象應該直觀地具有相同的哈希碼,以便HashMap<String, T>可以正確查找字符串。這樣,提供與String用作鍵的對象不同但具有相同邏輯值的對象將正常工作;所有String具有相同字符序列的 s 散列到同一個位置。


查看完整回答
反對 回復 2022-06-04
?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

hashcode 是一個 int 值,由 hascode() 方法返回。

Object.java 定義了 hascode() 并且每個 java 類都是 Object.java 的子類,因此每個類都繼承它。

如果他/她希望覆蓋它,則取決于特定類的開發人員。類的開發人員可能會選擇(盡管是一種不好的做法)為類的所有對象重新運行相同的常量 int 值。

通常 hascode 取決于對象的一個或多個屬性的值。即使開發人員可能會盡力返回唯一的哈希碼,但仍然(哈希碼沖突)兩個不同的對象最終可能會得到相同的哈希碼。

一次只能將一個內存位置分配給一個對象。

兩個不同對象的哈希碼(位于內存中的兩個不同地址)可能相同也可能不同

還有一個相關的概念:equals 和 hascode 方法的合同。它表示如果兩個對象通過調用 equals 返回 true,則兩個對象必須具有相同的哈希碼。請注意,這是定義的合同,但由開發人員開發類并編寫哈希碼方法以遵守合同。一個糟糕的實現可能會導致兩個對象返回不同的hascode,對于equals方法返回true。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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