Collections.shuffle(一)魔术?

Atu*_*tum -4 java java-8


System.out.println("*****")之后的魔术; Collections.shuffle(一);

〜$ java -version java version"1.8.0_101"Java(TM)SE运行时环境(版本1.8.0_101-b13)Java HotSpot(TM)64位服务器VM(版本25.101-b13,混合模式)

public static void main(String[] args) {

        List<Integer> a = Arrays.asList(1,  3,  5, 9, 14);
        Collections.shuffle(a);

        System.out.println(a);

        List<Integer> b = a.subList(0, a.size() - 1);
        List<Integer> b1 = new ArrayList<>(a.subList(0, a.size() - 1));
        System.out.println(b);
        System.out.println(b1);

        System.out.println("*****");
        Collections.shuffle(a);
        System.out.println(a);

        Collections.shuffle(b);
        System.out.println(b);

        Collections.shuffle(b1);
        System.out.println(b1);
}

[14, 1, 9, 3, 5]
[14, 1, 9, 3]
[14, 1, 9, 3]
*****
[14, 9, 3, 5, 1]
[3, 14, 9, 5]
[1, 14, 9, 3]
Run Code Online (Sandbox Code Playgroud)

b shuffle(a)a.subList(0,a.size() - 1)之后的eq b; \

UPD

是的!一步步!1)创建2)创建b子列表a 3)shuffle(a)为什么shuffle(a)修改b?

UPD 2

为什么是正确的?当我洗牌时为什么这是真的我改变了顺序?

    public static void main(String[] args) {
        List<Integer> a = Arrays.asList(1,  3,  5, 9, 14);
        Collections.shuffle(a);
        System.out.println(a);
        List<Integer> b = a.subList(0, a.size() - 1);
        System.out.println(b);
        System.out.println("*****");
        Collections.shuffle(b);
        System.out.println(a);



        System.exit(0);
}

[1, 9, 3, 5, 14]
[1, 9, 3, 5]
*****
[3, 9, 5, 1, 14]
Run Code Online (Sandbox Code Playgroud)

ass*_*ias 8

b一个视图上的前4个元素a.如果这些元素发生变化a,它们也会发生变化b.

所以你最初有:

  • a = {14, 1, 9, 3, 5}
  • b = {14, 1, 9, 3};

洗牌后a,你有:

  • a = {14, 9, 3, 5, 1}
  • b = {14, 9, 3, 5}

b1另一方面是一个独立的清单,a对创建后的更改b1没有影响b1.