A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String s1 = "a";
String s2 = "b";
String s3 = "ab";
sop(s1+s2)//ab
sop(s3)//ab
sop(s3 == s1+s2)//false这里为什么是false
sop(s3 =="a"+"b")//true

22 个回复

倒序浏览
String是引用数据类型吧,但也还是搞不清问题所在,同求解
回复 使用道具 举报
例如
String s = “a”
a是在堆内存的对象,s只是指向a的地址空间,
所以s1+s2不知道会指向哪里
第二个,就是简单的字符串连接
回复 使用道具 举报
==在引用数据类型比较是的地址值
回复 使用道具 举报
我也有点疑问,我也知道==比较的是地址值,所以s3==s1+s2我false,但是为什么s3=“a”+”b“是true?指向哪里呢???????(我的疑惑好像很楼主刚好相反)
回复 使用道具 举报
本帖最后由 CLTDEZHUCE 于 2015-7-16 20:59 编辑

sop(s3 == s1+s2)//false这里为什么是false,比的是地址,s1+s2指向的是地址值

sop(s3 =="a"+"b")//true   s3指向的是常量池,"a"+"b"指向的也是常量池。//不保证答案正确
回复 使用道具 举报
s1,s2单独指向也是常量池,加起来链接后指向地址值。//不保证答案正确
回复 使用道具 举报
因为字符串是个特殊的变量,他一旦被赋值就不会再变化。所以当你把s1,s2赋完值后,他们在内存中都有自己的地址值。s1+s2和“a”+“b”表达的不是一个意思。
回复 使用道具 举报
Java中每个字符串都是一个String类的匿名对象,属于引用类型,这里比较的是地址值,每个实例化的对象地址值是不一样的。
回复 使用道具 举报
小p 中级黑马 2015-7-16 23:04:37
10#
并没有看懂
回复 使用道具 举报
其实s3表示一个对象,写法:String s3=new String("ab");
回复 使用道具 举报
可是我并没有看懂
回复 使用道具 举报
内存常量区,自己可以理解一下,,,,,
回复 使用道具 举报
自古人才出二楼
回复 使用道具 举报
_Rain 来自手机 中级黑马 2015-7-17 02:06:27
15#
首先要知道这里的字符都是String类对象,引用类型。==是比较两个对象的地址值。s1+s2中的加号是连接符。s3输出的是该对象,而不是该对象的地址值是因为在引用类型中输出都有个默认的toString()方法。s3==s1+s2出现错误是因为这两个对象的地址值不同。s3=="a"+"b"右边连接起来是ab字符串。再看下String s3="ab";java中有堆内存,栈内存还有方法区,方法区中有常量池,s3首先会在常量池中去找有没有ab,如果没有则会自动的创建ab。"a"+"b"又为ab,系统为了优化内存,所以这两个ab是同一个。你可以去看看内存介绍
回复 使用道具 举报 1 0
字符串相加先拼接再赋给内存值,有了不创建
变量则是先创建再赋值
回复 使用道具 举报
本帖最后由 fantianfei 于 2015-7-17 09:02 编辑

sop(s3 == s1+s2)这里s1和s2应该打括号 因为这里s3是一个对象 而s2和s3是两新的对象 自然是false, 下面的s3的值本身就是"ab",而字符串"a"+"b"等于"ab",答案是true

回复 使用道具 举报
_Rain 发表于 2015-7-17 02:06
首先要知道这里的字符都是String类对象,引用类型。==是比较两个对象的地址值。s1+s2中的加号是连接符。s3 ...

正解,说得太详细了
回复 使用道具 举报
,"a"+"b"这个在反编译里面就是"ab"   就像int a = 3+4;   
回复 使用道具 举报
_Rain 来自手机 中级黑马 2015-7-17 13:04:23
20#
[quote]longbao 发表于 2015-7-16 23:07
其实s3表示一个对象,写法:String s3=new String(

不对,,你这样子写的话,是有两个对象存在的。而那个只有一个对象,这是有区别的。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马