浅谈“==”与equals的关系

浅谈“==”与equals的关系

△概述:
“==”和equale()方法,是java里常用的判断相等的两个手段。

△栈内存与堆内存:
    想要将“==”说清楚,先要将变量的存储简单说说,Java内存划分很多部分,笼统的说,其中两块分别叫做栈内存以及堆内存:
  (1)对于基本数据类型,他们的值直接存放于栈内存里。比如:int a = 4;变量a代表栈内存里的一个地址,该地址就直接存放“4”。
  (2)对于“对象”型的数据,就是所谓引用数据类型,变量以及对象实体分开存放。比如:String str = new String("test");变量str代表了栈内存里面的一个地址,但是这个地址里面没有存放“test”,整个String对象实体都存放在堆内存里,然后,这个对象在堆内存里的地址被存放在栈内存里(这里存放于str所指示的地址里面)。就是,str指示了对象实体在堆内存里存放的位置。所以,对于引用数据类型,栈内存里保存的是对象实体在堆内存里的地址。



△关于“==”:

1,“==”比较两个变量栈中的值是否相同(不论他是基本数据类型还是引用数据类型),其中包括两层意思:

(1)对于基本数据类型,因为基本数据类型的值直接存在栈中,所以比较两个基本数据类型的“值”是不是相等。

(2)对于引用数据类型,引用数据类型在栈里面所保存的是其对象在堆内存的地址,所以,所比较的是两个引用是不是指向同个实例对象。

概括:基本数据类型比较其值是否相同,引用数据类型比较是否指向同个东西。

2,equals方法

  (1)Object中该方法其实就在使用“==”操作,本质一样,功能一样。他们是一样的功能来的。任何一个直接继承自Object的对象,他里面的equals()方法执行的就是“==”的功能。

  (2)很多情况下,其实我们想要得到的结果是两个对象内容是否相等,比如比较两个字符串,你更多的是想知道,他们内容是否相等,而不是是否指向了同个对象,其实Java里提供的绝大多数类库,都覆写了Object里的equals()方法,他的结果表达的是两个对象内容是否相等,而不再是是否指向同个对象。

    比如:String str1 = new String("str");

          String str2 = new String("str");

  System.out.println(str1.equals(str2));

  System.out.println(str1==str2);

    打印结果:true

              false

    现在你就可以明白,由于不是同个对象,所以第二行返回的是false,String覆写了Object的equals()方法,所以第一行打印的true。

  (3)另外我要说明一点,第一行之所以打印true,因为String覆写了equals()方法,这是Java替你做的,但是如果你自定义一个对象,equals()方法做的效果会和"=="是一样的,除非你自己去覆写equals()方法。否则,你对该对象的所有“==”操作以及equals()方法都会得到一个结果。  

3,总结:

(1)对于基本数据类型,使用“==”你将得到他们两个数值是否相等。对于引用数据类型(对象),你将得到他们两个是否指向同个对象。

(2)Object类里面的equals()方法,效果就是“==”效果,所有直接继承自Object类的类,他的equals()方法,都调用的“==”。

(3)对于类似String那样的类,调用equals()方法,你将得到两个对象内容是否相等。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值