变化值变化原因不明?

时间:2015-12-08 13:46:03

标签: java

我应该知道这个,但为什么这会将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;
}

3 个答案:

答案 0 :(得分:5)

startPos指的是与openPos相同的数组:两者都是引用int数组

int[] startPos = openPos; 会对openPos进行深层复制。

您的写作startPos[1] = 5;正在更改openPosfindCloseCurlBracket中将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 **

你在这里玩相同的参考。