当前位置: 代码迷 >> J2SE >> Integer和字符串有关问题
  详细解决方案

Integer和字符串有关问题

热度:210   发布时间:2016-04-23 19:48:41.0
Integer和字符串问题

上面是题目,下面是答案

为什么跟我的判断完全相反,两个一样的字符串用==比较不应该是false吗?
谁能帮我解答一下啊?
------解决思路----------------------
Integer是类,new了在堆中都开辟了独立内存,所以false。这个不同基础数据类型int,如果是int的话就是true。
你的两个String都没new,当字符串常量都存栈中,所有==返回true。

==如果常量对比,就是比较值是否相同,如果比较对象,则比较栈中的堆的地址是否相同。这是我个人理解、

------解决思路----------------------
如果String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内。

如果String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。
------解决思路----------------------
去看下java虚拟机规范吧,特别是关于常量池那部分
------解决思路----------------------
引用:
Quote: 引用:

Integer是类,new了在堆中都开辟了独立内存,所以false。这个不同基础数据类型int,如果是int的话就是true。
你的两个String都没new,当字符串常量都存栈中,所有==返回true。

==如果常量对比,就是比较值是否相同,如果比较对象,则比较栈中的堆的地址是否相同。这是我个人理解、


那为什么这两个比较又是true呢???


int int1=new Integer(47) ;这里因为前面需要的是一个int 基础类型值,所以会对Integer(47)做一次拆箱
所以等同于 int int1 = unboxing(new Integer(47)) ,等同于 int int1 = 47
int1 == new Integer(47) 这里,因为基础类型不能和对象直接比较,但是编译器 发现Integer能够进行拆箱
所以等同于 int1 == unboxing(new Integer(47) ,等同于 int1 == 47
------解决思路----------------------
Integer xx=new Integer(xxxx),是创建一个对象,用==比较两个Integer是比较对象存储的地址,肯定不一样。
如果用equals就是比较对象的值,这时结果才是true。
字符串是特殊的对象类型。创建一个字符串String s="aa";
当再来一个String s2="aa";系统会检测有没有"aa"这个值,如果有就把s2指向已经存在的“aa”;
如果没有才创建
  相关解决方案