黑马程序员技术交流社区

标题: 字符串问题 [打印本页]

作者: wangchao1686    时间: 2013-12-8 12:36
标题: 字符串问题
输出结果为false 和true,我知道使用+可以连接字符串。但是结果问什么是这样呢。我的理解是都应该是true啊。
  1. public class test {
  2.   public static void main(String[] args)
  3.   {
  4.         String s1="a";
  5.         String s2=s1+"b";
  6.         String s3="a"+"b";
  7.         String s4="ab";
  8.         System.out.println(s2==s3);
  9.         System.out.println(s4==s3);
  10.   }
  11. }
复制代码


作者: qq379264347    时间: 2013-12-8 12:57
该问题传送门:http://bbs.itheima.com/thread-100725-2-1.html
建议楼主有时间群览所有帖子,你一定会学到不少。
作者: 王尧    时间: 2013-12-8 12:58
1.String比较特殊,之前的s1是在【栈】中,属于变量;s2属于对象,因为String不可以增加或者删减在创建后,所以s1+“b”的结果是相当于创建了个String对象s2,此时s2存在于【堆】中,所以说,2者不同。
2.== 比较的是对象是否相等,也就是说地址,不同的对象肯定是不同的地址了。所以是false。如果要比较值的话。可以用equals.............{:soso__3419049825043533360_4:}
作者: 肖川    时间: 2013-12-8 13:00
如果你想前面一个为true,你应该这么写:System.out.println(s2。equals(s3));
因为,s2和s3是两个不同的对象,只不过存着同样的值而已,== 比较的对象的应用
很明显,他们是两个对象,所以不等。而比较对象的值使用equals方法,所以换为equals方法比较结果就会变成true;
String s1="a";
String s2=s1+"b";
其实s2的创建过程含有自动装箱和拆箱过程,对象和字符不能直接相加的,所以先将s1对象拆箱变成字符串,然后和“b”相加,再装箱成为一个对象,这也是s2和s3是两个不同对象的原因。
作者: 四五六七八    时间: 2013-12-8 13:02
String s2=s1+"b";
String s3="a"+"b";
s2和s3之所以不相同,是因为s3是在编译期间确定 在字符串池中
                                     s2实在运行时确定   会在堆内存内创建
作者: wangchao1686    时间: 2013-12-8 13:04
qq379264347 发表于 2013-12-8 12:57
该问题传送门:http://bbs.itheima.com/thread-100725-2-1.html
建议楼主有时间群览所有帖子,你一定会学到 ...

哦,这个问题有人提问了,我刚才看了,但是不能明白回复。我就是想知道草符“+”对字符串的具体操作过程。
作者: 冷月    时间: 2013-12-8 13:40
去论坛搜索   好多人提问过了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2