ringa_lee
for (int i=size; i>1; i--) swap(list, i-1, rnd.nextInt(i));
shuffle搅乱列表顺序,使用Random生成索引(随机数),将i-1的元素与随机索引交换。循环collection.size()次。
shuffle
Random
i-1
collection.size()
这种问题直接看源码就好啦。
@SuppressWarnings({"rawtypes", "unchecked"}) public static void shuffle(List<?> list, Random rnd) { int size = list.size(); if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) { for (int i=size; i>1; i--) swap(list, i-1, rnd.nextInt(i)); } else { Object arr[] = list.toArray(); // Shuffle array for (int i=size; i>1; i--) swap(arr, i-1, rnd.nextInt(i)); ListIterator it = list.listIterator(); for (int i=0; i<arr.length; i++) { it.next(); it.set(arr[i]); } } }
以上是JDK的源码,核心的方法就是这个shuffle,去掉了部分注释。shuffle,去掉了部分注释。
首先获取集合的元素个数,如果小于5个或者实现了RandomAccess接口,就循环一遍,随机交换集合中两个相邻的元素的位置,RandomAccess是一个标记接口,如果实现了这个接口就表示支持快速的随机访问操作,类似于数组。
RandomAccess
如果大于等于5个元素也没有实现RandomAccess接口,那么就转为数组,之后也是循环,随机交换集合中两个相邻的元素的位置,最后再将数组放回原来的list
list
就是最Collection进行『近似』随机打乱,原理很简单,基于随机数生成器,随机交互Collection的元素顺序。
shuffle
搅乱列表顺序,使用Random
生成索引(随机数),将i-1
的元素与随机索引交换。循环collection.size()
次。这种问题直接看源码就好啦。
以上是JDK的源码,核心的方法就是这个
shuffle
,去掉了部分注释。shuffle
,去掉了部分注释。首先获取集合的元素个数,如果小于5个或者实现了
RandomAccess
接口,就循环一遍,随机交换集合中两个相邻的元素的位置,RandomAccess
是一个标记接口,如果实现了这个接口就表示支持快速的随机访问操作,类似于数组。如果大于等于5个元素也没有实现
首先获取集合的元素个数,如果小于5个或者实现了RandomAccess
接口,那么就转为数组,之后也是循环,随机交换集合中两个相邻的元素的位置,最后再将数组放回原来的list
RandomAccess
接口,就循环一遍,随机交换集合中两个相邻的元素的位置,RandomAccess
是一个标记接口,如果实现了这个接口就表示支持快速的随机访问操作,类似于数组。🎜 🎜如果大于等于5个元素也没有实现RandomAccess
接口,那么就转为数组,之后也是循环,随机交换集合中两个相邻的元素的位置,最后再将数组放回原来的list
中。🎜就是最Collection进行『近似』随机打乱,原理很简单,基于随机数生成器,随机交互Collection的元素顺序。