Java 字符串是不可变的那么replace()是如何工作的呢?

Java 字符串是不可变的那么replace()是如何工作的呢?,java,string,Java,String,我试图用字符串的最后一个字母/字符替换字符串的第一个字母/字符,用它的第一个字母/字符替换最后一个字母/字符。 例如,abcd=>dbca。 字符串在Java中是不可变的,那么我们如何解释这个程序的行为呢? 请看一下最终输出。str1没有字符“a”,但在最终输出中意外出现。。怎样? //frontBack()的参数是字符串“abcd” 字符串在Java中是不可变的,那么我们如何解释这个程序的行为呢 此方法接受一个不可变的字符串,并创建一个不可变的新字符串。不可变并不意味着不能创建字符串 注意:如

我试图用字符串的最后一个字母/字符替换字符串的第一个字母/字符,用它的第一个字母/字符替换最后一个字母/字符。 例如,abcd=>dbca。 字符串在Java中是不可变的,那么我们如何解释这个程序的行为呢?
请看一下最终输出。str1没有字符“a”,但在最终输出中意外出现。。怎样? //frontBack()的参数是字符串“abcd”

字符串在Java中是不可变的,那么我们如何解释这个程序的行为呢

此方法接受一个不可变的字符串,并创建一个不可变的新字符串。不可变并不意味着不能创建字符串

注意:如果您想操纵某些文本,可以使用可变的StringBuilder。您可以从一个字符串创建它,也可以从中创建一个新字符串。这经常使用,但并不总是使用,有时出于性能原因直接使用
char[]

创建的新字符串没有字符“a”,但在最终输出中意外出现

这就是使用调试器将有所帮助的地方。你会看到的

String first= ""+str.charAt(0); // first = "a"
等你回来的时候

str2 = str1.replace(""+str1.charAt(str1.length()-1),first);
这和

str2 = str1.replace("d", "a");
因此,
d
s被
a
s取代也就不足为奇了

我使用的是replace()而不是replaceAll()

来自Javadoc的

用指定的文字替换序列替换与文字目标序列匹配的此字符串的每个子字符串


首先,您必须了解Java中的变量(非原语类型)本身不是对象,而是对象的引用。类
String
是不可变的,这意味着一旦创建了
String
对象,就无法更改对象的内容。但是,可以使
字符串
变量引用不同的
字符串
对象

让我们一行一行地看看发生了什么。我们从
str
开始,它指的是内容为
“abcd”
String
对象

这使得变量
首先
引用一个新的
字符串
对象,其内容为
“a”

这使得变量
last
引用一个新的
String
对象,该对象只包含
str
引用的
String
对象的最后一个字符。所以,
last
指的是一个
字符串
对象,其内容为
“d”

replace()
方法接受两个参数:要查找的子字符串和要替换的字符串。请注意,
replace()
不会更改原始的
字符串
对象;它返回一个新的
字符串
对象,其中第一个参数的所有匹配项都被第二个参数替换。看

“”+str.charAt(0)
“a”
最后一个
“d”
,因此此行相当于:

str1 = str.replace("a", "d");
str2 = str1.replace("d", "a");
在这一行之后,
str
仍然指内容为
的原始
字符串
“abcd”
str1
指内容为
的新
字符串
“dbcd”

在这一行中,
replace()
的第一个参数是:
“”+str1.charAt(str1.length()-1)
,它是
“d”
str1
引用的
字符串的最后一个字母)

第二个参数是
first
,它是
“a”

所以这条线相当于:

str1 = str.replace("a", "d");
str2 = str1.replace("d", "a");

在这一行之后,
str1
仍然是指内容为“dbcd”
字符串,而
str2
是指一个新的
String
对象,其中所有字母
d
都被
a
替换,因此:
“abca”

replace不会更改str。它会创建一个新字符串,分配给str1。只需阅读文档,它会创建一个新字符串,旧字符串会被垃圾回收。请看一下最终输出。str1没有字符“a”,但在最终输出中意外出现。。怎么办?否决票都是仓促的回应请看编辑兄弟!我不反对投票,但你真正的问题与不变性无关,甚至与
replace
的工作原理无关,这令人困惑。但创建的新字符串没有字符“a”,但在最终输出中它意外出现。我对此感到困惑。我使用的是replace()而不是replaceAll(),你对此没有任何答案,我敢肯定@Deepeshkumar没有,因为Javadoc已经为这个方法回答了这个问题。我想不出还有什么要补充的。谢谢!这让我反思我阅读Javadoc的方式。这真是一件值得赞赏的事。我会努力提高!
String str1;
str1 = str.replace(""+str.charAt(0),last);
str1 = str.replace("a", "d");
String str2 ;
str2 = str1.replace(""+str1.charAt(str1.length()-1),first);
str2 = str1.replace("d", "a");