黑马程序员技术交流社区
标题:
String字符串相加地址问题
[打印本页]
作者:
胡志翔
时间:
2013-10-22 23:03
标题:
String字符串相加地址问题
String s1 = "He"+"llo";
String s2 = "Hello";
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
复制代码
String s1 = "He";
String s2 = "llo";
String s3 = s1 + s2;
String s4 = "Hello";
System.out.println(s3.equals(s4));
System.out.println(s3 == s4);
复制代码
为什么第一段代码s1==s2是true,而第二段代码s3==s4是false?
作者:
hyz123456
时间:
2013-10-22 23:18
System.out.println(s1.equals(s2)); //1.这里比较的是s1和s2的内容,相同返回true
System.out.println(s1 == s2); //2.这里比较的是s1和s2的引用,因为 String类是不可变的,对String类的任何改变,都是返回一个新的String类对象,而你两个
的值是相同的,所以默认指向同一个对象“hello”,返回true
System.out.println(s3.equals(s4)); //3.同上1
System.out.println(s3 == s4); //个人理解是,s1和s2各自指向一个对象,当建立s3时,里面包含的是对s1和s2两个引用对象的指向,而s4是指向的是“hello”,返回false
作者:
蜗牛强
时间:
2013-10-23 00:04
String s1 = "He"+"llo";
String s2 = "Hello";
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
---------------------------------------------------------------------
String s1 = "He";
String s2 = "llo";
String s3 = s1 + s2;
String s4 = "Hello";
System.out.println(s3.equals(s4));
System.out.println(s3 == s4);
关于字符串池的概念你可以去百度或者书籍中了解,这里我不作介绍,楼主疑惑的问题我猜是红色部分代码的区别。
第一种情况jvm(java虚拟机)会自动做一个操作,这个操作就是把 "He"+"llo"变成"Hello",这样这句话就变成了String s1 = "Hello";
第二种情况是因为java对两个String相加的功能源码上返回的是一个String类型的对象,所以,新建的对象在字符串池外部。
这就是问题的根本原因。
作者:
ixiangfeng
时间:
2013-10-23 00:18
String s1 = "He"+"llo";// 这代码jvm会在编译时使它变成 String s1 = "Hello"; 所以第一段代码都是常量池的Hello,结果为true
String s3 = s1 + s2;//这代码实际是调用了StringBuffer,其操作相当于StringBuffer sb = new StringBuffer(); sb.append(s1); sb.append(s2); String s3 = sb; 这里new了一个对象,与常量池中的不是同一个地址的 所以第二段代码s3==s4是false
作者:
黄炳期
时间:
2013-10-23 08:32
如果问题已经解决,请及时修改主题至“提问结束”
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2