集合中的contains方法怎么去实现,以及怎么重写对象的equals方法?

//创建一个ArrayList集合      ArrayList集合继承List接口,值可重复,有序

ArrayList arrayList=new ArrayList();

arrayList.add("dog");
arrayList.add("dog");

arrayList.add("dog");

                   arrayList.add("cat");

//打印集合中元素个数

System.out.println(arrayList.size());    //输出4

//查找集合中是否有dog这个元素  contains方法返回一个布尔类型   true或false

            boolean a=arrayList.contains("cat");

        System.out.println(a);//返回结果为true


在这里 contains 方法  默认调用Object类里的equals方法,判断两个值是否相等


但是如果这样写:new Animal("dog",2);  这是Animal类的一个匿名对象



但是结果显然跟我们预想的不一样,

这是因为在这里 contains 方法  默认调用Object类里的equals方法,判断两个值是否相等,而Object类里的equals方法它是用==来进行判断的,我们添加了两个匿名对象,比较的时候,又创建一个匿名对象,作为对象2,   比较的时候,对象1(集合里的任意一个匿名对象)和对象2,两个对象的地址值是不相等的,所以打印false,而我们认为对象1和对象2里面的内容是相等的,这时候如果我们想比较两个对象内容相等让它返回true,就需要重写Object类的equals方法

  在Animale类中重写方法如下:

public boolean equals(Object obj)

            //如果传入的对象和当前对象一样,直接返回true

if(this ==obj)
{
return true;

}

        //如果传入的对象可以强转为Animal的对象就强转为Animal

        //返回   如果传入的对象的名字和当前对象的名字相同并且  年龄也相同  就返回true

        //前两个如果都不符合就返回 false

if(obj instanceof Animal)
{
Animal animal=(Animal)obj;
return this.name.equals(animal.getName())&&this.age==animal.getAge();
}
return false;

}

测试类测试:




此时比较两个对象时调用的是Animal类中的equals方法

//  arrayList.get(0)获取集合中下标为0的元素   用一个匿名对象和集合中下标为0的元素 进行比较打印结果为true

System.out.println(new Animal("dog",2).equals(arrayList.get(0)));




相同的,直接比较两个对象的结果是一样的,当用==去比较的时候返回直接false此时比较的是两个对象的地址值, 当调用equals方法时,返回为true,我们在Animal类中重写了equals方法 ,此时比较的是两个对象的内容


猜你喜欢

转载自blog.csdn.net/yuanboqi/article/details/79753507