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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

唐冬晴

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 唐冬晴 初级黑马   /  2014-3-26 19:01  /  1085 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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 有何区别,谢谢高手解惑!

3 个回复

倒序浏览
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
回复 使用道具 举报
string是一个特殊的引用类型, 有着所谓的永不改变性.
string str1 = "aaa";
str1 = "bbb";
这时候并不是str1中的aaa给替换成bbb, 而是重新分配了内存创建了一个新的对象bbb. 每次string类型的变更都会创建一个新的对象, 因此在程序中字符串改动量大的话都会使用StringBuilder.
string类型的==运算符是被重写过的, 仅仅比较值, 而非地址, 因此两个应该都为true.
回复 使用道具 举报
lmm 发表于 2014-3-26 19:43
string是一个特殊的引用类型, 有着所谓的永不改变性.
string str1 = "aaa";
str1 = "bbb";

我最开始也觉得是 答案为 true,true,但是经过测试和资料发现确实 是false,true,比较的是引用对象的内存数值,而非内容,不过还是谢谢了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马