Java String + =需要简写说明

时间:2014-07-23 09:24:57

标签: java string reference shorthand

当我创建一个压缩字符串的程序时遇到了这个奇怪的问题,我会将代码片段与其输出粘贴,我希望有人能够清楚地解释为什么会发生这种情况。

第一个代码片段:此处如果连续出现相同的字母,则字母的连续出现将被相同字母的总数替换。例如: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添加,我无法得出结论,任何人都可以澄清。

我睡眠不足,因此我无法得出结论,因此要求某人澄清我的琐碎怀疑。

4 个答案:

答案 0 :(得分:2)

它与参考无关。当您prev+count时,prev中的字符的ascii值将添加整数计数。在这种情况下:

“a”的ascii是97,它发生了两次......所以97 +2 = 99 ..
“b”的ascii是98,它发生了两次......所以98 + 2 = 100 ..
“c”的ascii是99,它发生了两次......所以99 +2 = 101 ..
这就是输出为99100101991001019910010199100

的原因

试试这个:compressed+=(""+prev)+count; // Shorthand used here

在这种情况下,或在compressed+=""+prev+count情况下,由于操作从左到右发生,+运算符应用于字符串("")和char(prev)和表现得像追加并且还返回一个字符串。然后使用另一个int(prev

附加结果字符串

更好的方法是使用StringBuilder

答案 1 :(得分:1)

查看this subjectJLS 15.18.1部分:

  

由于运算符的组合,您会看到此行为   优先级和字符串转换。

     

JLS 15.18.1州:

     
    

如果只有一个操作数表达式是String类型,则对另一个操作数执行字符串转换(第5.1.11节)以生成     运行时的字符串。

  
     

因此,你的第一个表达中的右手操作数是   隐式转换为字符串:string = string + ((char)65) + 5;

     

对于第二个表达式string += ((char)65) + 5; +=   复合赋值运算符必须与+一起考虑。   由于+=弱于+,因此首先评估+运算符。   我们有一个char和一个 int ,结果是binary numeric promotionint。只有这时才评估+=,但此时   涉及+运算符的表达式的结果已经过评估。

答案 2 :(得分:0)

每当你在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 .

答案 3 :(得分:0)

您可以将字符值“prev”转换为字符串,然后将计数附加到它。

压缩+ = Character.toString(prev)+ count;