[英]Java String += Shorthand explanation needed
當我創建一個壓縮字符串的程序時遇到了這個奇怪的問題,我會將代碼片段與它們的輸出粘貼在一起,我希望有人能夠清楚地解釋為什么會發生這種情況。
第一個代碼片段:此處如果連續出現相同的字母,則字母的連續出現將被相同字母的總數替換。 例如:aaabbb應寫成a3b3。
public static String compress(String str){
String compressed = "";
char prev = str.charAt(0);
int count = 1;
for (int i = 1; i < str.length(); i++) {
char curr = str.charAt(i);
if (curr == prev) { // in case curr is equal to prev
count++;
} else { // in case curr is not equal to prev
//compressed=compressed+prev+count;
compressed+=prev+count; // Shorthand used here
count=1;
prev=curr;
}
}
compressed=compressed+prev+count; // Shorthand not used
System.out.println(compressed);
return compressed;
}
當輸入aabbccaabbccaabbccaabb時,上面這段代碼的輸出是99100101991001019910010199b2,觀察輸出的最后兩個元素,這是因為在循環外,沒有使用速記。 如果我在循環中將表達式寫為compressed = compressed + prev + count ,我將得到預期的輸出。
我認為這個輸出是因為操作搞亂了String的地址。 但是下一個代碼又讓我感到困惑。
String prev= "abc";
String curr = "def";
String result="";
result+=prev+curr;
System.out.println(result);
我認為這是因為右手操作正在執行ASCII添加,我無法得出結論,任何人都可以澄清。
我睡眠不足,因此我無法得出結論,因此要求某人澄清我的瑣碎懷疑。
它與參考無關。 當你做prev+count
ascii時, prev
中的字符值加上整數計數。 在這種情況下 :
ascii的“a”是97,它發生了兩次......所以97 +2 = 99 ..
“b”的ascii是98,它發生了兩次......所以98 + 2 = 100 ..
ascii的“c”是99,它發生了兩次......所以99 +2 = 101 ..
這就是輸出為99100101991001019910010199100的原因
試試這個: compressed+=(""+prev)+count; // Shorthand used here
compressed+=(""+prev)+count; // Shorthand used here
在這種情況下,或者在compressed+=""+prev+count
情況下,由於操作從左到右發生,+運算符應用於字符串( ""
)和char( prev
),其行為類似於追加並且還返回串。 然后用另一個int( prev
)附加結果字符串
更好的方法是使用StringBuilder
看看這個主題和JLS 15.18.1部分:
作為運算符優先級和字符串轉換組合的結果,您會看到此行為。
JLS 15.18.1規定:
如果只有一個操作數表達式是String類型,則對另一個操作數執行字符串轉換(第5.1.11節)以在運行時生成字符串。
因此,第一個表達式中的右手操作數被隱式轉換為字符串:
string = string + ((char)65) + 5;
但是對於第二個表達式,
string += ((char)65) + 5;
+=
復合賦值運算符必須與+
一起考慮。 由於+=
弱於+
,因此首先評估+
運算符。 我們有一個char
和一個int ,它導致對int
的二進制數字提升 。 僅評估+=
,但此時已經評估了涉及+
運算符的表達式的結果。
無論何時向java中的int添加char,它首先將該字符轉換為其等效的ASCII值,然后將其添加到整數
例如,假設以下情況,
char c ='a'; //'a'的ASCII值為97
int i = c + 5; //結果將是97 + 5 = 102
我認為這回答了你的前半個問題
現在第二部分,
無論何時在Java中使用速記運算符,都會首先計算右側的表達式。
因此,表達
結果+ = prev + curr它被評估為
結果=結果+(prev + curr);
因此,
result+=prev+curr; // Here first it appends "abc" with "def" and then the resultant "abcdef" is appended to as result .
你可以將你的charater值“prev”轉換為字符串,然后將計數加到它上面。
compressed + = Character.toString(prev)+ count;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.