gpt4 book ai didi

java - Arraylist 在不应该的时候得到排序?

转载 作者:行者123 更新时间:2023-11-29 08:34:33 25 4
gpt4 key购买 nike

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

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]

为什么当我调用方法 bubbleSort() 时,ArrayList list 得到排序?当我将它称为 bubbleSort(list) 并且不对 list 本身进行排序时,该方法不应该创建 list 的实例吗?范围?我只是想让 bubbleSort 通过创建 list 的实例来获得 list 的最小值,使用冒泡排序对该实例进行排序,然后返回第一个该实例的值。我错过了一些非常明显的东西吗?我对这个问题感到沮丧,真的很累......

最佳答案

Shouldn't the method be making an instance of list when I call it as bubbleSort(list) and not sort list itself which is outside its scope?

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

list 变量中的值是一个对象引用,它告诉 JVM 该列表对象在内存中的位置。 (我们永远不会看到实际值,但可以将它们视为类似 int 的数字;它们的行为与它们完全相同。)如果将该值传递给方法,则该方法会收到该值的副本(对象引用)— 但该对象引用仍然引用同一个对象。

这和这里发生的完全一样:

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

让我们分解一下。当我们做的时候

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

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

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

Then when we do this:

List<String> list2 = list1;

该值(在上面显示为 Ref22135,但同样,我们从未看到它们)被复制list2 中:

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

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

出于同样的原因,将 list 传递给 bubbleSort 会复制 list 变量的 value(Ref22135 或随便)放入 bubbleSort 参数,而不是列表本身。

关于java - Arraylist 在不应该的时候得到排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45281576/

25 4 0