java - 为什么需要多次创建数组?

标签 java

该程序成对地打乱源列表。所以原来的列表

"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"

转换为

11^12 19^20 17^18 15^16 1^2 5^6 3^4 13^14 7^8 9^10

以上内容正确,但注释行未注释。现在,如果A行被注释,那么shuffleList中的所有元素都是19^20

public class ShuffleService {

public static void shuffleList(List<String> list) {

    System.out.println(list);

    ArrayList<String[]> shuffleList = new ArrayList<String[]>(10);
    String[] arr = new String[2];
    boolean flag = false;
    int step = 0;

    for(String s: list){

        if(flag){
            arr[1]=s;
        } else {
            arr[0]=s;
        }

        flag=!flag;
        step++;

        if(step==2){
            shuffleList.add(arr);
            step=0;
            //arr = new String[2]; //**line A**
        }
    }

    Collections.shuffle(shuffleList);

    for(String[] val: shuffleList){
        System.out.print(val[0]);
        System.out.print("^");
        System.out.println(val[1]);
    }


}

public static void main(String[] args) {
        String[] a = new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"};
        List<String> list1 = Arrays.asList(a);
        shuffleList(list1);
    }
}

那么为什么我需要取消程序中A行的注释才能正常工作?

最佳答案

因为当您将值重写为 arr(而不重新创建)时,您还将修改列表中已有的值。

将对象添加到列表中并不会阻止您对其进行修改,它也不会自行复制。通过在循环中调用 new String[2],您可以有效地为添加到列表中的每一对构建一个新的字符串数组,这正是您想要的。

关于java - 为什么需要多次创建数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40330597/

相关文章:

java - Struts2 使用属性标记从 jsp 访问 ActionContext

java - 有没有办法通过 GET 请求获取请求正文?

java - 如何在Android中设置自定义不同的字体样式

java - 如何访问此类中的公共(public)数组

java - 使用 Spring 配置文件的 boolean 表达式

java - Mac Osx 上的 gksu

java - 是否可以使用 LWJGL 将 C++ OpenGL 代码与 Java 混合?

java - 打印语句给出 "cannot find symbol"消息

java - 如何将AWT字体转换为SWT字体? SWT 不完整 : impossible to use font name from file

java - 为什么我能够将 Long 传递给 Map.get() 方法,该方法不是以 Long 为键的