黑马程序员技术交流社区

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

作者: 官文昌    时间: 2012-8-19 20:22
标题: 字符串
本帖最后由 官文昌 于 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????

作者: 黑马王建伟    时间: 2012-8-19 20:37
字符串是引用数据类型,s2中存储的只是“ab”所在的堆内存地址,不是“ab”,自然用==比较的话就是false
作者: 艾衍年    时间: 2012-8-19 20:42
字符串内容是否相同的比较用equals,==对于字符串来说,比较的是地址是否相同。
作者: 方志亮    时间: 2012-8-19 20:44
这个题里的==是比较地址值的  而equals 是比较字符串内容的   因为他们两个的地址值不同 所以为false  如果用equals的话是比较字符串的内容 所以为true
作者: 周世阳    时间: 2012-8-19 20:47
字符串比较需要使用equals方法,==比较的是对象内存地址,而equals才是比较值
作者: 贾林栋    时间: 2012-8-19 20:51
本帖最后由 贾林栋 于 2012-8-20 13:35 编辑

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


作者: 杨鹏鹏    时间: 2012-8-19 20:57
String 是常量,其对象一旦创建完毕就无法改变,当使用+拼接字符串时,会生成新的String 对象,而不是向原有的String 对象追加内容
作者: 马林康    时间: 2012-8-19 22:15
只有引号加文本创建的String对象才能被存储在常量池内,==比较存储地址,所以是false




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