1. 程式人生 > >學習筆記-JAVA-考點10-什麼情況下需要重寫equals和hashcode()兩個方法?

學習筆記-JAVA-考點10-什麼情況下需要重寫equals和hashcode()兩個方法?

一、什麼情況下需要重寫equals和hashcode()兩個方法?

1、加入到hashset中的自定義類的物件,為確保他們不重複,需要對他們的類重寫equals()和hashcode()的方法。

如果不重寫equals,相同內容不同引用的物件會被當做不同的物件被加入到hashset中。

重寫equals()的示例程式碼:

public boolean equals(Object obj){//這裡不可以寫成自定義型別自定義型別引用,這樣集
<span style="white-space:pre">				</span>  //合框架的底層不會呼叫這個過載的方法。
<span style="white-space:pre">	</span>if(!(obj instanceof Person)){
<span style="white-space:pre">		</span>return false;
<span style="white-space:pre">	</span>}
 
<span style="white-space:pre">	</span>Personp =(Person)obj;
 
<span style="white-space:pre">	</span>//用來檢視equals方法是否被呼叫
<span style="white-space:pre">	</span>sop(this.name +".......equals......."+ p.name);
<span style="white-space:pre">	</span>//認為名字相同並且年齡一樣大的兩個物件是一個
<span style="white-space:pre">	</span>return this.name.equals(p.name) && this.age == p.age;
}

測試結果:

【結論】迴圈迭代結果:a2::12被列印了兩次,說明重複的元素new Person("a2", 12)被新增到集合中去。沒有保證HashSet的唯一性。

同時equals沒有被呼叫,說明僅僅重寫equals方法沒起到作用

二、不是重寫equals就夠啦嗎,為什麼這裡還要重寫hashcode()?

答:hashset在儲存物件時,先判斷兩個物件的hash值是否一樣,只有在hashcode()相等的前提下equals()也相等,才認為兩個物件時同一個。

重寫hashcode的示例程式碼:

public int hashCode(){

sop(this.name +"......hashCode");

return this.name.hashCode() + 29*age;

}

三、ArrayList的機制又是怎樣的?

[1]. HashSet判斷、刪除和新增元素等操作依據的是被操作元素所在的類的hashCode()和equals( )這兩個方法。

[2]. ArrayList做同等的操作,依據的僅僅是equals( )方法

相關推薦

學習筆記-JAVA-考點10-什麼情況需要重寫equalshashcode()方法

一、什麼情況下需要重寫equals和hashcode()兩個方法? 1、加入到hashset中的自定義類的物件,為確保他們不重複,需要對他們的類重寫equals()和hashcode()的方法。 如果不重寫equals,相同內容不同引用的物件會被當做不同的物件被加入到has

web前端學習(二)html學習筆記部分(10)-- HTML5構建應用佈局頁面

1.2.25  HTML5構建應用佈局和頁面 1.2.25.1  HTML5在移動開發中的準則   1.儘量使用單頁面開發   2.慎重選擇前端UI框架   3.動畫、特效使用準則(60fps)     瀏覽器消耗最小的css屬性       位置  -&n

tornado學習筆記(三):子類需要重寫的RequestHandler的方法

問題 tornado.web.RequestHandler中哪些方法有必要在子類中重寫? 解決方案 參考tornado的原始碼,可以得到我們需要在子類中重寫的方法 示例 下面列出Req

MyBatis學習筆記(六)一對多的關聯查詢傳遞多引數

首發於我的部落格 和尚的部落格 本文講解一對多的關聯查詢,傳遞多個引數。 1.傳遞多個引數 當你的形參傳遞>1個的時候,parameterType不寫,讓其自動處理 #{值},預設為arg0,arg1…..或param1,param2,,,

java 重寫equalshashCode方法原則

根據《effective java》第七條之規定:在改寫equals的時候遵守通用約定     當符合以下條件時不需要重寫equals方法:    1.     一個類的每一個例項本質上都是唯一的。    2.     不關心一個類是否提供了“邏輯相等”的測試功能    3.

Ubuntu14.4怎麼安裝anaconda2anaconda3版本

參見了某個大佬的方法: 我之前安裝過anaconda2,但是由於做cs231n上面的程式碼需要3.5或者3.6,所以我就在官網上下載了新的版本的anaconda3,我們在官網下載的是sh檔案,我第一次直接在Ubuntu環境下執行這個命令,發現很多都出錯了,於是我就rm -

Java學習筆記(第10天)

表格是最常用的資料統計元件之一,是由多行和多列組成的二維表形式,在Swing中的JTable類實現表格。javax.swing.JTable類建立的物件是一個表格,可以使用以下兩種方式建立表格。(1)使用列名陣列的資料陣列建立表格,使用JTable類的構造方法可以根據指定的列

Java學習筆記】54:CentOS安裝MySQL的JDBC驅動並嘗試連線

準備工作 開啟MySQL服務 [root@hostlzh lzh]# mysqld_safe & [1] 21768 [root@hostlzh lzh]# 180209 12:55:11 mysqld_safe Logging to '/var

機器學習演算法在什麼情況需要歸一化?

機器學習模型被網際網路行業廣泛應用,一般做機器學習應用的時候大部分時間是花費在特徵處理上,其中很關鍵的一步就是對特徵資料進行歸一化,為什麼要歸一化呢?維基百科給出的解釋:1)歸一化後加快了梯度下降求最優解的速度;2)歸一化有可能提高精度。下面我簡單擴充套件解

java學習筆記——java中對象的創建,初始化,引用的解析

初始 學習筆記 style article 學習 base 表達 如果 bsp 如果有一個A類。 1、例如以下表達式: A a1 = new A(); 那麽A是類,a1是引用。new A()是對象。僅僅是a1這個引用指向了new A()這個對象。 2、又如: A

學習筆記--Java

ade layout erl har 從0到1 rec cas 時間 implement //輸入輸出Scanner in = new Scanner(System.in);int a = in.nextInt();int b = in.next();System.out.

【extjs6學習筆記】1.10 初始: 定義類

ria nbsp src clas -1 學習 ref 定義類 mage http://www.extjs-tutorial.com/extjs/define-new-class-in-extj

MongoDB Java 學習筆記 (Java操作MongoDB)

sdn 學習筆記 style god java 學習 筆記 b- 學習 .net 原文地址:http://blog.csdn.net/ererfei/article/details/50857103 參考文檔:http://www.runoob.com/mongodb/mo

Kafka學習筆記-Java簡單操作

interrupt new repl simple and cto seed blog false 轉自:http://www.cnblogs.com/edison2012/p/5759223.html Maven依賴包: <dependency>

Groovy學習筆記-Java 5新特性支持

analyze port static ring leg break main uniq size 1.枚舉enum enum CoffeeSize{ SHORT, SMALL, MEDIUM, LARGE, MUG

QT學習筆記(13) QT的UDP通信

組播 create pan int cor 通過 width widget window 一、UDP通信   UDP通信沒有明確的服務器端和客戶端之分   TCP通信像是打電話(必須要接通才能通信),UDP通信像是寫信(不管能不能收到都發送出去)   首先需要QUdpSOc

Docker學習筆記——Java及Tomcat Dockerfile

java tomcat dockerfile 1、Java Dockerfile創建項目目錄java,目錄下上傳所需java版本壓縮包,並創建Dockerfile文件,項目結構如下:java -Dockerfile -jdk-8u111-linux-x64.gzDockerfile內容:#

關系數據庫中,索引的作用主要有哪些,一般什麽情況需要建索引?並簡述索引都有哪幾種類型,有何區別

出了 分組 臨時 key 全文索引 兩個 關系數據庫 情況下 普通 提高查詢速度,有利於排序和分組. (排序和分組如用不上索引,則會產生臨時表和filesort的過程) 根據業務邏輯,分析列查詢的頻度和順序, 建立索引和復合索引. 主鍵索引(primary key), --

學習筆記--Java消息中間件

應用 true ons discover 方式 new 鏈路 消息同步 con #### 消息中間件 消息中間件:關註於數據的發送和接受,利用高效可靠的異步消息傳遞機制集成分布式系統 JMS:Java消息服務,Java平臺中關於面向消息中間件的API AMQP:提供統一消息

Linux學習筆記4月10日任務

mariadb apache wget tar 4月10日任務11.6 MariaDB安裝11.7/11.8/11.9 Apache安裝擴展apache dso https://yq.aliyun.com/articles/6298apache apxshttp://man.chinaunix