在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 關于HashSet的方法contains比較值問題

關于HashSet的方法contains比較值問題

直接看代碼,為什么我直接添加一個String對象contains()返回的是true,添加一個Dog對象的時候就返回false,還有Set不是不能添加一個重復元素,為什么Dog對象可以添加兩個,String對象則不能


class Dog{

String color;
public Dog(String s){
    color = s;
}   

}

public class SetAndHashCode {

public static void main(String[] args) {
    HashSet<Dog> dogSet = new HashSet<Dog>();
    boolean resultq;
    dogSet.add(new Dog("we have white"));
    System.out.println("We have " + dogSet.size() + " white dogs!");
    resultq = dogSet.contains(new Dog("we have white"));
    System.out.println(resultq);
       
    HashSet<String> books = new HashSet<String>();    
    //添加一個字符串對象  
    books.add(new String("Struts2權威指南"));  
    books.add(new String("Struts2權威指南"));
    boolean result = books.contains(new String("Struts2權威指南")); 
    System.out.println("We have " + books.size() + " books!");         
    System.out.println(result);          
    //下面輸出看到集合只有一個元素  
    System.out.println(books);    
}

}
執(zhí)行結果是:
**We have 2 white dogs!
false
We have 1 books!
true
[Struts2權威指南]**

回答
編輯回答
眼雜

Set的特點是去重,key不能重復一定沒問題。有一個點,如果進入Set的key是String類型,看看Set都做了些什么,首先對key做了一個hash計算拿到一個hashCode值,Iterator keys做equals比較,如果返回true那么這個key就放不進去了,達到了去重的效果。如果進入Set的key是一個對象呢,都知道new一個對象,他們?nèi)绻嗟饶敲磆ashCode一定也相等,equals肯定也是true,可JVM不吃這套,定義了每個new出來的對象都是獨一無二的,這就導致了equals 返回false,那么Set可以放下Dog對象,因為你前后放入的是兩個Dog對象,而不是一個Dog類。希望可以幫到你,問題的地方,歡迎大神們拍磚指正!

2017年12月30日 15:19
編輯回答
陪我終

String對象重寫了equeals()和hashCode()方法。
String的hashCode的計算是根據(jù)String里面的char數(shù)組計算的,char[]數(shù)組一樣,那么hashCode一樣,對于HashSet來說就是同一個元素。
而對于普通對象來說,new一個就是一個與眾不同的,hashCode()與地址相關,始終保持不同

2017年8月1日 12:21
編輯回答
別硬撐

這個問題直接看源碼。contains源碼使用的是HashMap的getNdoe方法

圖片描述

判斷是否包含另一個對象要同時滿足hash相等和內(nèi)存中是否是同一個對象或者equals方法是否相等。
String對象已經(jīng)重寫了hashCode和equals方法,只要String的value相等,即返回的hashcode相等,equals返回true.
Dog對象沒有寫hashCode和equals方法,使用的是父類Object的方法,創(chuàng)建不同的對象的hashcode不同,equals返回false,所以不會滿足上圖源碼的if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))條件,所以可以使用color屬性重寫hashcode和equals方法,調(diào)用contains返回true

2018年3月8日 22:30