Java 变量因未知原因更改值?
我可能知道这一点,但为什么这会将Java 变量因未知原因更改值?,java,Java,我可能知道这一点,但为什么这会将openPos[1]更改为0?我知道这与findCloseCurlBracket()方法中的startPos[1]=0有关,但它为什么要这样做呢?这没有意义 int[] openPos = {1, 26}; System.out.println(openPos[0]+", "+openPos[1]); int[] closePos = LuaTableParser.findCloseCurlBracket(stringList, openPos);
openPos[1]
更改为0?我知道这与findCloseCurlBracket()
方法中的startPos[1]=0
有关,但它为什么要这样做呢?这没有意义
int[] openPos = {1, 26};
System.out.println(openPos[0]+", "+openPos[1]);
int[] closePos = LuaTableParser.findCloseCurlBracket(stringList, openPos);
System.out.println(openPos[0]+", "+openPos[1]);
findCloseCurlBracket()方法:
public static int[]findclosecurl括号(列表文本,int[]openPos){
int[]startPos=openPos;
int计数器=1;
for(int line=startPos[0];linestartPos
指的是与openPos
相同的数组:这两个东西都是对int
s数组的引用
int[]startPos=openPos
是否不深度复制openPos
你的写作startPos[1]=5
正在将调用方中引用的openPos
所在的同一数组中的元素更改为findCloseCurlBracket
获取深度拷贝的一种方法是编写int[]startPos=openPos.clone()
因为openPos
是对数组的引用(指向数组)。您正在将该引用(不是数组,而是对它的引用)复制到findclosecurl-bracket
asopenPos
中。然后将该引用复制到startPos
中,因此现在openPos
变量、openPos
参数和startPos
变量都指向内存中的同一数组:
+-------------------+
| openPos variable |--+
+-------------------+ |
|
+-------------------+ | +-----------+
| openPos argument |--+---->| the array |
+-------------------+ | +-----------+
| | 0: 1 |
+-------------------+ | | 1: 26 |
| startPos variable |--+ +-----------+
+-------------------+
…这将修改阵列:
+-------------------+
| openPos variable |--+
+-------------------+ |
|
+-------------------+ | +-----------+
| openPos argument |--+---->| the array |
+-------------------+ | +-----------+
| | 0: 1 |
+-------------------+ | | 1: 5 |
| startPos variable |--+ +-----------+
+-------------------+
尝试克隆/复制阵列
int[] startPos = openPos;
你在这里玩的是同一个引用。好的,那么我必须复制数组的每个元素吗,或者如何复制数组?我喜欢高雅的ASCII艺术。这比我的答案要好得多。加上一个.OrArrays.copyOf(原件,新长度)代码>->数组.copyOf(openPos,openPos.length)代码>不过我更喜欢“clone()”。举个例子,更容易记住。把它扔出去,展示一些选择Arrays.copyOf
和Arrays.copyOfRange
还可以复制数组的子集clone()
将始终复制整个阵列copyOf
更灵活一些。
+-------------------+
| openPos variable |--+
+-------------------+ |
|
+-------------------+ | +-----------+
| openPos argument |--+---->| the array |
+-------------------+ | +-----------+
| | 0: 1 |
+-------------------+ | | 1: 5 |
| startPos variable |--+ +-----------+
+-------------------+
int[] startPos = openPos.clone();
int[] startPos = openPos;