String.concat方法与+运算符在字符串拼接中的差异
为什么两段String代码输出不一样?
嘿,这个问题的核心其实是Java里String的不可变性,咱们一步步拆解清楚:
首先得明确:Java里的String对象一旦创建,它的内容就永远不能被修改。所有看似“修改”字符串的操作,本质都是生成了一个全新的String对象,原对象本身完全没变。
第一段代码的情况
咱们看这段代码:
String str ="football"; str.concat(" game"); System.out.println(str); // 输出football
concat(" game")方法确实会帮你生成一个新的字符串"football game",但问题是——咱们没把这个新对象的引用存回原来的str变量里!
原来的str变量还是死死指向最初创建的"football"对象,新生成的那个"football game"对象因为没人引用它,很快就会被垃圾回收掉。所以最后打印的自然还是原字符串。
要是想让这段代码输出football game,你得改成这样:
String str ="football"; str = str.concat(" game"); // 把新对象赋值回str System.out.println(str);
第二段代码的情况
再看这段代码:
String str ="football"; str = str + " game"; System.out.println(str); // 输出football game
这里的+操作符,底层其实和concat类似(甚至更灵活,能拼接非字符串类型),同样会生成一个新的"football game"对象。但关键是,咱们把这个新对象的引用重新赋值给了str变量。
现在str不再指向原来的"football"了,转而指向新生成的"football game"对象,所以打印的时候就会输出新内容。
两者的核心差异
str.concat("xxx")只负责生成新字符串,但不会主动改变原变量的指向,必须手动赋值才会生效str = str + "xxx"是直接把新字符串的引用赋值给原变量,让原变量“换个对象指向”,所以能看到修改后的结果- 本质上两者都是基于String的不可变性生成新对象,区别就在于有没有把新对象的引用存回原变量
内容的提问来源于stack exchange,提问作者Basel Qarabash
相关产品推荐
相关产品推荐

