字符串是不可变的,然后replace()如何工作?

Dee*_*mar 1 java string

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

 public static void frontBack(String str) {
   String first= ""+str.charAt(0);
   System.out.println("first char is "+first);
   String last = ""+str.charAt(str.length()-1);
   System.out.println("last char is "+last);
   String str1;
   str1 = str.replace(""+str.charAt(0),last);
   System.out.println("String str1 is => "+str1);
   String str2 ;
   str2 = str1.replace(""+str1.charAt(str1.length()-1),first);
   System.out.println("String str2 is derived from str1(dbcd) which has no 'a' but o/p is =>  "+str2);    
  }
 /* Have a look at output:
                        first char is a
                        last char is d
                        String str1 is => dbcd
                        String str2 is derived from str1 i.e. "dbcd" which has no 'a' in it but o/p is =>  abca*/
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 6

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

str1 = str.replace(""+str.charAt(0),last);
Run Code Online (Sandbox Code Playgroud)

此方法接受一个不可变的String,并创建一个不可变的新String.不可变并不意味着无法创建String.

注意:如果要操作某些文本,可以使用可变的StringBuilder.您可以从String创建它,您可以从中创建一个新的String.这通常但不总是使用,有时char[]直接用于性能原因.

创建的新字符串没有char'a',但在最终输出中它出现意外.

这是使用调试器有用的地方.你会看到的

String first= ""+str.charAt(0); // first = "a"
Run Code Online (Sandbox Code Playgroud)

以后当你这样做的时候

str2 = str1.replace(""+str1.charAt(str1.length()-1),first);
Run Code Online (Sandbox Code Playgroud)

这是一样的

str2 = str1.replace("d", "a");
Run Code Online (Sandbox Code Playgroud)

所以它应该是毫不奇怪的是,dS被替换a小号

我正在使用replace()而不是replaceAll()

来自String.replace的Javadoc (CharSequence,CharSequence)

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


Jes*_*per 5

首先,你必须明白Java中的变量(非基本类型)本身不是对象,它们是对象的引用。类String是不可变的,这意味着一旦String创建了对象,就无法更改该对象的内容。但是,您可以使String变量引用不同的String对象。

让我们逐行看看发生了什么。我们首先str引用一个String带有内容的对象"abcd"

String first= ""+str.charAt(0);
Run Code Online (Sandbox Code Playgroud)

这使得变量first引用String具有 content 的新对象"a"

String last = ""+str.charAt(str.length()-1);
Run Code Online (Sandbox Code Playgroud)

这使得变量last引用一个仅包含所引用对象String的最后一个字符的新对象。因此,指的是具有内容的对象。StringstrlastString"d"

String str1;
str1 = str.replace(""+str.charAt(0),last);
Run Code Online (Sandbox Code Playgroud)

replace()方法接受两个参数:要查找的子字符串和要替换它的字符串。注意replace()改变原来的String对象;它返回一个新String对象,其中第一个参数的所有出现都被第二个参数替换。请参阅API 文档

""+str.charAt(0)is"a"lastis "d",所以这一行相当于:

str1 = str.replace("a", "d");
Run Code Online (Sandbox Code Playgroud)

在这一行之后,str仍然指原来的Stringwith content "abcd",并str1指新的Stringwith content "dbcd"

String str2 ;
str2 = str1.replace(""+str1.charAt(str1.length()-1),first);
Run Code Online (Sandbox Code Playgroud)

在这一行中,第一个参数replace()是:""+str1.charAt(str1.length()-1)which is ( that所指的"d"最后一个字母)。Stringstr1

第二个参数first"a"

所以这一行相当于:

str2 = str1.replace("d", "a");
Run Code Online (Sandbox Code Playgroud)

在这一行之后,str1仍然引用String内容"dbcd",并str2引用一个新String对象,其中所有字母d都已替换为a,因此:"abca"