public static void main(String[] args) throws InterruptedException {Random random = new Random();List<Integer> list = new ArrayList<>();for (int i = 0; i < 1000000; i++) {list.add(random.nextInt(Integer.MAX_VALUE));}List<Integer> list2 = new ArrayList<>();for (int i = 0; i < 1000000; i++) {list2.add(random.nextInt(Integer.MAX_VALUE));}}
1.retainAll。list的retainAll底层使用两层for循环,太慢了。
// 685msSet<Integer> set = new HashSet<>(list);Set<Integer> set2 = new HashSet<>(list2);set.retainAll(set2);public boolean retainAll(Collection<?> c) {Objects.requireNonNull(c);boolean modified = false;Iterator<E> it = iterator();while (it.hasNext()) {if (!c.contains(it.next())) {it.remove();modified = true;}}return modified;}
2.双指针
// 650msCollections.sort(list);Collections.sort(list2);Set<Integer> set = new HashSet<>();int m = 0;int n = 0;int len1 = list.size();int len2 = list2.size();while (m < len1 && n < len2) {Integer item1 = list.get(m);int result = item1.compareTo(list2.get(n));if (result == 0) {set.add(item1);m++;n++;} else if (result > 0) {n++;} else {m++;}}
3.位图
// 380msBitSet bitSet = new BitSet(Collections.max(list));BitSet bitSet2 = new BitSet(Collections.max(list2));for (int i = 0; i < list.size(); i++) {bitSet.set(list.get(i));}for (int i = 0; i < list2.size(); i++) {bitSet2.set(list2.get(i));}bitSet.and(bitSet2);
