需求:從 mAllList 中去除全部 mSubList 中與之重複的元素
測試數據:mAllList 中包含100000個無序無重複字符串,mSubList 中包含50000個無序無重複字符串
測試
mAllList.removeAll(mSubList);
某次測試耗時:185665mscode
雙重循環分爲內外兩層循環,通過測試,將元素多的list放在外層循環效率更高(mSubList中的元素可能比mAllList多)(被刪除元素的列表mAllList放在外層循環和內層循環的實現方式有些差異),這裏的測試數據是mAllList中的元素多,實現以下:rem
int maxSize = mAllList.size(); for (int i = maxSize-1; i >=0; i--) { int size = mSubList.size(); while (size > 0) { String s = mSubList.get(size-1); if (s.equals(mAllList.get(i))) { mSubList.remove(size-1); mAllList.remove(i); break; } size--; } }
某次測試耗時:101510ms字符串
//第一步:構建mAllList的HashMap //將mAllList中的元素做爲鍵,若是不是String類,須要實現hashCode和equals方法 //將mAllList中的元素對應的位置做爲值 Map<String, Integer> map = new HashMap<>(); for (int i = 0; i < mAllList.size(); i++) { map.put(mAllList.get(i), i); } //第二步:利用map遍歷mSubList,查找重複元素 //把mAllList中全部查到的重複元素的位置置空 for (int i = 0; i < mSubList.size(); i++) { Integer pos = map.get(mSubList.get(i)); if (pos==null) { continue; } mAllList.set(pos, null); } //第三步:把mAllList中全部的空元素移除 for (int i = mAllList.size()-1; i>=0; i--) { if (mAllList.get(i)==null) { mAllList.remove(i); } }
某次測試耗時:712msget
int pos = map.get(mSubList.get(i));
取值,會崩潰Integer pos = map.get(mSubList.get(i));
取值,而後判斷 pos 是不是空來判斷map中是否包含鍵是mSubList.get(i)
的值,比用map.containsKey(key)來判斷而後get取值少訪問一次哈希表HashMap不瞭解的能夠看下Java HashMap原理解析hash