java中==和equals的区别

  在初期学习java时,肯定会遇到==和equals的区别这一知识点,其实很简单,一句话:equals:比较字面值;==:不止比较字面值,还比较对象的内存地址。

先来一段代码:

@Test
public void test(){
    String str1="abc";
    String str2="abc";
    System.out.println(str1==str2);
    System.out.println(str1.equals(str2));
    //结果都为true,因为str1创建时在堆中开辟了一块新的内存,存储abc,str则保存在栈中,而str2在创建时,由于abc已经
    //存在,所以直接把内存地址给str2,而没有重新开辟新的内存地址,所以,打印结果都是true
    String str3=new String("def");
   String str4=new String("def");
   System.out.println(str3==str4);
   System.out.println(str3.equals(str4));
   //==打印的是false,equals打印的是true,因为new String 不管之前的内容是否在内存中已经存在
   //在新定义时,都会重新开辟一块内存来存储这块内容,从而str3和str4的内存地址是不同的。
  
}

追一下源码:

从new String()的源码可以看出,new String()会更改hash值,因为重新new出来的对象是会在堆中开辟内存来存储新对象的,内存地址不同,==所返回的值肯定是不同的。

另外,String重写了hashCode方法和equals方法;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值