我的mergesort算法有一些奇怪的运行时间...我想在同一个置换的ArrayList上运行算法(比如说1000次)。现在,我只是创建一个大小为1000的ArrayList数组,然后计算对每个数组进行排序所需的时间,然后取平均值。
所以我的问题是:我是否一遍又一遍地对同一个列表进行排序?如果我在数组中更改一个ArrayList的实例,比如在索引0处,那么数组中的其他ArrayLists是否会保持不变?我会这么认为,但我想确定没有发生?感谢。
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]);
}
答案 0 :(得分:1)
如果我在数组中更改ArrayList中的一个实例,比如索引0,那么数组中的其他ArrayLists是否会保持不变?
是的,在索引0处修改ArrayList不会影响其他索引。 (但要确保其他索引没有引用相同的ArrayList)
Scenerio 1 :(修改索引0将影响索引1)
ArrayList[] arr = new ArrayList[2];
ArrayList aList = new ArrayList();
arr[0] = aList;
arr[1] = aList;
Scenerio 2 :(修改索引0不会影响索引1)
ArrayList[] arr = new ArrayList[2];
ArrayList aList1 = new ArrayList();
ArrayList aList2 = new ArrayList();
arr[0] = aList1;
arr[1] = aList2;
因此,请确保代码中的Scenerio 2。
编辑:
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
}
您正在为每个索引添加相同的引用。因此,在任何索引处修改都会影响剩余的索引。
答案 1 :(得分:0)
是的,其他ArrayList
将保持不变
例如。
array[0].set(0,object)
不会影响ArrayList
array[1]
答案 2 :(得分:0)
你说你创建了一个ArrayLists数组,但是你为该数组中的每个插槽分配了什么?您是否创建了一个ArrayList实例并将其分配给阵列中的所有1000个插槽,或者您是否创建了1000个不同的ArrayLists(例如,在循环中使用new
)并为每个阵列插槽分配不同的一个?
如果在多个位置存储对同一对象的多个引用,则通过所有引用可以看到对该对象的更改。
答案 3 :(得分:0)
如果你只是创建一个ArrayList对象数组,那么它们都是null。如果然后遍历数组并使用new实例化每个ArrayList,那么它们都是不同的(每次调用new ArrayList()都会创建一个新的。)
可以通过创建ArrayList,然后遍历数组并为数组的每个元素分配(已创建的)ArrayList的值,将相同的ArrayList引用放在数组的每个元素中。这可能不是你想要做的。