arrays - 更改数组的副本会更改数组本身吗?
问题描述
这应该是一个非常简单的任务,但我一直失败。我有一个名为“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() 单独如何改变根目录。对此的任何帮助将不胜感激。
解决方案
我认为您所做的实际上不是副本。temproot = root;
不会创建根的副本。这只适用于原始数据类型!数组是一种引用类型。您只是在设置对 root 的引用。看看这里如何制作一个实际的副本:https ://www.baeldung.com/java-array-copy
推荐阅读
- html - 背景图像没有响应
- powershell - 如何从 PowerShell 调用 gRPC 服务器方法?
- swift - Xcode 强制文档
- python - 初始化子类时对超类变量的可访问性
- macos - 在 macOS Catalina 上从 shell 脚本制作可执行应用程序
- .net - 无法将 React App 连接到 .Net Core API,甚至没有调用 Post 方法
- react-admin - 如何在 react-admin 中更改仪表板图标?
- php - woocomerce 按两种分类法获取当前类别的产品列表
- python - 将具有相似索引但不相等级别的数据帧相乘
- vue.js - 从 Web API 导入 amChart 数据时出现 Vue.js 错误