You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:44:02