黑马程序员技术交流社区

标题: 请教大神String的问题! [打印本页]

作者: 郭俊    时间: 2013-1-10 20:29
标题: 请教大神String的问题!
本帖最后由 郭俊 于 2013-7-21 11:48 编辑

为什么s3和s4不相等?请详解,是怎么一个流程?

package cn.org.regex;
public class Test {
    public static void main(String[] args) {
        String s1 ="a";
        String s2 ="b";
        String s3 = s1+s2;
        String s4 ="ab";
        System.out.println(s3==s4);
    }
}



作者: 王少雷    时间: 2013-1-10 20:32
这个问题已经很多了。
比较字符串相等不是用 == 而是用 equals 呵呵。
不要问为什么。因为JAVA  JVM 就是这么规定的。
作者: Rancho_Gump    时间: 2013-1-10 20:37
== 比较的是地址值  equals比较的是字符串的内容   s3的地址和s4不一样
作者: 郭俊    时间: 2013-1-10 20:39
王少雷 发表于 2013-1-10 20:32
这个问题已经很多了。
比较字符串相等不是用 == 而是用 equals 呵呵。
不要问为什么。因为JAVA  JVM 就是这 ...

  同学   我问的是 怎么的一个流程?   你换equals那就改我代码了都。
毕老师视频都有用==的,只是没详解。
作者: 李文龙    时间: 2013-1-10 20:49
String s1 ="a";
String s2 ="b";
String s3 = s1+s2;   //s3="ab"
String s4 ="ab";      // s4="ab"
我们都知道,java里边每一个对象都有各自对应的内存空间,也就是各自的地址值,现在我们知道的是s3、s4里边的值是相同的,都是"ab",但是s3、s4是不同的空间地址单元,java里边的赋值是把内存空间的地址赋给变量,也就是变量指向的是那片内存空间。
System.out.println(s3==s4);
所以,这里比较的是指向的那片内存空间是否相等,很显然,是不相等的 ,如果想要s3等于s4,除了用equals比较值之外,可以这样办
s1="a";
s2="b";
s3=s1+s2;   
s4=s3;
你将s3指向的那片内存空间赋给s4,令s4也指向那片内存空间即可
作者: 祝文丞    时间: 2013-1-10 20:50
没看到这里 打酱油  ==
作者: txl    时间: 2013-1-10 21:15
我也很疑惑,创建方式都是一样的,按理说a和b都已经在常量池中出现,那么创建s4时是不是会在常量池中去查找...
作者: 黑马伍哲沂    时间: 2013-1-10 21:32
我的理解是这样的  待验证:
上面结果返回false,说明两个地址是不相等的。
String s4 = “ab”; 和String s3 = s1 + s2;前者在静态池,后者一定不在咯。
s1+s2 应该是调用了字符串连接concat()吧。查看Api,有说新建对象的。

作者: 王阳    时间: 2013-1-10 23:39
String s3 = s1+s2;
        String s4 ="ab";
首先,明确一下 s3 和 s4分别创建了几个对象,s3是分别会创建3个对象,s1,s2,s3,因为字节码文件编译时候无法确定字符串的值,所以在运行后会new 出s1和s2的对象,然后再创建一个s3的对象分别指向s1 和s2对象的值,个人感觉,这里s3指向s1和s2有点软引用的感觉,至于s4则是字节码加载时候就已经确定了值,所以会在字符串常量池创建这么一个字符串常量,并将s4对象地址指向该常量,由于==比的是地址值。所以地址值当然不一样了

作者: 郭俊    时间: 2013-1-11 11:05
嗯,理解了, 谢谢各位的热心帮助
作者: 铿锵科技    时间: 2013-1-14 23:56
s3==s4比较的是哈希值。equals比较的是字符串的值




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