麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設計 > 正文

HashCode見解

2019-11-11 04:34:04
字體:
供稿:網(wǎng)友

很多人問復寫equals一定要復寫hashCode方法嗎?

我們在判斷對象是否相等的時候往往會用的equals方法,根據(jù)對象的某個值是否相同來決定對象是否相等,所以這里我們需要復寫equals方法。例如下面的代碼:

public class Persion { PRivate Integer id; private Integer age; private String name; @Override public boolean equals(Object obj) { if(this.getClass()==obj.getClass()){ return id.equals(((Persion)obj).id); } return false; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; }} public static void main(String[] args) { Persion p1 = new Persion(); p1.setId(1); p1.setAge(1); p1.setName("張三"); Persion p2 = new Persion(); p2.setId(1); p2.setAge(2); p2.setName("李四"); System.out.println(p1.equals(p2)); } //返回的是true

那么問題來了,既然equals可以實現(xiàn)功能我們?yōu)槭裁催€要復寫hascCode,接著往下看:

@Test public void testHashCode(){ HashMap<Persion, String> map1 = new HashMap<>(); Persion p1 = new Persion(); p1.setId(1); p1.setAge(1); p1.setName("張三"); map1.put(p1, "測試"); Persion p2 = new Persion(); p2.setId(1); p2.setAge(2); p2.setName("李四"); System.out.println(map1.containsKey(p2)); } //返回的是false

因為hashMap(或是hashSet)的containsKey方法涉及到了hashCode的操作,

public boolean containsKey(Object paramObject) { return getNode(hash(paramObject), paramObject) != null; } static final int hash(Object paramObject) { int i; return paramObject == null ? 0 : (i = paramObject.hashCode()) ^ i >>> 16; }

這里如果想返回true,必須equals與hashCode同時返回true才行。

我們復寫Persion的hashCode方法

@Override public int hashCode() { return id.hashCode(); }

再執(zhí)行測試用例就可以返回true.

總結(jié):理論上沒有涉及到hashCode的操作,我們復寫equals方法就可以,但是,java規(guī)范約定,如果重寫equals方法,那也要重寫hashCode方法,使equals為真的情況,hashCode的值也是相同的,所以我們在復寫的equals的時候盡量也復寫hashCode,保險一點。

補充:String與Integer的hashCode是根據(jù)他們包內(nèi)的值來計算生成的,如果兩個值相等則hashCode相等。

String a = "張三"; String b = "張三"; System.out.println(a.hashCode()==b.hashCode()); Integer c =1; Integer d =1; System.out.println(c.hashCode()==d.hashCode());
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 免费观看视频91 | 成年人黄色片视频 | chinesexxxx极品少妇 | 欧美性生交zzzzzxxxxx | 午夜网站视频 | 国产激情视频在线 | 一道本不卡一区 | 一道本不卡一区 | 欧美日韩一区,二区,三区,久久精品 | 精品久久久久久久久久久下田 | 亚洲91精品 | 久久资源总站 | 狠狠婷婷综合久久久久久妖精 | 精品一区在线视频 | 热@国产 | 久久久www视频 | fc2国产成人免费视频 | 国产午夜免费视频 | 免费国产视频大全入口 | 国产亚洲美女精品久久久2020 | 欧美成人一区免费视频 | 欧美一级小视频 | 国产精品免费麻豆入口 | 国产精品久久久久久久久久iiiii | 亚洲国产视频在线 | 国产精品99久久久久久大便 | 久色porn| 在线播放免费av | 久久人人爽人人爽人人片av免费 | 黄色影院av| 国产午夜精品一区 | 国产精品麻豆一区二区三区 | 美女毛片在线观看 | 亚洲欧美日韩中文在线 | 国产精品久久久久久久久久久天堂 | www.国产.com| 久久国产精品影视 | 亚洲视频黄 | 久久免费精品 | 成人三级电影网址 | 美女黄页网站免费进入 |