public class MyClass { public static void main(String[] args) { /* int count=10; Random rand = new Random(); for (int i = 0; i < count; i++) { int num = rand.nextInt(count - i); System.out.println("num:"+num+","+rand.nextInt()); *//* KeyModel keyModelTemp = temp.get(num); KeyModel object = new KeyModel(keyModelTemp.getCode(),keyModelTemp.getLable()); resultList.add(object); temp.remove(num);*//* }*/ // random(1000);//300个 arraylist 耗时19毫秒 linklist耗时 5毫秒 int randomCount = 5000; System.out.println("测试数据:"+randomCount); randomByShuffle(randomCount);//1110毫秒 用的 linklist进行增加,但是这里面也会查询判断是否重复 randomByHashSetContain(randomCount);//1110毫秒 用的 linklist进行增加,但是这里面也会查询判断是否重复 random(randomCount);//143毫秒 randomByArrayListInitCount(randomCount);//5000个 451毫秒 randomContainByArrayListNotInitCount(randomCount);//143毫秒 randomContainByLinked(randomCount);//1110毫秒 用的 linklist进行增加,但是这里面也会查询判断是否重复 }
/** * 用系统的方法 * * @param count */ public static void randomByShuffle(int count) { LinkedList<Integer> integers = new LinkedList<>(); int countBackup = count; ConsumeTimeUtil.start(); for (int i = 0; i < count; i++) { integers.add(i);
} Collections.shuffle(integers);
long consumeTime = ConsumeTimeUtil.end(); System.out.println("list by shuffle:" + integers + ",\n耗时:" + consumeTime + "毫秒"); }
public static void randomByHashSetContain(int count) { LinkedHashSet<Integer> integers = new LinkedHashSet<>();//插入顺序可以保证,而且是唯一的. ConsumeTimeUtil.start();
/* for (int i = 0; i < count; i++) { integers.add(i); } */
while (integers.size() < count) { int i = new Random().nextInt(count); integers.add(i); } long consumeTime = ConsumeTimeUtil.end(); System.out.println("list by linkedhashset:" + integers + ",\n耗时:" + consumeTime + "毫秒"); } /** * 此方法需要先创建一套 * * @param count */ public static void random(int count) { LinkedList<Integer> integersSrc = new LinkedList<>();//linklist增删快,这里其实也用到了查询,综合测试,还是用linkedlist快. 优化了10多毫秒 for (int i = 0; i < count; i++) { integersSrc.add(i); }
ArrayList<Integer> integers = new ArrayList<>(integersSrc.size());//优化1 这里直接初始化已经确定的容量 在1000个的时候能优化几毫秒 ConsumeTimeUtil.start(); while (count > 0) { int randomIndex = new Random().nextInt(count); Integer currentObj = integersSrc.get(randomIndex); integersSrc.remove(currentObj);// integersSrc integers.add(currentObj); count--; } long consumeTime = ConsumeTimeUtil.end(); System.out.println("list by newlist_random_decrement:" + integers + ",\n耗时:" + consumeTime + "毫秒"); }
/** * @param count */ public static void randomByArrayListInitCount(int count) { ArrayList<Integer> integers = new ArrayList<>(count); int countBackup = count; ConsumeTimeUtil.start(); while (integers.size() < count) { int i = new Random().nextInt(countBackup); if (i == countBackup) { System.out.println("发现刚好末尾,直接减去1,增加随机有效概率"); i--; } if (integers.contains(i)) { // System.out.println("发现重复数值:"+i); continue; } else { integers.add(i); }
} long consumeTime = ConsumeTimeUtil.end(); System.out.println("list by arraylist-init-count contain:" + integers + ",\n耗时:" + consumeTime + "毫秒"); }
public static void randomContainByLinked(int count) { LinkedList<Integer> integers = new LinkedList<>(); int countBackup = count; ConsumeTimeUtil.start(); while (integers.size() < count) { int i = new Random().nextInt(countBackup); if (i == countBackup) { System.out.println("发现刚好末尾,直接减去1,增加随机有效概率"); i--; } if (integers.contains(i)) { // System.out.println("发现重复数值:"+i); continue; } else { integers.add(i); }
} long consumeTime = ConsumeTimeUtil.end(); System.out.println("list by contain linkedlist:" + integers + ",\n耗时:" + consumeTime + "毫秒"); }
public static void randomContainByArrayListNotInitCount(int count) { ArrayList<Integer> integers = new ArrayList<>(); int countBackup = count; ConsumeTimeUtil.start(); while (integers.size() < count) { int i = new Random().nextInt(countBackup); if (i == countBackup) { System.out.println("发现刚好末尾,直接减去1,增加随机有效概率"); i--; } if (integers.contains(i)) { // System.out.println("发现重复数值:"+i); continue; } else { integers.add(i); }
} long consumeTime = ConsumeTimeUtil.end(); System.out.println("list by contain arraylist-not-init_count:" + integers + ",\n耗时:" + consumeTime + "毫秒"); }
}
suffle的原理其实也差不多,只是避免重建
1 2 3 4 5 6 7 8 9 10 11
if (objectList instanceof RandomAccess) { for (int i = objectList.size() - 1; i > 0; i--) { int index = random.nextInt(i + 1); Keyboard.Key keyRandom = objectList.get(index); Keyboard.Key key = objectList.get(i); key.codes = keyRandom.codes; key.label = keyRandom.label;