1. 程式人生 > >為什麼一個好的類需要覆寫toString()、hashCode()、equals()方法

為什麼一個好的類需要覆寫toString()、hashCode()、equals()方法

第一:覆寫Object類中的toString方法
public class Client {  
     public static void main(String[] args) {  
        System.out.println(new Person("張三"));  
     }  
}  
 
class Person{  
     private String name;  
 
     public Person(String name){  
          this.name=name;  
     }      
} 

輸出的結果是:[email protected]

。如果機器不同,@後面的內容也不會相同,但是格式都是:類名[email protected]+hashCode。

這是給機器看的,不是給我們看的,原因是我們沒有覆寫Object類的toString()方法,覆寫之後就可以得到我們需要的輸出。

第二:覆寫Object類中的hashCode()、equals()方法

這種做法一般是為了增強自定義類的擴充套件性,尤其是當該類的物件要存入HashSet集合時,覆寫這兩個方法尤為重要。覆寫equals方法之後,可以實現物件的自定義比較,如果不覆寫此方法,預設呼叫Object的equals方法,等同於比較地址值。如果一個類不覆寫Object中的hashCode方法,而直接呼叫該方法,得到的雜湊值是由系統計算出的,返回值和物件屬性之間沒有直接聯絡。覆寫hashCode方法,可以根據物件屬性的不同,返回相應的雜湊值。


具體到HashSet集合中對這兩個方法的呼叫步驟,如下:
1)當向集合中存入一個元素時,會呼叫該元素的hashCode方法,得到該物件雜湊值,如果集合中已有元素的雜湊值和該元素的雜湊值不重複,該元素被存入集合。
2)如果要存入元素的雜湊值和已有元素的雜湊值相同,會進一步呼叫equals方法,比較這兩個元素是否相同,如果不同,該元素依然會被存入集合,如果相同,則認為這兩個元素相同,由於集HashSet集合中不能存入相同元素,所以儲存動作不會成功。
需要說明的是:覆寫這兩個方法並非必須。如果只是編寫一個用於測試的簡單類,完全沒有必要一定覆寫這兩個方法。只是一般開發中考慮到程式的擴充套件性,或者該類物件有可能被儲存到HashSet中,覆寫這兩個方法可以為以後程式的升級提供方便。當然,一個好的類,一般會覆寫Object中的equals方法、hashCode方法、toString方法等。

相關推薦

為什麼一個需要toStringhashCodeequals方法

第一:覆寫Object類中的toString方法public class Client { public static void main(String[] args) { System.out.println(new Person("張三"

ObjecttoString/equals/接收引用資料型別

什麼是Objetc類? Object是JAVA預設提供的類。 在Java中除了Object類,所有的類都有繼承關係,預設會繼承Object父類,所有類物件都可以通過Object類進行接收,即向上轉型。 ////Object可以接收任何類 class A{} class B{} publi

(1).Person有name,age,salary屬性,要求實現至少兩個構造方法,並且屬性私有,提供對應的gettersetter。 2).toString方法,要求在System.out.

/** (1).Person類有name,age,salary屬性,要求實現至少兩個構造方法,並且屬性私有,提供對應的getter、setter。2).覆寫toString方法,要求在System.out.println()函式中傳遞Person物件能打印出三個屬性值而不是物

Java—toString方法equals方法

要求: 1).Person類有name,age,salary屬性,要求實現至少兩個構造方法,並且屬性私有, 提供對應的getter、setter。 2).覆寫toString方法,要求在System.out.println()函式中傳遞Person物件 能打印出三個屬性值而不是物件地址。 3

Java 判斷自定義物件是否相等,需要equals()方法

public class Test { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { th

面試官讓你現場一個string,該哪個版本的?

之前的 文章中,我們詳細介紹過string類的深淺拷貝的實現以及引用計數,那麼如果,在面試過程中你該給面試官展示哪一種string類呢? 今天我們就來寫兩個適合面試中寫的string類 1,深拷貝 class MyString { public:

Struts2之動態方法呼叫優點:呼叫同一個action中的多個方法需要在配置檔案中多個指向相同action的的action節點只需要一個action節點就行

在表單action值裡指定所呼叫的action中的哪個方法而不是藉助配置檔案action節點的method屬性 1 UserAction類 package org.action; import java.io.IOException; import javax.servle

重復造輪子,編寫一個輕量級的異步日誌的實用工具LogAsyncWriter

tail arch read 屬性 .info ssa CA TP arp 一說到寫日誌,大家可能推薦一堆的開源日誌框架,如:Log4Net、NLog,這些日誌框架確實也不錯,比較強大也比較靈活,但也正因為又強大又靈活,導致我們使用他們時需要引用一些DLL,同時還要學習各種

【OC複合題】之定義一個學生需要有姓名,年齡,考試成績三個成員屬性,建立5個物件,屬性可以任意值。Objective-C

題目: 定義一個學生類,需要有姓名,年齡,考試成績三個成員屬性,建立5個物件,屬性可以任意值。(Objective-C) 1)    不使用@property,手動編寫他們的訪問器方法(getter和setter),注意記憶體管理(手動管理記憶體) 2)    增加一個便利

實驗報告:1合理定義一個三角形Triangle,成員屬性包括3條邊,能否構成三角形的標誌;成員方法包括構造方法、修改3條邊計算面積。 2)寫一測試,測試自定義三角形Triangle是否正

(1)合理定義一個三角形類Triangle,成員屬性包括3條邊,能否構成三角形的標誌;成員方法包括構造方法、修改3條邊、計算面積。(2)寫一測試類,測試自定義三角形類Triangle是否正確。class Triangle_D{ private double f_edge;

11.JAVA-Object之finalize(),clone(),toString()等方法

href this 都是 .html rac 回收 信息 ktr font 1.Object介紹 Object類是一個特殊的類,是所有類(包括數組,接口 )的父類,如果一個類沒有用extends明確指出繼承於某個類,那麽它默認繼承Object類,所以可以通過向上轉型的方法

用Python一個批量生成賬號的函數用戶控制數據長度數據條數

shuf open 小寫 長度 數據 ase 函數 用戶控制 app # 1、寫一個函數,批量生成一些註冊使用的賬號:[email protected]/* */,長度由用戶輸入,產生多少條也由用戶輸入,用戶名不能重復,用戶名必須由大寫字母、小寫字母、數字組成

不能繼承於QObject的就一定不能使用信號槽?一個代理進行發射就行了

-c 問題 ges object 編譯過程 報錯 第三方庫 nal 解決 首先不能繼承QObject的情況在開發中遇到得並不多,筆者在一年多的Qt項目開發中只遇到兩三次。而且都是因為引進了第三方庫導致編譯過程中報錯。 要想解決這個問題其實不難,因為筆者遇到的問題都是想定義

一個字符串string轉換成一個int

string_to_inint CommString::str_to_int(const std::string &str){ int ivalue = 0; sscanf(str.c_str(), "%d", &ivalue); return ivalue;}本文出自 “簡單可

Java集合框架上機練習題:編寫一個Book,該類至少有name和price兩個屬性。該類要實現Comparable接口,在接口的compareTo方法.....

ext .cn 數據庫 識別 方法 屬性 set package compareto 編寫一個Book類,該類至少有name和price兩個屬性。該類要實現Comparable接口,在接口的compareTo()方法中規定兩個Book類實例的大小關系為二者的price屬性的

的繼承定義一個computer在此基礎上派生出兩個子繼承與多態綁定

end 其中 調用 turn .get str 兩個 pac AR 題目如下 定義一個計算機類(Computer),並在它的基礎上派生出兩個子類:臺上機(Desktop)和便攜機類(Notebook),在Computer中定義幾個方法,並在子類Desktop和Noteboo

javascript控件一個用的表格分頁實例

etime rec 提示 pan table style sid search 計算 一、官網 https://datatables.net/ 二、引用 <script src="bower_components/datatables.net/js/jquery

最近一個項目需要使用vue,作為小白,記錄一下自己的學習歷程吧項目之環境配置

代理 切換 node tao 容易 分布式版本控制 sig 兩個文件 速度 一、環境準備 1.git 2.19.0(免費、開源的分布式版本控制系統)   下載地址:https://git-scm.com   查看git版本:安裝完成後,打開命令提示符輸入 git

已知長度為n的線性表A採用順序儲存結構,請一個時間複雜度為On空間複雜度為O1的演算法,該演算法可刪除線性表中所有值為item的資料元素。

語言:C++ #include <iostream> using namespace std; typedef int ElemType; //定義 #define MAXSIZE 100 typedef struct {ElemType *elem; int length;}Sq