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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭俊 中级黑马   /  2013-1-10 20:29  /  1819 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭俊 于 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);
    }
}


评分

参与人数 1黑马币 +15 收起 理由
Rancho_Gump + 15 神马都是浮云

查看全部评分

10 个回复

倒序浏览
这个问题已经很多了。
比较字符串相等不是用 == 而是用 equals 呵呵。
不要问为什么。因为JAVA  JVM 就是这么规定的。
回复 使用道具 举报
== 比较的是地址值  equals比较的是字符串的内容   s3的地址和s4不一样
回复 使用道具 举报
王少雷 发表于 2013-1-10 20:32
这个问题已经很多了。
比较字符串相等不是用 == 而是用 equals 呵呵。
不要问为什么。因为JAVA  JVM 就是这 ...

  同学   我问的是 怎么的一个流程?   你换equals那就改我代码了都。
毕老师视频都有用==的,只是没详解。
回复 使用道具 举报
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也指向那片内存空间即可

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
没看到这里 打酱油  ==
回复 使用道具 举报
txl 中级黑马 2013-1-10 21:15:25
7#
我也很疑惑,创建方式都是一样的,按理说a和b都已经在常量池中出现,那么创建s4时是不是会在常量池中去查找...
回复 使用道具 举报
我的理解是这样的  待验证:
上面结果返回false,说明两个地址是不相等的。
String s4 = “ab”; 和String s3 = s1 + s2;前者在静态池,后者一定不在咯。
s1+s2 应该是调用了字符串连接concat()吧。查看Api,有说新建对象的。
回复 使用道具 举报
王阳 中级黑马 2013-1-10 23:39:52
9#
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对象地址指向该常量,由于==比的是地址值。所以地址值当然不一样了
回复 使用道具 举报
嗯,理解了, 谢谢各位的热心帮助
回复 使用道具 举报
s3==s4比较的是哈希值。equals比较的是字符串的值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马