string

ttxshangxiaojun 2014-08-20 10:24:01
string a="h"
string b=a+"g"
string c="h"+"g"
system.out.println(b==c) 为什么为false???
...全文
413 23 打赏 收藏 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
情殇龙灵 2014-08-24
  • 打赏
  • 举报
回复 1
LZ要去看==与equals的区别了,一个是比较应用地址,一个是比较值的
chen870201 2014-08-22
  • 打赏
  • 举报
回复
比较实际内容用equals
huangyi_venus 2014-08-22
  • 打赏
  • 举报
回复
字符串b、c对象的地址不同,存放在不同的内存空间上,所以b!=c 比较内容相同的话可以用equals 新手一枚,看视频的时候学到这个的。。。答错了的话不要见怪
  • 打赏
  • 举报
回复
如果不是用new 出来的String,如果出现相同的String,会放到池中,对象+String会创建一个新的String对象。并放到池中,下一次再取一样的是从池中取,2个对象不是一个对象。一个是新建的,一个是池中的
  • 打赏
  • 举报
回复
直接给链接 http://blog.csdn.net/u012367513/article/details/38656909 有哪位大神发现错误,私信或引用我来告诉我,谢谢。
码上行动_Light 2014-08-22
  • 打赏
  • 举报
回复
引用 5 楼 gaofuqi 的回复:
b,c是两个不同的对象,主要是因为编译的优化处理:

String a="h"
String b=a+"g"                       //编译器会优化成: String b  = new StringBuilder(a).append("g").toString();,对象在堆中。
String c="h"+"g"                    //编译器会优化成:String c  = "hg";,对象在常量池中
System.out.println(b==c)      //结果为false

//如果对上面的例子还不能理解,看看下面的

final String a="h"
String b=a+"g"                       //编译器会优化成: String b  = "hg";,对象在常量池中
String c="h"+"g"                    //编译器会优化成:String c  = "hg";, 对象在常量池中
System.out.println(b==c)      //结果为true
从上面的例子,我们可以看到编译器对字符串“+”操作的优化处理,如下: 1.如果都是常量直接合并放在常量池中; 2.如果其中一个变量不是常量,则使用StringBuilder来进行拼接处理,由于对象是在运行时创建的,对象会在堆中分配内存;
这个最详细最明白,楼主可以结贴了。
yds27 2014-08-22
  • 打赏
  • 举报
回复
b与c的引用地址不一样; 所以“false” equals比较的是b与c的地址中内容是否一样。 结果为“true”
zhujuyu 2014-08-21
  • 打赏
  • 举报
回复
引用 14 楼 u014077165 的回复:
lz可以看下:http://blog.csdn.net/pzxwhc/article/details/38047651 顺便我也复习下: 1.首先在String a = "h" ,在常量池中创建一个对象,值为h。 2.string b=a+"g",由于a没有final和static修饰,所以,没有在编译的时候对b进行处理,属于动态绑定,不是静态。此时没有创建任何对象(在运行时创建),到时候b再得到一个引用,引用的对象值为a+"g",也就是hg。 3.string c="h"+"g",这句在常量池创建了2个对象,一个是值为g的对象,一个是值为hg的对象,因为常量池有了h,所以不是再创建值为h的对象,又因为值为h的对象属于静态绑定,所以这句也属于静态绑定。此时c返回一个引用,指向的是常量池中的对象hg 总结:为什么system.out.println(b==c) 为false,因为一个是指向常量池的hg,一个是动态编译时再生成的引用。不同,所以为false。
这个回答是我看过的最明白的一个了。。。
血饮 2014-08-21
  • 打赏
  • 举报
回复
引用 7 楼 skgary 的回复:
[quote=引用 6 楼 tengcong5210 的回复:] 比较经典的面试题呀,哦也一直迷糊中,。。。。。
用C语言的方式来理解,==比的是指针指向地址是不是一样,equals比较的是地址中内容是不是一样 java讲的是对像引用 。。。当作对像指针来理解好了。[/quote]关于equals和==区别可以理解,就上面那个问题的本质是 创建了几个String对象,这个比较费解。
deryow 2014-08-21
  • 打赏
  • 举报
回复
在Java中,String类是引用类型的,而“==”判断两个对象是不是同一个对象,在这里自然不是,因为b和c这两引用指向不同的对象。 如果要求两引用指向的内容是不是一样的,就得用equals()
LOVE-漂泊 2014-08-21
  • 打赏
  • 举报
回复
接分 求结贴 楼上各位已经回答你想的了
skgary 2014-08-21
  • 打赏
  • 举报
回复
引用 6 楼 tengcong5210 的回复:
比较经典的面试题呀,哦也一直迷糊中,。。。。。
用C语言的方式来理解,==比的是指针指向地址是不是一样,equals比较的是地址中内容是不是一样 java讲的是对像引用 。。。当作对像指针来理解好了。
血饮 2014-08-21
  • 打赏
  • 举报
回复
比较经典的面试题呀,哦也一直迷糊中,。。。。。
Sauron1 2014-08-21
  • 打赏
  • 举报
回复
lz可以看下:http://blog.csdn.net/pzxwhc/article/details/38047651 顺便我也复习下: 1.首先在String a = "h" ,在常量池中创建一个对象,值为h。 2.string b=a+"g",由于a没有final和static修饰,所以,没有在编译的时候对b进行处理,属于动态绑定,不是静态。此时没有创建任何对象(在运行时创建),到时候b再得到一个引用,引用的对象值为a+"g",也就是hg。 3.string c="h"+"g",这句在常量池创建了2个对象,一个是值为g的对象,一个是值为hg的对象,因为常量池有了h,所以不是再创建值为h的对象,又因为值为h的对象属于静态绑定,所以这句也属于静态绑定。此时c返回一个引用,指向的是常量池中的对象hg 总结:为什么system.out.println(b==c) 为false,因为一个是指向常量池的hg,一个是动态编译时再生成的引用。不同,所以为false。
gaofuqi 2014-08-21
  • 打赏
  • 举报
回复
b,c是两个不同的对象,主要是因为编译的优化处理:

String a="h"
String b=a+"g"                       //编译器会优化成: String b  = new StringBuilder(a).append("g").toString();,对象在堆中。
String c="h"+"g"                    //编译器会优化成:String c  = "hg";,对象在常量池中
System.out.println(b==c)      //结果为false

//如果对上面的例子还不能理解,看看下面的

final String a="h"
String b=a+"g"                       //编译器会优化成: String b  = "hg";,对象在常量池中
String c="h"+"g"                    //编译器会优化成:String c  = "hg";, 对象在常量池中
System.out.println(b==c)      //结果为true
从上面的例子,我们可以看到编译器对字符串“+”操作的优化处理,如下: 1.如果都是常量直接合并放在常量池中; 2.如果其中一个变量不是常量,则使用StringBuilder来进行拼接处理,由于对象是在运行时创建的,对象会在堆中分配内存;
skgary 2014-08-21
  • 打赏
  • 举报
回复
引用 楼主 ttxshangxiaojun 的回复:
string a="h" string b=a+"g" string c="h"+"g" system.out.println(b==c) 为什么为false???
因为b和c 是完全 不同的两个对像,所以是false 比较字符串的内容应该用 b.equals(c)来比较。
kiyoki 2014-08-21
  • 打赏
  • 举报
回复
最主要是 string b=a+"g" 这里要在运行期才知道变量a是什么鸟,那个时候才能生成字符串,新生成的字符串和系统已有的字符串怎么可能== 如果你的不是 string a="h" 而是 final String a ="h" 那么便已经就知道a是什么鸟,便一起就已经是和c一样的字符串,指向地址也一模一样 system.out.println(b==c) 又岂会是false?
wopabe 2014-08-21
  • 打赏
  • 举报
回复
b和c不是同一个引用,所以不是== 二者应该互相equals
qzw1210 2014-08-21
  • 打赏
  • 举报
回复

String b = a + "g"; //b由对象和“g”,此时b在堆中
String c="h"+"g";//c是由常量池中的“h”和“g”组成
skgary 2014-08-21
  • 打赏
  • 举报
回复
引用 10 楼 tengcong5210 的回复:
[quote=引用 7 楼 skgary 的回复:] [quote=引用 6 楼 tengcong5210 的回复:] 比较经典的面试题呀,哦也一直迷糊中,。。。。。
用C语言的方式来理解,==比的是指针指向地址是不是一样,equals比较的是地址中内容是不是一样 java讲的是对像引用 。。。当作对像指针来理解好了。[/quote]关于equals和==区别可以理解,就上面那个问题的本质是 创建了几个String对象,这个比较费解。[/quote] 其实在真的工作中,创建了几个String对像根本不重要。重要的是搞清了==和equals的区别。 编译的优化部分,你看一下5楼说的好了。
加载更多回复(2)

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧