现在的位置: 首页 > 综合 > 正文

java中==和equals问题

2014年02月18日 ⁄ 综合 ⁄ 共 2020字 ⁄ 字号 评论关闭

本文是在浏览论坛时发现很多这样的问题,因此在收集相关的基础上写成的。内容涉及内存存放问题、自动装箱和自动拆箱问题、==和equals问题。

(1)首先看下java中对象的内存存放问题。

代码如下:

=左面的对象都是存放在堆栈里作为对象引用,而后面的对象信息存放在哪里呢?

 

先看简单的:

String sa=”a string“;

这是一个比较经典的对象声明方法,其中,sa是指向"a string"对象的一个引用,"a string"是其引用对象的内容,其实,"a string"对象和sa对象均存放在堆栈里了。

这里需要强调一点,在JAVA的内存分配机制中,共有两中存储区域:堆栈和堆。其中堆栈存放程序过程,以及对象引用以及基本类型,以及这个古怪的对象String。

在堆栈中,JAVA为了能够让程序员轻松的操作字符串,设立了一个字符串容器--缓冲池。如上例中,当我们声明sa变量的时候,共分为以下几步:首先是由JVM到缓冲池中查找"a string",缓冲池是在每个线程初始化的时候初始的。如果找到了,那么将已存在的"a string"交给sa,如果没有找到,那么将"a string"存放入缓冲池中,并将它的地址付给sa,这样就完成了整个付值操作。

 

(2)自动装箱和自动拆箱问题

 

自java1.5以后有了这两个概念。

 

 

 

 

(3)==和equals问题

==比较的是引用对象的内存地址是否一致,而equals比较的仅仅是属于同一类的对象的属性值是否相等。

对于equals的理解还可以参考Java中Integer的equals()方法的源代码:

 

代码1:

 

另一代码:

 

 

在(1)(2)问题阐述后,相信问题(3)中的结果就不难理解了。如果还有什么不明白的可以留言讨论。

抱歉!评论已关闭.