集合中的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
{
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方法 ,此时比较的是两个对象的内容