Arraylist在不应该排序时进行排序?

时间:2017-07-24 13:11:10

标签: java arraylist scope

我对这个问题感到非常沮丧。以下是正在发生的事情的要点:

import static java.lang.System.*;
import java.util.ArrayList;
public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(12);
        list.add(19);
        list.add(442);
        list.add(3);
        list.add(1);
        list.add(9);
        out.println(list.toString());
        out.println(bubbleSort(list));
        out.println(list.toString());
    }
    public static int bubbleSort(ArrayList<Integer> num) {
        int j;
        boolean flag = true;
        int temp;
        while(flag) {
            flag = false;
            for(j = 0; j < num.size() - 1; j++) {
                if(num.get(j) > num.get(j + 1)) {
                    temp = num.get(j);
                    num.set(j, num.get(j + 1));
                    num.set(j + 1, temp);
                    flag = true;
                }
            }
        }
        return num.get(0);
    }
}

输出结果为:

[12, 19, 442, 3, 1, 9] 1 [1, 3, 9, 12, 19, 442]

为什么在调用方法list时,ArrayList bubbleSort()会被排序?当我将list称为bubbleSort(list)并且不在其范围之外的list排序时,该方法是否应该制作bubbleSort的实例?我只希望list通过创建list的实例来获取Events.on(engine, 'collisionStart', function(event) { console.log(event) }); 的最小值,使用冒泡排序对该实例进行排序,并返回该实例的第一个值。我错过了一些非常明显的东西吗我对这个问题感到沮丧,我真的很累...

2 个答案:

答案 0 :(得分:4)

  

当我将list称为bubbleSort(list)并且不在其范围之外排序list时,该方法不应该制作list的实例吗?

没有。传递引用对象的值(称为对象引用)不涉及复制对象,只涉及值。

int变量中的值是一个对象引用,它告诉JVM该列表对象在内存中的位置。 (我们从未看到实际值,但将它们视为像List<String> list1 = new ArrayList<>(); List<String> list2 = list1; s这样的数字;它们的行为与它们完全相同。)如果将该值传递给方法,则该方法会接收该值的副本(对象引用) ) - 但该对象引用仍然引用相同的对象。

这与此处发生的完全相同:

List<String> list1 = new ArrayList<>();

让我们分解吧。当我们做的时候

new

ArrayList运算符使JVM在内存中创建list1,并在List<String> list2 = list1; 中存储对该列表的引用(JVM理解的唯一标识符):

list1<Ref22135>−−−+
                  |    +−−−−−−−−−−−−−−+
                  +−−−>| (ArrayList)  |
                       +−−−−−−−−−−−−−−+
                       | count: 0     |
                       | capacity: 16 |
                       | ...          |
                       +−−−−−−−−−−−−−−+

然后当我们这样做时:

list2

该值(在上面显示为Ref22135,但我们再也看不到它们)被复制list

list1<Ref22135>−−−+
                  |    +−−−−−−−−−−−−−−+
                  +−−−>| (ArrayList)  |
                  |    +−−−−−−−−−−−−−−+
list2<Ref22135>−−−+    | count: 0     |
                       | capacity: 16 |
                       | ...          |
                       +−−−−−−−−−−−−−−+

我们现在有两个对单个对象的引用副本,而不是两个对象。

出于同样的原因,将bubbleSort传递给list会将bubbleSort变量(Ref22135或其他)的复制到ValueEventListener参数,而不是列表本身。

答案 1 :(得分:0)

num已被ref保存,而不是按值保存,所以你需要做的就是代码

import static java.lang.System.*;
import java.util.ArrayList;
public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(12);
        list.add(19);
        list.add(442);
        list.add(3);
        list.add(1);
        list.add(9);
        out.println(list.toString());
        out.println(bubbleSort(list));
        out.println(list.toString());
    }
    public static int bubbleSort(ArrayList<Integer> num) {
        //copy the array list to new array list
        ArrayList<Integer> numtemp = new ArrayList<Integer>(num);
        int j;
        boolean flag = true;
        int temp;
        while(flag) {
            flag = false;
            for(j = 0; j < numtemp.size() - 1; j++) {
                if(numtemp.get(j) > numtemp.get(j + 1)) {
                    temp = numtemp.get(j);
                    numtemp.set(j, numtemp.get(j + 1));
                    numtemp.set(j + 1, temp);
                    flag = true;
                }
            }
        }
        return numtemp.get(0);
    }
}