java中HashSet的add的使用,以及equals和hashcode的重寫

    平時學了很多的java知識,但是發現自己經常忘記好多的知識點,我以我打算一邊學習一邊寫博客,其實整個寫博客的過程也是我自己鞏固學習,熟悉理解的過程,希望熱心的朋友多多給我指出錯誤啊。在此也感謝張龍老師的慷慨分享。

              這次講解一下HashSet中add方法的使用以及許多注意的地方,首先大家知道數據結構分爲線性結構和非線性結構,前面講的ArrayList是線性結構的順序表示法,LinkedList是線性結構的鏈式表示法,今天講的hashset是非線性結構的。

   首先:

        HashSet hashSet = new HashSet();
        hashSet.add("zhangsan");
        hashSet.add("lisi");

        System.out.println(hashSet);

這樣打印出來的值並不一定是按順序出來的,因爲它並不像ArrayList那樣在內部是有序存放的;

另外,它存放之前會判斷之前HashSet裏面是否已經存在統一數值,如果有則不會繼續存。

看這樣的例子:

public class HashSetTest
{
    public static void main(String[] args)
    {
        HashSet hashSet = new HashSet();
        hashSet.add(new Persion("zhangran"));
        hashSet.add(new Persion("zhangran"));
        System.out.println(hashSet);
        System.out.println("以上爲第一部分----------------");
        Persion p1=new Persion("zhangran");
        hashSet.add(p1);
        hashSet.add(p1);
        System.out.println(hashSet);
        System.out.println("下面來的爲第三部分------------");
        String s1 = new String("aa");
        String s2 = new String("aa");
        hashSet.add(s1);
        hashSet.add(s2);
        System.out.println(hashSet);
        
    }
}
class Persion
{
    String name;
    Persion(String name)
    {
        this.name=name;
    }
}

大家可以猜猜那些會真正的加入到hashset當中去

答案是:第一部分加進去兩個,第二部分跟第三部分加進去了一個。

講解:使用add方法是,首先會判斷對象是否是相同的如果是相同的一定不會繼續往裏面加,就像第二部分,如果對象是不同的,例如第一部分是new出來的兩個對象,它加了進去,第三部分是new出來的兩個對象,但是他就沒加進去。所以得再進一步區分。其實判斷對象是否相同並不是一眼就能看出來的,而是通過內部定義好了的equals方法來判斷的,而用equals方法又是根據對象的hashCode來判斷的。比如第一部分,Persion類是Object的子類繼承了Object的equals和hashcode方法,而在Object類當中它的不同的實例中的hashcode是不同的,這是Object中本來就定義好了的hashcode();所以繼承它的類也都有這樣的方法,所以第一部分通過equals之後Persion的兩個實例是不相同的,但是String類重寫了hashcode方法,使得String實例化出來的對象的hashcode()都是相同的,所以第三部分就得再進一步判斷它的具體的數值,結果它的具體數值是相同的所以插不進去。大家可以把上面的代碼自己運行一下。

   下面咱們自己重寫一下,hashcode()以及equals方法,實現:無所謂是不是相同的對象,只根據對對象具體的數值是否相同來進行add的增加

    public class HashSet2
{
    public static void main(String[] args)
    {
        HashSet hashSet = new HashSet();
        People p1 = new People("zhangsan");
        People p2 = new People("lisi");
        hashSet.add(p1);
        hashSet.add(p2);
        System.out.println(hashSet);
    }
}
class People
{
     String name;
     People(String name)
    {
        this.name=name;
    }
     public int hashCode()
     {
         return this.name.hashCode();
     }
     public boolean equals(Object obj)
     {    
         if(this==obj)
         {
             return true;
         }
         if(obj!=null&&obj instanceof People)
         {
             People p = (People)obj;
             if(name.equals(p.name))
             {
                 return true;
             }
         }
         return false;
     }
    
}
我都運行過的,大家也試試吧。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章