簡體   English   中英

Java String + =需要簡寫說明

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM