我对这个问题感到非常沮丧。以下是正在发生的事情的要点:
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)
});
的最小值,使用冒泡排序对该实例进行排序,并返回该实例的第一个值。我错过了一些非常明显的东西吗我对这个问题感到沮丧,我真的很累...
答案 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);
}
}