java中equals和==的区别

       我们经常会遇到比较两个值或对象是否相等,那么你用了equals还是==呢,你是否清楚二者的区别呢?下面我们就一起了解一下java中二者的区别。

       首先明白两个概念,值类型的变量是存储在内存中的堆栈(简称栈);引用类型的变量在栈中仅存储引用类型变量的地址,而其本身则存储在堆中。

二者的区别:   

       == 操作比较的是两个变量的值是否相等,而对于引用类型变量则表示的是两个变量在堆中存储的地址是否相同,即比较栈中的内容是否相同。

       equals 操作表示的两个变量是否是对一个对象的引用,即堆中的内容是否相同。

       对于引用类型的变量,==比较的是2个对象的地址,而equals比较的是2个对象的内容。显然,当equals为true是,==不一定为true。下面看几个实例来加深一下理解:

1、String中的equals和==

       a)、看图1的代码及执行结果

        

       说明:分析得出s1与s2引用同一个String对象——“Monday”!

 

       b)、看图2的代码及执行结果(s2 用 new 操作符创建)

        

       说明:分析得出s1、 s2分别引用了两个"Monday"String对象

 

       c)、字符串缓冲池

       程序在运行的时候会创建一个字符串缓冲池,当使用s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的s1,将s2引用s1所引用的对象"Monday"。

       第二段程序中,使用了 new 操作符,他明白的告诉程序:“要创建一个新的,不要旧的!”于是就又创建了一个新的"Monday"Sting对象。

       虽然建在内存中,他们的值相同,但是位置却不同,同时也造成了资源的浪费,不能这样浪费呀,下面就想办法解决浪费的问题。

       d)、看图3的代码及执行结果(加入s2 = s2.intern();)

        

       说明:java.lang.String的intern()方法,s2.intern()返回值还是s2原来的值,表面上看起来好像没什么区别,但实际上,它会检查字符串缓冲池里是否存在s2的值,如果存在,就返回池里的字符串;如果不存在,该方法就会把s2的值添加到字符串池中,然后再返回它的引用。

       所以上面的代码执行后会出现两个都相等的结果

       建议:在用到new的时候进行这个操作:

       Strings2 = new String("Monday").intern();就可以用==比较两个字符串的值。

 

2、API里的类和自己写的类怎么使用equals和==

       API里的类大部分都重写了equals方法,没有重写的一般是自己写的类,如果是自己定义的一个类,比较自定义类用equals和==是一样的,都是比较句柄地址,因为自己定义的类是继承于object,而object中的equals就是用==来实现的,故而没有区别了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值