今天看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]);
}
}
}
领取专属 10元无门槛券
私享最新 技术干货