java集合。洗牌(a)魔术?
魔术过后
系统出来println(“****”);
收藏。洗牌(a)
~$java-版本 java版本“1.8.0_101” Java(TM)SE运行时环境(build 1.8.0_101-b13) Java HotSpot(TM)64位服务器虚拟机(构建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]
洗牌后的b(a)不是a.子列表(0,a.size()-1)后的eq b; \
UPD
是的!一步一步地!1) 创建a 2)创建b子列表a 3)随机播放(a)为什么随机播放(a)修改b强>
UPD 2
为什么是正确的?为什么当我洗牌b,改变a的顺序时这是真的强>
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]
# 1 楼答案
b
是a view on the first 4 elements of ^{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
是一个独立的列表,创建b1
后对a
所做的更改对b1
没有影响# 2 楼答案
这是因为在洗牌
a
之后,您也会洗牌b1
和b
,因此b
和b1
都不会显示您期望的结果。相反,您应该仅对进行洗牌a
,以查看作为a
子列表上的视图的b
采用相同的顺序,而作为新列表的b1
保持独立于a
的重新排序输出: