黑马程序员技术交流社区

标题: 对String变量指向的内存中对象的疑惑? [打印本页]

作者: 唐冬晴    时间: 2014-3-26 19:01
标题: 对String变量指向的内存中对象的疑惑?
public static void main(String[] args) {
                String s1 ="a";
                String s2 =s1+"b";
                String s3 = "a"+"b";
                System.out.println(s2=="ab");
                System.out.println(s3=="ab");
        }
结果 false true ,请问为什么s2 不能“==ab”啊?是因为s2 又创建了一个新的对象,指向的内存数值不相等吗?s2 与s3 有何区别,谢谢高手解惑!

作者: 南天鹤    时间: 2014-3-26 19:40
static void Main(string[] args)
        {
                string s1 ="a";
                string s2 =s1+"b";
                string s3 = "a"+"b";
                Console.WriteLine(s2=="ab");
                Console.WriteLine(s3=="ab");
                Console.ReadKey();
        }
经测试,结果都是:True
作者: lmm    时间: 2014-3-26 19:43
string是一个特殊的引用类型, 有着所谓的永不改变性.
string str1 = "aaa";
str1 = "bbb";
这时候并不是str1中的aaa给替换成bbb, 而是重新分配了内存创建了一个新的对象bbb. 每次string类型的变更都会创建一个新的对象, 因此在程序中字符串改动量大的话都会使用StringBuilder.
string类型的==运算符是被重写过的, 仅仅比较值, 而非地址, 因此两个应该都为true.
作者: 唐冬晴    时间: 2014-3-30 09:45
lmm 发表于 2014-3-26 19:43
string是一个特殊的引用类型, 有着所谓的永不改变性.
string str1 = "aaa";
str1 = "bbb";

我最开始也觉得是 答案为 true,true,但是经过测试和资料发现确实 是false,true,比较的是引用对象的内存数值,而非内容,不过还是谢谢了!




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