我应该知道这个,但为什么这会将openPos[1]
改为0?我知道它与startPos[1] = 0
方法中的findCloseCurlBracket()
有关,但为什么它这样做却没有意义。
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[] findCloseCurlBracket(List<String> text, int[] openPos) {
int[] startPos = openPos;
int counter = 1;
for(int line = startPos[0]; line < text.size(); line++){
for(int index = startPos[1]; index < text.get(line).length()-startPos[1]; index++){
int[] curPos = {line, index};
if(getStringListCharAt(text, curPos) == '{'){
counter++;
}else if(getStringListCharAt(text, curPos) == '}'){
counter--;
}
if(counter == 0){
startPos[1] = 5;
return curPos;
}
}
startPos[1] = 0;
}
return null;
}
答案 0 :(得分:5)
startPos
指的是与openPos
相同的数组:两者都是引用到int
的数组。
int[] startPos = openPos;
不会对openPos
进行深层复制。
您的写作startPos[1] = 5;
正在更改openPos
在findCloseCurlBracket
中将int[] startPos = openPos.clone();
引用的同一数组中的元素。
深度复制的一种方法是编写{{1}}。
答案 1 :(得分:5)
因为openPos
是对数组的引用(指向)。您将该引用(不是数组,对它的引用)复制为findCloseCurlBracket
openPos
。然后,您将该引用复制到startPos
,所以现在openPos
变量,openPos
参数和startPos
变量都指向内存中的同一个数组:
+-------------------+ | openPos variable |--+ +-------------------+ | | +-------------------+ | +-----------+ | openPos argument |--+---->| the array | +-------------------+ | +-----------+ | | 0: 1 | +-------------------+ | | 1: 26 | | startPos variable |--+ +-----------+ +-------------------+
然后你这样做:
startPos[1] = 5;
...修改数组:
+-------------------+ | openPos variable |--+ +-------------------+ | | +-------------------+ | +-----------+ | openPos argument |--+---->| the array | +-------------------+ | +-----------+ | | 0: 1 | +-------------------+ | | 1: 5 | | startPos variable |--+ +-----------+ +-------------------+
与您使用的引用无关,当您修改这些引用指向的状态时,您可以看到所有引用的更改。
如果您不想共享阵列,则需要复制一份,Bathsheba shows in her answer(+1):
int[] startPos = openPos.clone();
答案 2 :(得分:1)
尝试克隆/复制数组。
console.log('Start'); **-> Printed #1 **
setTimeout(function() {
console.log('First timeout'); **-> Pushed to eventloop #1 **
}, 100);
setTimeout(function () {
console.log('Second timeout');**-> Pushed to eventloop #3 !! **
}, 2000);
var time = Date.now();
for (var i = 0; i < 2000000000; i++) {
var temp = i * i * Math.sqrt(i);
temp = temp + temp;
}
console.log(Date.now() - time); **-> Printed #2 **
setTimeout(function () {
console.log('Third timeout'); **-> Pushed to eventloop #2 !!**
}, 50);
console.log('End'); **-> Printed #3 **
你在这里玩相同的参考。