Java 在数组中多次存储同一引用项,一次更改是否会影响所有引用项?
我得到了一些奇怪的运行时间为我的mergesort算法…我想运行算法(说1000次)在同一个排列ArrayList。现在,我只是创建一个大小为1000的ArrayList数组,然后计算每个数组的排序时间,然后计算平均时间 所以我的问题是:我是否在一遍又一遍地对同一个列表进行排序?如果我更改数组中ArrayList的一个实例,比如在索引0处,数组中的其他ArrayList会保持不变吗?我想是的,但我想确定这不会发生?谢谢Java 在数组中多次存储同一引用项,一次更改是否会影响所有引用项?,java,arrays,performance,arraylist,Java,Arrays,Performance,Arraylist,我得到了一些奇怪的运行时间为我的mergesort算法…我想运行算法(说1000次)在同一个排列ArrayList。现在,我只是创建一个大小为1000的ArrayList数组,然后计算每个数组的排序时间,然后计算平均时间 所以我的问题是:我是否在一遍又一遍地对同一个列表进行排序?如果我更改数组中ArrayList的一个实例,比如在索引0处,数组中的其他ArrayList会保持不变吗?我想是的,但我想确定这不会发生?谢谢 for (int N = 1000; N <= 10000;
for (int N = 1000; N <= 10000; N += 1000) {
//copy the array
@SuppressWarnings("unchecked")
ArrayList<Integer>[] container = (ArrayList<Integer>[])new ArrayList[N];
ArrayList<Integer> testArray1 = generatePermutedOrder(N);
for(int j=0; j<timesToLoop; j++){
container[j] = testArray1;
}
System.out.print(N + "\t");
// let things stabilize
startTime = System.nanoTime();
while (System.nanoTime() - startTime < 1000000000)
;
// time the routine
startTime = System.nanoTime();
for (int i = 0; i < timesToLoop; i++) {
mergesort(container[i]);
}
for(int N=1000;NYes另一个ArrayList
将保持不变。
比如说
array[0].set(0,object)
不会影响array[1]
如果我更改数组中ArrayList的一个实例,比如在索引0处,数组中的其他ArrayList会保持不变吗
是,修改索引0处的ArrayList不会影响其他索引。(但请确保其他索引没有对同一ArrayList的引用)
场景1:(修改索引0将影响索引1)
场景2:(修改索引0不会影响索引1)
所以,请确保代码中是Scenerio 2
编辑:
ArrayList testArray1=generatePermutedOrder(N);
对于(int j=0;j您说过您创建了一个ArrayList数组,但是您为该数组中的每个插槽分配了什么?您是创建了一个ArrayList实例并将其分配给数组中的所有1000个插槽,还是创建了1000个不同的ArrayList(例如,在循环中使用new
)并为每个数组插槽分配了不同的ArrayList
如果将对同一对象的多个引用存储在多个位置,则对该对象的更改将通过所有引用可见。如果仅创建ArrayList对象数组,则这些对象都为空。如果随后迭代数组并使用new实例化每个ArrayList,则它们都是不同的(每次调用new ArrayList)()将创建一个新的)
通过创建ArrayList,然后在数组中迭代,并为数组的每个元素分配(已创建的)ArrayList的值,可以在数组的每个元素中放置相同的ArrayList引用。这可能不是您想要做的。如果您使用相同的ArrayList对象(一个新ArrayList),则是()
)然后所有操作都将在同一个对象上完成。幸运的是,复制一个副本很简单-构造函数/addAll。是的,我想我可能会遇到问题。如何在不声明1000个不同的ArrayList的情况下高效地执行案例2(显然无法手动执行)?如果ArrayList
的内容是相同的,为什么要一次又一次地mergesort
呢?我想运行多次,这样我就可以得到一个平均时间。只运行一次并不一定代表平均情况。不过,我的教授说我需要这么做……所以,不要创建太多ArrayList
在开始处。在每次交互中,将原始文件复制到新文件,然后传递到mergesort
。
ArrayList[] arr = new ArrayList[2];
ArrayList aList = new ArrayList();
arr[0] = aList;
arr[1] = aList;
ArrayList[] arr = new ArrayList[2];
ArrayList aList1 = new ArrayList();
ArrayList aList2 = new ArrayList();
arr[0] = aList1;
arr[1] = aList2;
ArrayList<Integer> testArray1 = generatePermutedOrder(N);
for(int j=0; j<timesToLoop; j++)
{
container[j] = testArray1; // same reference pointing to same ArrayList is added in each interation
}