Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java stringbuilder添加额外字符新手问题_Java_String_Append_Immutability_Stringbuilder - Fatal编程技术网

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

java stringbuilder添加额外字符新手问题,java,string,append,immutability,stringbuilder,Java,String,Append,Immutability,Stringbuilder,我是Java的新手。我编写了下面的程序,得到了下面的输出 输出: 一, 出局= x=0.1测试 x=1 1我明白了 如果字符串是不可变的,为什么我可以明显地将“thisCycle”的值从“0”更改为“1”,并打印出新的字符串值? 为什么我在“for”循环中得到两行输出? 为什么第一个字符串附加了两个句点 谢谢 import java.util.ArrayList; public class Main { /** * @param args */ priv

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

输出:

一,

出局=

x=0.1测试

x=1 1我明白了

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

谢谢

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);
        }
    }

}
import java.util.ArrayList;
公共班机{
/**
*@param args
*/
私有静态最终ArrayList ListContents=new ArrayList();
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
字符串thisCycle=“Cycle”;
thisCycle=“0”;
//进入下一个周期
如果(thisCycle.equals(“0”))thisCycle=“1”;
System.out.println(本周期);
//
字符串a1=“测试”;
String a2=“gotcha”;
增加(a1);
增加(a2);
StringBuilder a_out=新StringBuilder(“”);
System.out.println(“a out=“+a_out”);
对于(int x=0;ListContents.size()>x;x++){
a_out.delete(0,a_out.length()+1);
如果(thisCycle.equals(“0”))a_out.append(ListContents.get(x)).append(“.”);
如果(thisCycle.equals(“1”))a_out.append(ListContents.get(x)).append(“…”);
System.out.println(“x=”+x+“”+thisCycle+“”+a_out);
}
}
}
字符串是不可变的。您正在更改引用

String thisCycle="Cycle";
thisCycle="0"; // <-- changes the thisCycle reference.
由于
ListContents
包含两个字符串,因此将获得两行输出。最后,你得到了两个周期,因为

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

if(thisCycle.equals(“0”))thisCycle=“1”// 字符串本身是不可变的,但您正在更改变量的字符串值,而不是字符串本身。这是一个重要的区别——Java中的一切都是通过引用完成的

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

由于循环执行了两次,您得到了两行输出,因为ListContents中有两个元素。

是的,这需要一点思考才能让您清醒过来

这样想吧。变量名有点像可以放在盒子上的标签;变量的内容是框中的任何内容。一个不可变的对象意味着一旦你得到了这个盒子并在里面放了一些东西,盒子就被密封了:你可以看里面,但是你不能改变里面的内容


您在代码中所做的是更改
字符串
变量所指向的内容;换句话说,你得到的不是改变盒子的内容,而是一个新盒子,把修改过的内容放进去,然后把标签移到新盒子上。旧的盒子包含了它一直做的事情(它是不变的);但是标签现在位于新框中,任何试图访问该变量的尝试都会导致查看新框。

我得到了“最终”的想法。有点但是,我不明白为什么我得到2行输出。变量如何同时等于两个事物?即使我更改了引用,旧的引用也应该消失,对吗?@user2475400
if(thisCycle.equals(“1”))a_out.append(ListContents.get(x)).append(“…”)是为什么会有两个句点。由于(int x=0;ListContents.size()>x;x++)的
而得到了两行代码,但是,我有两个if stmts。“thisCycle”如何同时等于0和1?并且,第一个if只有一个“append”。“但是打印出来了”。”。因为
thisCycle
不等于0。
thisCycle
等于1。这会附加两个句点。是的。thisCycle等于1。当等于1时,它会附加两个句点。这正是我的意图。那么,第一个if stmt不应该做任何事情,对吗?我不应该得到这个输出:“x=0 1 test…”我应该只得到“x=1 1 gotcha..”但是循环有2个if stmt。只有一个if stmt可以为true,对吗?