初学java可能会对equals、==和hashCode的理解不是太正确,导致不能很好地运用,甚至在程序中导致其他的错误,如判断得到的布尔值不是正确结果。这里再简单的理解一下,并通过代码验证一下。
[list]
[*]==号
引用数据类型:表示比较引用是否相等,也包括基本类型包装类和String类;
基本数据类型:比较值是否相等。例子:
[*]equals
一般类:也是比较对象引用是否相等;
基本类型包装类和String类:用来比较值是否相等(equals方法被重写实现值的比较,可查看String类java源码)
[*]hashCode
java中hashCode是按对象(引用)内存地址给出一个散列吗,所以同一个对象有相同散列码。
为什么equals重写后hashCode必须要重写?
equals重写后可能是按值比较,那么为了能够将对象正常装入散列表不被覆盖所以要重写hashCode方法。比如String和基本数据类型的包装类就是重写了hashCode方法,其hashCode方法是按值给出的散列吗,有可能会导致覆盖问题。所以当用到集合框架中的Set时一定要检查hashCode,因为Set集合必须保证值唯一。
[/list]
[list]
[*]==号
引用数据类型:表示比较引用是否相等,也包括基本类型包装类和String类;
基本数据类型:比较值是否相等。例子:
[*]equals
一般类:也是比较对象引用是否相等;
基本类型包装类和String类:用来比较值是否相等(equals方法被重写实现值的比较,可查看String类java源码)
[*]hashCode
java中hashCode是按对象(引用)内存地址给出一个散列吗,所以同一个对象有相同散列码。
为什么equals重写后hashCode必须要重写?
equals重写后可能是按值比较,那么为了能够将对象正常装入散列表不被覆盖所以要重写hashCode方法。比如String和基本数据类型的包装类就是重写了hashCode方法,其hashCode方法是按值给出的散列吗,有可能会导致覆盖问题。所以当用到集合框架中的Set时一定要检查hashCode,因为Set集合必须保证值唯一。
[/list]
public class TestInteger {
public static void main(String[] args) {
Integer t1 = new Integer(47);
Integer t2= new Integer(47);
int in1 = 2;
int in2 = 2;
System.out.println("in1==in2:" + (in1==in2)); //in1==in2:true 比较基本值
System.out.println("t1==t2:" + (t1==t2)); //t1==t2:false 比较引用,引用不同
String s1 = new String("47");
String s2 = new String("47");
System.out.println("s1==s2:" + (s1==s2)); //s1==s2:false 比较引用
}
}
public class TestEquals {
public static void main(String[] args) {
Equals t1 = new Equals();
Equals t2 = new Equals();
Equals t3 = t1;
System.out.println("t1.equals(t2):" + t1.equals(t2)); // false 不同引用
System.out.println("t1.equals(t3):" + t1.equals(t3)); // true 相同引用
System.out.println("t2.equals(t3):" + t2.equals(t3)); // false 不同引用
String s1 = new String("47");
String s2 = new String("47");
System.out.println("s1.equals(s2):" + s1.equals(s2)); // true 值比较
Integer e1 = new Integer("47");
Integer e2 = new Integer("47");
System.out.println("e1.equals(e2):" + e1.equals(e2)); // true 值比较
// 验证hashCode
System.out.println("t1 hashCode:" + t1.hashCode()); //t1和t3的hashCode相同,因为引用相同;
System.out.println("t2 hashCode:" + t2.hashCode());
System.out.println("t3 hashCode:" + t3.hashCode());
System.out.println("s1 hashCode:" + s1.hashCode()); //s1和s2hashCode相同,因为Stirng重写hashCode方法,按值计算
System.out.println("s2 hashCode:" + s2.hashCode());
System.out.println("e1 hashCode:" + e1.hashCode()); //e1和e2hashCode相同,因为Integer重写hashCode方法,按值计算
System.out.println("e2 hashCode:" + e2.hashCode());
}
}
class Equals {
public void sayHello() {
}
}