首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Collections.shuffle方法简介

今天看Motan的一致性Hash负载的源码时,发现下面一段代码:

//把服务扩展1000倍,并打乱服务的顺序。

for (int i = 0; i

Collections.shuffle(copyReferers);

for (Referer ref : copyReferers) {

tempRefers.add(ref);

}

}

其中的Collections.shuffle(copyReferers);就是把服务随机打乱顺序。

下面看看shuffle方法的定义:

public static void shuffle(List list)//默认的随机算法把集合顺序打乱

public static void shuffle(List list, Random rnd) //用指定算法把集合顺序打乱

看下JDK的源码:

1、如果是列表的长度小于5或者列表实现是随机访问接口,就直接在列表中调整顺序

2、其他情况,把列表转成对象数组,把数组的存储的值的顺序打乱,然后再把数组转成列表。

可见源码中考虑代价问题了,列表小的时候直接调整的代价很小,如果列表很大的情况,直接在列表中调整会有效率问题,转成数组,数组查找的效率很高,调换代价就小很多了。

public static void shuffle(List list, Random rnd) {

int size = list.size();

if (size

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));

// Dump array back into list

// instead of using a raw type here, it's possible to capture

// the wildcard but it will require a call to a supplementary

// private method

ListIterator it = list.listIterator();

for (int i=0; i

it.next();

it.set(arr[i]);

}

}

}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200208A08JAQ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券