首页 > 解决方案 > 更改数组的副本会更改数组本身吗?

问题描述

这应该是一个非常简单的任务,但我一直失败。我有一个名为“root”的字符串数组,我想保持不变。shift() 改为使用我称为“temproot”的根的副本。在调用该方法之前将 temproot 设置为等于 root。然而,打印出 root 表明它在每次调用 shift() 时都会发生变化,尽管方法本身根本不会触及 root。

static String[] shift() {
    String temp = temproot[0];
    for (int i = 0; i < temproot.length - 1; i++) {
        temproot[i] = temproot[i + 1];
    }
    temproot[temproot.length - 1] = temp;
    return temproot;
}

作为附加信息,这是更改根目录的方法。它接收可变数量的整数并将它们作为字符串存储在根目录中。

static void change(int... intervals) {
    int[] in = intervals;
    String[] ints = new String[in.length];
    for (int i = 0; i < ints.length; i++) {
        ints[i] = Integer.toString(in[i]);
    }
    root = ints;
    temproot = root;
}

这仅调用一次,之后仅调用 shift()。在 main 方法中,它看起来像这样:

protected static String[] root;
protected static String[] temproot;

change(4, 3, 5);    // Major
    name("x", root); name("x/3", shift()); name("x/5", shift());

您可能会注意到,该程序旨在根据音程“掩码”自动命名和弦。例如,大和弦由大三度(4 个半音)和小三度(3 个半音)组成,然后是下一个根音的 5 个半音(因为一个八度有 12 个音符)。在第一次反转中,第 3 次在底部,在第二次反转中,第 5 次在底部。为了在每次反转时用相同的音符替换“x”,name() 使用“root”。因此,每次轮班后根必须保持不变。

我看不到 shift() 单独如何改变根目录。对此的任何帮助将不胜感激。

标签: arraysqueue

解决方案


我认为您所做的实际上不是副本。temproot = root;不会创建根的副本。这只适用于原始数据类型!数组是一种引用类型。您只是在设置对 root 的引用。看看这里如何制作一个实际的副本:https ://www.baeldung.com/java-array-copy


推荐阅读