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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wayonEmes   /  2015-7-28 10:42  /  3009 人查看  /  39 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

恩 ,今天学了,+号其实就是用String的链接方法,是创建对象的  所以地址值不同,
回复 使用道具 举报
学习了~~~
回复 使用道具 举报
很诡异啊这个题
回复 使用道具 举报
因为==是比较地址
而:
String s1 ="hello";String s2="hello";会输出true,是因为他们指向的是同一个对象;
Java为了效率为String提供了串池,当使用这种方法申明的两个字符串内容相同,将不会开辟新的内存空间而导致内存地址相同;
如果你这样String s1 = new String("hello");输出的就是false,他们指向的不再是一个对象
这种方法不管串池中是否以后“hello”都将再重新开辟一块内存空间因此使用==输出的是false
回复 使用道具 举报
第二种方法定义了一个新的对象
回复 使用道具 举报
zk338142 来自手机 中级黑马 2015-7-31 12:08:30
26#
还没学到,看看怎么回事
回复 使用道具 举报
版主你好,请参考下我之前写过的一篇关于对象内存管理模型的文章(http://blog.csdn.net/u010111458/article/details/46928871)。
只要对内存模型有所掌握,这就很容易就理解。
回复 使用道具 举报
这种只是比价两个对象的地址值吧
回复 使用道具 举报
比较的是内存地址
回复 使用道具 举报
把栈内存,堆内存还有常量池搞清楚,这个问题就很简单类
回复 使用道具 举报
这个涉及到一点常量池的内容,注意,变量相加的时候会自动开辟新空间,常量相加会在常量池中去寻找是否有一样的常量。
所以
String s = "Hello";
String s1 = "World";
String s2 = "HelloWorld";
System.out.println(s2==s+s1);//运行结果为false,因为开辟了新空间。
System.out.println(s2=="Hello"+"World");//运行结果为true,因为相加结果进入了常量池。
回复 使用道具 举报
好像我还好不知道..
回复 使用道具 举报
Apol 中级黑马 2015-7-31 22:45:56
33#
wayonEmes 发表于 2015-7-28 10:54
这个我知道啊,是String类重写了Object中的equals方法,比较的是字符串的值
==好像是比较的地址值,可是为什 ...

它们是没有用关键字new创建的对象,上面两个字符串的内容相同,在内存中只开辟一块空间,是同一个对象,当用关键字new创建时,就是两个对象了
回复 使用道具 举报
楼主高富帅,楼主v587
回复 使用道具 举报
String是一个引用类型,+仅仅是字符串的拼接,而==比较的是引用类型的地址值,结果当然是false了。
回复 使用道具 举报
wode1311 发表于 2015-7-31 23:07
String是一个引用类型,+仅仅是字符串的拼接,而==比较的是引用类型的地址值,结果当然是false了。 ...

可是String s1 ="hello";
回复 使用道具 举报
wode1311 发表于 2015-7-31 23:07
String是一个引用类型,+仅仅是字符串的拼接,而==比较的是引用类型的地址值,结果当然是false了。 ...

可是String s1 ="hello";
      String s2 ="hello";
syso(s1==s2);
两个都是引用类型,比较地址值,结果应该是false啊
可是结果却是true
回复 使用道具 举报
Apol 发表于 2015-7-31 22:45
它们是没有用关键字new创建的对象,上面两个字符串的内容相同,在内存中只开辟一块空间,是同一个对象, ...

嗯嗯 开始还是没有明白字符串的拼接机制是利用缓冲区完成的
回复 使用道具 举报
天地一沙鸥 发表于 2015-7-31 22:20
这个涉及到一点常量池的内容,注意,变量相加的时候会自动开辟新空间,常量相加会在常量池中去寻找是否有一 ...

谢谢啦 ,感谢你的帮助
回复 使用道具 举报
字符串是不能用==进行比较的。你可以通过s3.equals(s1+s2)来进行比较
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马