【问题标题】:java stringbuilder adding extra characters newbie questionsjava stringbuilder添加额外字符新手问题
【发布时间】:2014-11-10 14:08:50
【问题描述】:

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

输出:

1

一出=

x=0 1 次测试..

x=1 1 个问题..

如果字符串是不可变的,为什么我可以将“thisCycle”的值从“0”更改为“1”并打印出新的字符串值? 为什么我在“for”循环中得到 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);
        }
    }

}

【问题讨论】:

    标签: java string append immutability stringbuilder


    【解决方案1】:

    是的,这需要花点心思才能明白。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 但循环有 2 个 if stmts。只有一个 if 语句可以为真,对吗?
      【解决方案3】:

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

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

      为防止这种情况发生,请将 String 标记为 final。

      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 行输出。变量如何同时等于 2 个东西?即使我更改了引用,那么旧的引用也应该消失了,对吧?
      • @user2475400 if (thisCycle.equals("1")) a_out.append(ListContents.get(x)).append(".. "); 是你得到两个句点的原因。由于for(int x=0;ListContents.size()&gt;x;x++) {,你得到了两条线
      • 但是,我有 2 个 if stmts。 “thisCycle”如何同时等于 0 和 1?并且,第一个 if 仅附加一个“。”但打印出“..”。
      • 因为 thisCycle 不等于 0。thisCycle 等于 1。并且附加了两个句点。
      • 是的。 thisCycle 等于 1。当等于 1 时,它会附加两个句点。正是我的意图。那么,第一个 if stmt 不应该做任何事情,对吧?我不应该得到这个输出:“x=0 1 test..” 我应该只得到“x=1 1 gotcha..”
      猜你喜欢
      • 1970-01-01
      • 2021-06-22
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 2018-05-10
      • 1970-01-01
      • 2021-09-04
      相关资源
      最近更新 更多