Java String += 需要速记解释

标签 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 prev= "abc";
    String curr = "def";
    String result="";

    result+=prev+curr;
    System.out.println(result);

我认为这是因为右手操作在进行ASCII加法,我无法得出结论,谁能解释一下。

我 sleep 不足,因此无法得出结论,因此请人澄清我的小疑惑。

最佳答案

与引用无关。当您执行 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;//这里使用简写

在这种情况下,或者在 compressed+=""+prev+count 情况下,由于操作是从左到右发生的,+ 运算符应用于字符串 ("") 和 char(prev) 并且行为类似于 append 并且还返回一个字符串。然后将生成的字符串附加到另一个 int (prev)

更好的方法是使用 StringBuilder

关于Java String += 需要速记解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24906705/

相关文章:

java - 方法拦截以获取属性名称

java - Java中的音频音量控制(增加或减少)

c++ - 在 Turbo C++ 中将字符串分配给结构中的 char 数组

c++ - `re.sub(pattern, functor, string)` 对于 C++

C++:类成员引用有效性?

C++ 引用和解引用

java - Spring 启动 : What is the Right Way to Implement Basic Auth with httpheaders

java - LibGDX 阶段褪色为黑色

python - 如果在数据帧列中找到则返回字符串的关键字

引用类型的 C++11 成员变量, vector push_back 后的不同行为