import java.util.*;
import java.util.Collection;
import java.util.Iterator;
public class interate {
public static void main(String[] args) {
Collection c = new ArrayList();
String s1 = new String("asd");
c.add(s1);
String s2 = new String("dfg");
c.add(s2);
String x = new String("asd");
System.out.println(c.contains(x));
//此处会输出true
/*
实际上contains底层调用equals方法
所以判断集合内到底包含不包含,实际上是调用了equals方法,又因为他们都是String类型的
故虽然x和s1是两个不同的对象,但是二者的equals方法是true
二者都是String,String的equals方法已经重写,所以String的equals方法比较的是
内容,所以无论创建了几个对象,不管对象是否相同,只要内容是相同的
最后结果就是true,所以这里会输出true.
*/
}
}
类中没有重写equals:
import java.util.*;
public class CollectionsTest{
public static void main(String[] args){
Collections c1 = new ArrayList();
User u1 = new User("zhangsan");
c1.add(u1);
User u2 = new User("zhangsan");
//判断集合中是否包含u2
/*
同样比较集合中元素是否存在时,底层调用equals方法,比较的是两个User对象
而现在User没有重写equals方法,所以这里的equals方法一定会调用object中的
equals方法,而在Object中的equals方法直接比较二者的内存地址,所以地址不同
返回false.
*/
System.out.println(c1.contains(u2)); // 返回false
}
}
class User{
private User();
private User(String name);
}
类中重写equals:
import java.util.*;
public class CollectionsTest{
public static void main(String[] args){
Collections c1 = new ArrayList();
User u1 = new User("zhangsan");
c1.add(u1);
User u2 = new User("zhangsan");
System.out.println(c1.contains(u2)); // 返回true
}
}
class User{
private User();
private User(String name);
//以下代码重写equals:
public boolean equals(Object o){
if (o == null || !(o instanceof User)) return false;
if (o == this) return true; //如果对象相同,直接返回true
User u = (User)o; // 强制类型转换
if (u.name.equals(this.name)) return true; // 直接比较名字
return false;
}
}
结论: 存放在集合中的类型,要重写equals方法。
Integer类、String类的equals方法重写了
remove深入研究
remove的底层实质上也调用了equals方法,在删除元素之前也是需要调用equals方法的,所以重写equals方法很有必要。
如果不重写,同样会先调用Object中的equals方法,导致仅仅比较内存地址来判断两个元素是否相同。