java数组改组

时间:2010-12-02 12:26:28

标签: java arrays

我注意到,根据列表的创建方式,底层的int数组会发生变化:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;


public class Shuffling {

    static Integer[] intArr = {1, 2, 3, 4, 5};
    static Random random = new Random(7);
    public static void main(String[] args) {

        List<Integer> intList = new ArrayList<Integer>(Arrays.asList(intArr));
        Collections.shuffle(intList, random);
        System.out.println("List after shuffling: " + intList);
        System.out.println("intArr: " + Arrays.toString(intArr));
        //OUTPUT:
        //List after shuffling: [5, 4, 1, 3, 2]
        //intArr: [1, 2, 3, 4, 5]


        List<Integer> intList2 = Arrays.asList(intArr);
        Collections.shuffle(intList2, random);
        System.out.println("List2 after shuffling: " + intList2);
        System.out.println("intArr: " + Arrays.toString(intArr));
        //OUTPUT:
        //List2 after shuffling: [5, 3, 4, 2, 1]
        //intArr: [5, 3, 4, 2, 1]
    }
}

为什么会这样?

5 个答案:

答案 0 :(得分:9)

Arrays.asList()构造一个由原始数组支持的特殊列表。

这就是为什么列表不支持Collection接口中的(可选)add()remove()方法(使用数组不可能)。

有趣的是,返回的类名为ArrayList,但不要与java.util.ArrayList混淆。

System.out.println(
    Arrays.asList("1", "2", "3")
    .getClass().getName()
);
// Output: java.util.Arrays$ArrayList

答案 1 :(得分:3)

来自Arrays.asList(T... a)的{​​{1}}:

  

返回指定数组的固定大小列表支持。 (对返回列表的更改“直写”到数组。)

答案 2 :(得分:2)

引用API link text

public static <T> List<T> asList(T... a)
  

返回由指定数组支持的固定大小的列表。 (对返回列表的更改“直写”到数组。)

因此,您对intList2执行的任何更改都会对intArr产生影响。 另一方面,ArrayList的构造函数将复制元素,因此对intList中的顺序所做的更改不会影响intArr(因为元素被复制)

答案 3 :(得分:1)

List<Integer> intList = new ArrayList<Integer>(Arrays.asList(intArr));

在intList中,您获得了数组的浅表副本。浅拷贝意味着,您只复制数组本身,而不是它所拥有的元素。 (还有一个深层副本。它意味着一个完整的数组副本。)

List<Integer> intList2 = Arrays.asList(intArr);

在intList2中,您获得了相同的数组。甚至不是浅拷贝。每当你改变intList2时,你也修改intArr。

答案 4 :(得分:0)

实际的变化是传递给随机方法的随机种子。每次调用shuffle方法时,它都会从Random实例中获取下一个不同的数字。