java stringbuilder添加额外的字符新手问题

时间:2014-09-16 17:46:29

标签: java string append immutability stringbuilder

我是Java的新手。我编写了以下程序并得到了下面的输出。

输出:

1

a out =

x = 0 1测试..

x = 1 1拿到..

如果字符串是不可变的,为什么我显然可以将“thisCycle”的值从“0”更改为“1”并打印出新的字符串值? 为什么我在“for”循环中获得2行输出? 为什么第一个字符串附加了2个句点?

由于

import java.util.ArrayList;


public class Main {

    /**
     * @param args
     */
    private static final ArrayList<String> ListContents=new ArrayList<String>();

    public static void main(String[] args) {
         // TODO Auto-generated method stub
         String thisCycle="Cycle";
         thisCycle="0";
        // advance to next cycle
         if (thisCycle.equals("0")) thisCycle="1";
        System.out.println(thisCycle);
        //
        String a1="test";
        String a2="gotcha";
        ListContents.add(a1);
        ListContents.add(a2);
        StringBuilder a_out=new StringBuilder("");
        System.out.println("a out="+a_out);
        for(int x=0;ListContents.size()>x;x++) {
            a_out.delete(0, a_out.length()+1);
            if (thisCycle.equals("0")) a_out.append(ListContents.get(x)).append(".     ");
            if (thisCycle.equals("1")) a_out.append(ListContents.get(x)).append("..    ");          
            System.out.println("x="+x+" "+thisCycle+" "+a_out);
        }
    }

}

3 个答案:

答案 0 :(得分:1)

字符串本身是不可变的,但是您要更改变量的String值,而不是String本身。这是一个重要的区别 - Java中的所有内容都是通过引用完成的。

你有两行输出,因为循环执行两次,因为你在ListContents中有两个元素。

答案 1 :(得分:0)

字符串是不可变的。你正在改变参考。

String thisCycle="Cycle";
thisCycle="0"; // <-- changes the thisCycle reference.

为防止这种情况,请将String标记为最终。

final String thisCycle="Cycle";
thisCycle="0"; // <-- compiler error. Can't change a final reference.

你得到两行输出,因为你的ListContents包含两个字符串。最后,你得到了两个句号因为这个

if (thisCycle.equals("0")) thisCycle="1"; // <-- changes "0" to "1"

答案 2 :(得分:0)

是的,这需要一点点思考来解决问题。

这样想。变量名有点像标签,可以放在盒子上;变量的内容是框中的任何内容。一个不可变的对象意味着一旦你拿到了盒子并放入了一些东西,那么盒子就会被密封:你可以查看它内部,但是你无法改变内容。

您在代码中执行的操作正在改变String变量所指向的内容;换句话说,不是改变盒子的内容,而是获得一个新盒子,将修改后的内容放在那里,然后将标签移动到新盒子上。旧盒子包含它一直以来所做的一切(它是不可变的);但标签现在位于新框中,任何访问该变量的尝试都将导致查看新框。