在項目中看到一段代碼:
return new ArrayList<>(new HashSet<LabelEnum>(list));
當時我的表情是這樣的:
這把list作爲構造參數創建新的集合來返回是要做什麼,這裏的list也是ArrayList集合,這樣繞了一圈返回,恩,
想起一句話“存在即是合理”開始琢磨業務需要:list中的元素不能有重複。
那爲什麼不直接用HashSet呢?
因爲這個list到時是要存入DTO中,所以儘量不修改原來的代碼。使用list轉換set再轉回list,達到集合元素去重複的目的。
Set與List之間轉化:
- List list = new ArrayList(set);
- Set set = new HashSet(list);
但是有一點,轉換當中可能要丟失數據,尤其是從list轉換到set的時候,因爲set不能有重複數據
測試:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Collections.addAll(list, "haha", "xixi", "huihui", "haha", "aaa");//填充
System.out.println("list:" + list);
Set<String> set = new HashSet<>(list);//通過構造函數給set填充list中的數據,內部就是初始化後調用的addAll(Collection<T>)
// set.addAll(list);//或者用addAll(Collection<T>)方法給set填充,這時重複的數據"haha"將只存儲第一個
System.out.println("set:" + set);
list.clear();//清空list,不然下次把set元素加入此list的時候是在原來的基礎上追加元素的
list.addAll(set);//把set的內容填充給list
System.out.println("list:" + list);
}
結果:
list:[haha, xixi, huihui, haha, aaa] //說明list是有序的,可以存重複數據
set:[aaa, haha, xixi, huihui] //說明set是無序的,不可以存重複數據
list:[aaa, haha, xixi, huihui]