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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 官文昌 中级黑马   /  2012-8-19 20:22  /  1985 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 官文昌 于 2012-8-19 20:23 编辑

public class TestDemo {
        public static void main(String[] args) {
                String s1 = "a";
                String s2 = s1 + "b";
                System.out.println(s2);//ab
                System.out.println(s2 == "ab");//为什么是false
        }
}
第一个打印都是ab
为啥第二个是false????

评分

参与人数 1黑马币 +15 收起 理由
田建 + 15 这个问题论坛里问过很多遍了的哦!.

查看全部评分

7 个回复

倒序浏览
字符串是引用数据类型,s2中存储的只是“ab”所在的堆内存地址,不是“ab”,自然用==比较的话就是false

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油!

查看全部评分

回复 使用道具 举报
字符串内容是否相同的比较用equals,==对于字符串来说,比较的是地址是否相同。
回复 使用道具 举报
这个题里的==是比较地址值的  而equals 是比较字符串内容的   因为他们两个的地址值不同 所以为false  如果用equals的话是比较字符串的内容 所以为true
回复 使用道具 举报
字符串比较需要使用equals方法,==比较的是对象内存地址,而equals才是比较值
回复 使用道具 举报
本帖最后由 贾林栋 于 2012-8-20 13:35 编辑

以前还以为搞清楚了,现在才发现对于字符串的理解存在很大误区,多亏了楼主的帖子,要不然现在还迷糊着。
JAVA对于String是如何处理的?Java为了更有效地使用内存,JVM留出一块特殊的内存区域,被称为“String常量池”。当编译器遇见String常量的时候,它检查该池内是否已经存在相同的String常量。如果找到,就把新常量的引用指向现有的String,不创建任何新的String常量对象。
"a" "b"  "ab"存在于常量池中,s2=s1+"b";s1是对象,并不是在常量池中开辟的,而是在堆内存开辟的,"ab"存在于常量池中,所以引用地址不一样。==是比较对象的引用地址和值是否都相等,这里引用地址不一样,因此是false。

回复 使用道具 举报
String 是常量,其对象一旦创建完毕就无法改变,当使用+拼接字符串时,会生成新的String 对象,而不是向原有的String 对象追加内容
回复 使用道具 举报
只有引号加文本创建的String对象才能被存储在常量池内,==比较存储地址,所以是false
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马