code: public static <T> List<T> intersection(final List<? extends T> list1, final List<? extends T> list2) {
  		List<? extends T> smaller = list1;
  		List<? extends T> larger = list2;
  		if (list1.size() > list2.size()) {
  			smaller = list2;
  			larger = list1;
  		}
  
  		// 克隆一个可修改的副本
  		List<T> newSmaller = new ArrayList<T>(smaller);
  		List<T> result = new ArrayList<T>(smaller.size());
  		for (final T e : larger) {
  			if (newSmaller.contains(e)) {
  				result.add(e);
  				newSmaller.remove(e);
  			}
  		}
  		return result;
  	}
docs: list1, list2的交集（同时在list1和list2的对象），产生新List
  
  copy from Apache Common Collection4 ListUtils，但其做了不合理的去重，因此重新改为性能较低但不去重的版本
  
  与List.retainAll()相比，考虑了的List中相同元素出现的次数, 如"a"在list1出现两次，而在list2中只出现一次，则交集里会保留一个"a".