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

来源:互联网 发布:长春java培训 编辑:程序博客网 时间:2024/06/04 20:09

转载自来源

平时学了很多的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;
     }
     
}
我都运行过的,大家也试试吧。。。


0 0