您的位置:首页 > 编程语言 > Java开发

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

2017-01-17 10:06 507 查看
转载自来源

平时学了很多的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;

     }

     

}

我都运行过的,大家也试试吧。。。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: