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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class  Ab
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String s1 = "a";
  6.                 String s2 = "b";
  7.                 String s3 = "ab";
  8.                 System.out.println(s3 ==s1 + s2); //false
  9.                 System.out.println(s3 =="a" + "b"); //true
  10. //两者到底有什么区别啊?需要比较两个方面吗?(比较数值和hash地址值吗?)如果需要,那么到底先比较数值还是先比较地址?
  11.                 System.out.println(s1 + s2); //ab
  12.                 System.out.println("a" + "b"); //ab
  13. //我输出了结果,但两者一样啊!

  14.         }
  15. }
复制代码

8 个回复

倒序浏览
它们比较的是对象是否相等,也就是说地址,不同的对象肯定是不同的地址了。所以是false。如果要比较值的话。可以用equals
回复 使用道具 举报
s1+s2创建了一个新的对象,所以为false
"a"+"b"这种文本的连接方式编译器自动优化,s3本来的引用就是指向“ab”
回复 使用道具 举报
linjian931219 来自手机 中级黑马 2015-7-6 12:16:53
板凳
[quote]心在左边跳 发表于 2015-7-5 23:47
s1 s2创建了一个新的对象,所以为false


嗯,是的,反编译之后,直接输出的是ab,也就是说虚拟机优化了字符串a+b,但s1和s2不能被优化
回复 使用道具 举报
linjian931219 来自手机 中级黑马 2015-7-6 12:18:41
报纸
wws1214 发表于 2015-7-5 22:24
它们比较的是对象是否相等,也就是说地址,不同的对象肯定是不同的地址了。所以是false。如果要比较值的话 ...

那比较的时候,值和地址都需要比较吗?
回复 使用道具 举报
本帖最后由 zhuoxiuwu 于 2015-7-6 21:44 编辑

String s1 = "a";
String s2 = "b";
String s3 = "ab";
现在在 常量池存在 3个 东西  "a" "b" "ab"
s3=s1+s2; 编译器从右向左读,因为s1+s2,是变量相加 ,执行时会开辟一块新的地址来保存"a"+"b"的值(因为编译器并不知道相加的结果),里面的内容是"ab"
s4="a"+"b"  编译器读到"a"+"b" 2个字符串常量相加,编译器会事先知道了这个相加的结果,结果是"ab" ,“ab”这东西在常量池已经存在了,性能优化 直接将直接的"ab"的引用给了s4



如果理解错误,望指出
回复 使用道具 举报 1 0
楼上说的对
编译期与运行期

  1. public static void main(String[] args){
  2.   //情况一
  3.   String a="a1";
  4.   String a1="a"+1;
  5.   System.out.println(a==a1);
  6.   //情况二
  7.   String b="b1";
  8.   int bb=1;
  9.   String b1="b1"+bb;
  10.   System.out.println(b==b1);
  11.   //情况三
  12.   String c="c1";
  13.   final int cc=1;
  14.   String c1="c"+cc;
  15.   System.out.println(c==c1);
  16.   //情况四
  17.   String d="d1";
  18.   final int dd=getDD();
  19.   String d1="d"+"dd";
  20.   System.out.println(d==d1);
  21. }
  22. public static int getDD(){
  23.   return 1;
  24. }
复制代码

供你参考
回复 使用道具 举报
zhuoxiuwu 发表于 2015-7-6 13:48
String s1 = "a";
String s2 = "b";
String s3 = "ab";

恩,谢谢,解释的很清楚
回复 使用道具 举报
825176857 发表于 2015-7-6 14:52
楼上说的对
编译期与运行期
供你参考

多谢解释,楼上的解释也很清楚了,你的更具体了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马