[英]Strings are immutable then how the replace() works?
我試圖將字符串的第一個字母/字符替換為最后一個,並將最后一個字母替換為第一個字符。 例如abcd => dbca。 字符串在Java中是不可變的,那么我們如何解釋該程序的行為呢? 請看一下最終輸出。 str1沒有字符'a',但是在最終輸出中它出乎意料地出現了。 // frontBack()的參數為字符串“ 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*/
字符串在Java中是不可變的,那么我們如何解釋該程序的行為呢?
str1 = str.replace(""+str.charAt(0),last);
此方法采用一個不可變的String並創建一個不可變的新String。 不可變並不意味着不能創建字符串。
注意:如果要操作某些文本,可以使用可變的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
替換a
s並不奇怪
我正在使用replace()而不是replaceAll()
從Javadoc中獲取String.replace(CharSequence,CharSequence)
用指定的文字替換序列替換此字符串中與文字目標序列匹配的每個子字符串。
首先,您必須了解Java(非基本類型)中的變量本身不是對象,它們是對對象的引用 。 String
類是不可變的,這意味着一旦創建了String
對象,就無法更改該對象的內容。 但是,您可以使String
變量引用其他String
對象。
讓我們逐行看看發生了什么。 我們從str
引用內容為"abcd"
的String
對象開始。
String first= ""+str.charAt(0);
這使變量first
引用內容為"a"
的新String
對象。
String last = ""+str.charAt(str.length()-1);
這使得變量last
引用一個新的String
對象,該對象僅包含str
引用的String
對象的最后一個字符。 因此, last
引用內容為"d"
的String
對象。
String str1;
str1 = str.replace(""+str.charAt(0),last);
replace()
方法采用兩個參數:要查找的子字符串,以及用來替換它的字符串。 需要注意的是replace()
不改變原來的String
對象; 它返回一個新的String
對象,所有出現的第一個參數都被第二個參數替換。 請參閱API文檔 。
""+str.charAt(0)
是"a"
, last
是"d"
,因此此行等效於:
str1 = str.replace("a", "d");
在此行之后, str
仍然引用內容為"abcd"
的原始String
,而str1
引用內容為"dbcd"
的新String
。
String str2 ;
str2 = str1.replace(""+str1.charAt(str1.length()-1),first);
在這一行中, replace()
的第一個參數是: ""+str1.charAt(str1.length()-1)
,它是"d"
( str1
所指String
的最后一個字母)。
第二個參數是first
,它是"a"
。
因此,此行等效於:
str2 = str1.replace("d", "a");
此行之后, str1
還是指String
的內容"dbcd"
和str2
是指新的String
,其中所有字母對象d
已換成a
,所以: "abca"
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.