91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HashSet中怎么重寫haseCode和equals

發布時間:2021-11-03 18:00:00 來源:億速云 閱讀:251 作者:iii 欄目:編程語言

這篇文章主要介紹“HashSet中怎么重寫haseCode和equals”,在日常操作中,相信很多人在HashSet中怎么重寫haseCode和equals問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”HashSet中怎么重寫haseCode和equals”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

為了保存數量不確定的數據,以及保存具有映射關系的數據,Java提供了集合類

集合中的Set,類似一個大罐子,可以依次把1至多個對象存入Set集合,Set集合通常無法記住元素的添加順序

而Set集合中不允許包含兩個相同的元素加入同一個Set集合中,在多個線程同時訪問同一個HashSet時,多個線程同時修改HashSet集合時,則必須通過代碼來保證其同步

那么HashSet是怎么樣區分不同元素的?這就要說到了hashCode和equals

在HashSet集合加了一個元素時,HashSet會調用該對象的hashCode方法來得到該對象的hashCode值,然后根據hashCode值決定該對象在HashSet中的位置,如果兩個元素通過equals方法比較返回true,但他們的hashCode方法返回值不相等,HashSet將會把他們存放在不同的位置,依然可以添加成功

也就是說HashSet辨別元素是否相同是通過equals判斷相等加上對比hashCode值

下面看一段代碼

class h
{
   public boolean equals( object obj)
{
        return true;
}
}
class z
{
   public int hashCode()
{
        return 1;
}
}
class t
{
   public int hashCode()
{
        return 2;
}
   public boolean equals( object obj)
{
        return true;
}
}
public class HashSetTest
{
  public static void main(String[] args)
  {
  var b=new HashSet();
  b.add(new h);
  b.add(new h);
  b.add(new z);
  b.add(new z);
  b.add(new t);
  b.add(new t);
  System.out.println(b);
  }
}

結果是:

h@5674dd,h@0987as,z@1,z@1,t@2

也就是說,

兩個h對象通過equals方法比較返回true,但HashSet依然把他們當做兩個對象

兩個z對象通過hashCode返回相同值,但HashSet依然把他們當做兩個對象

兩個t對象通過equals方法比較返回true,通過hashCode返回相同值,此時,HashSet才將他們當為一個對象

可見:當把一個對象放入HashSet中如果重寫equals就應該重寫hashCode

當equals對比兩個對象相等時,如果hashCode不同,則會將兩個相同的元素添加入HashSet,這就和Set集合的規則沖突了

此時,還有一種極端情況:如果hashCode相等,而equals不同,會怎么樣呢?

那么,將會更麻煩,HashSet試圖將他們放在一起,但是又不行

所以,將會采用鏈式結構,保存多個對象,進而影響性能,導致性能下降

到此,關于“HashSet中怎么重寫haseCode和equals”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

木兰县| 华坪县| 凌云县| 凤凰县| 渝北区| 漯河市| 石楼县| 卢龙县| 黄陵县| 甘洛县| 沁阳市| 稷山县| 渝中区| 福鼎市| 万山特区| 鹤庆县| 德化县| 西乡县| 鸡东县| 营山县| 保德县| 穆棱市| 无锡市| 玉山县| 晋江市| 扶沟县| 白玉县| 南江县| 濮阳县| 五莲县| 乌兰浩特市| 巨鹿县| 六安市| 达拉特旗| 教育| 黔西县| 吉安县| 成安县| 伊川县| 乡城县| 友谊县|