问题描述
stringa="h"stringb=a+"g"stringc="h"+"g"system.out.println(b==c)为什么为false???
解决方案
解决方案二:
希望能解释一下底层的东西?
解决方案三:
字符串相等需要引用.equals(),==代表的是他们的引用地址。所以为false,当然,当你需要引用.equals()需要对它重新定义。
解决方案四:
最主要是stringb=a+"g"这里要在运行期才知道变量a是什么鸟,那个时候才能生成字符串,新生成的字符串和系统已有的字符串怎么可能==如果你的不是stringa="h"而是finalStringa="h"那么便已经就知道a是什么鸟,便一起就已经是和c一样的字符串,指向地址也一模一样system.out.println(b==c)又岂会是false?
解决方案五:
引用楼主ttxshangxiaojun的回复:
stringa="h"stringb=a+"g"stringc="h"+"g"system.out.println(b==c)为什么为false???
因为b和c是完全不同的两个对像,所以是false比较字符串的内容应该用b.equals(c)来比较。
解决方案六:
b,c是两个不同的对象,主要是因为编译的优化处理:Stringa="h"Stringb=a+"g"//编译器会优化成:Stringb=newStringBuilder(a).append("g").toString();,对象在堆中。Stringc="h"+"g"//编译器会优化成:Stringc="hg";,对象在常量池中System.out.println(b==c)//结果为false//如果对上面的例子还不能理解,看看下面的finalStringa="h"Stringb=a+"g"//编译器会优化成:Stringb="hg";,对象在常量池中Stringc="h"+"g"//编译器会优化成:Stringc="hg";,对象在常量池中System.out.println(b==c)//结果为true
从上面的例子,我们可以看到编译器对字符串“+”操作的优化处理,如下:1.如果都是常量直接合并放在常量池中;2.如果其中一个变量不是常量,则使用StringBuilder来进行拼接处理,由于对象是在运行时创建的,对象会在堆中分配内存;
解决方案七:
比较经典的面试题呀,哦也一直迷糊中,。。。。。
解决方案八:
引用6楼tengcong5210的回复:
比较经典的面试题呀,哦也一直迷糊中,。。。。。
用C语言的方式来理解,==比的是指针指向地址是不是一样,equals比较的是地址中内容是不是一样java讲的是对像引用。。。当作对像指针来理解好了。
解决方案九:
接分求结贴楼上各位已经回答你想的了
解决方案十:
在Java中,String类是引用类型的,而“==”判断两个对象是不是同一个对象,在这里自然不是,因为b和c这两引用指向不同的对象。如果要求两引用指向的内容是不是一样的,就得用equals()
解决方案十一:
引用7楼skgary的回复:
Quote: 引用6楼tengcong5210的回复:
比较经典的面试题呀,哦也一直迷糊中,。。。。。用C语言的方式来理解,==比的是指针指向地址是不是一样,equals比较的是地址中内容是不是一样java讲的是对像引用。。。当作对像指针来理解好了。
关于equals和==区别可以理解,就上面那个问题的本质是创建了几个String对象,这个比较费解。
解决方案十二:
引用10楼tengcong5210的回复:
Quote: 引用7楼skgary的回复:
Quote: 引用6楼tengcong5210的回复:
比较经典的面试题呀,哦也一直迷糊中,。。。。。用C语言的方式来理解,==比的是指针指向地址是不是一样,equals比较的是地址中内容是不是一样java讲的是对像引用。。。当作对像指针来理解好了。
关于equals和==区别可以理解,就上面那个问题的本质是创建了几个String对象,这个比较费解。
其实在真的工作中,创建了几个String对像根本不重要。重要的是搞清了==和equals的区别。编译的优化部分,你看一下5楼说的好了。
解决方案十三:
Stringb=a+"g";//b由对象和“g”,此时b在堆中Stringc="h"+"g";//c是由常量池中的“h”和“g”组成
解决方案十四:
b和c不是同一个引用,所以不是==二者应该互相equals
解决方案十五:
lz可以看下:顺便我也复习下:1.首先在Stringa="h",在常量池中创建一个对象,值为h。2.stringb=a+"g",由于a没有final和static修饰,所以,没有在编译的时候对b进行处理,属于动态绑定,不是静态。此时没有创建任何对象(在运行时创建),到时候b再得到一个引用,引用的对象值为a+"g",也就是hg。3.stringc="h"+"g",这句在常量池创建了2个对象,一个是值为g的对象,一个是值为hg的对象,因为常量池有了h,所以不是再创建值为h的对象,又因为值为h的对象属于静态绑定,所以这句也属于静态绑定。此时c返回一个引用,指向的是常量池中的对象hg总结:为什么system.out.println(b==c)为false,因为一个是指向常量池的hg,一个是动态编译时再生成的引用。不同,所以为false。
解决方案:
引用14楼u014077165的回复:
lz可以看下:顺便我也复习下:1.首先在Stringa="h",在常量池中创建一个对象,值为h。2.stringb=a+"g",由于a没有final和static修饰,所以,没有在编译的时候对b进行处理,属于动态绑定,不是静态。此时没有创建任何对象(在运行时创建),到时候b再得到一个引用,引用的对象值为a+"g",也就是hg。3.stringc="h"+"g",这句在常量池创建了2个对象,一个是值为g的对象,一个是值为hg的对象,因为常量池有了h,所以不是再创建值为h的对象,又因为值为h的对象属于静态绑定,所以这句也属于静态绑定。此时c返回一个引用,指向的是常量池中的对象hg总结:为什么system.out.println(b==c)为false,因为一个是指向常量池的hg,一个是动态编译时再生成的引用。不同,所以为false。
这个回答是我看过的最明白的一个了。。。
解决方案:
如果不是用new出来的String,如果出现相同的String,会放到池中,对象+String会创建一个新的String对象。并放到池中,下一次再取一样的是从池中取,2个对象不是一个对象。一个是新建的,一个是池中的
解决方案:
比较实际内容用equals
解决方案:
b与c的引用地址不一样;所以“false”equals比较的是b与c的地址中内容是否一样。结果为“true”
解决方案:
引用5楼gaofuqi的回复:
b,c是两个不同的对象,主要是因为编译的优化处理:Stringa="h"Stringb=a+"g"//编译器会优化成:Stringb=newStringBuilder(a).append("g").toString();,对象在堆中。Stringc="h"+"g"//编译器会优化成:Stringc="hg";,对象在常量池中System.out.println(b==c)//结果为false//如果对上面的例子还不能理解,看看下面的finalStringa="h"Stringb=a+"g"//编译器会优化成:Stringb="hg";,对象在常量池中Stringc="h"+"g"//编译器会优化成:Stringc="hg";,对象在常量池中System.out.println(b==c)//结果为true从上面的例子,我们可以看到编译器对字符串“+”操作的优化处理,如下:1.如果都是常量直接合并放在常量池中;2.如果其中一个变量不是常量,则使用StringBuilder来进行拼接处理,由于对象是在运行时创建的,对象会在堆中分配内存;
这个最详细最明白,楼主可以结贴了。
解决方案:
直接给链接有哪位大神发现错误,私信或引用我来告诉我,谢谢。
解决方案:
字符串b、c对象的地址不同,存放在不同的内存空间上,所以b!=c比较内容相同的话可以用equals新手一枚,看视频的时候学到这个的。。。答错了的话不要见怪
解决方案:
LZ要去看==与equals的区别了,一个是比较应用地址,一个是比较值的
解决方案:
该回复于2014-09-22 08:45:04被版主删除