java中equals、==和hashCode理解

初学java可能会对equals、==和hashCode的理解不是太正确,导致不能很好地运用,甚至在程序中导致其他的错误,如判断得到的布尔值不是正确结果。这里再简单的理解一下,并通过代码验证一下。
[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() {

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值