本文共 1676 字,大约阅读时间需要 5 分钟。
未覆盖:Object类中equals比较的是地址,等价于 “= =”,方法如下
public boolean equals(Object obj) { return (this == obj); }
覆盖:按覆盖规则来,例如String类
String重写了equals方法,地址相同直接返回,不同则比较具体值public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
String类同时有个常量池的内容,会对直接赋值的这些内容放入常量池
public class Test3 { public static void main(String[] args) { String a = new String("ab"); // a 为一个引用 String b = new String("ab"); // b为另一个引用,对象的内容一样 String aa = "ab"; // 放在常量池中 String bb = "ab"; // 从常量池中查找 if (aa == bb) // true System.out.println("aa==bb"); if (a == b) // false,非同一对象 System.out.println("a==b"); if (a.equals(b)) // true System.out.println("a equals b"); if (42 == 42.0) { // true System.out.println("true"); } }}
注:
public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b));}
转载地址:http://dlbjn.baihongyu.com/