一、優點
1、避免引用傳遞
List<String> oldList = Arrays.asList("a", "b", "c");
List<String> newList = new ArrayList<>(oldList);
newList.set(0, "d");
System.out.println(oldList);
System.out.println(newList);
上面的代碼中,我們聲明了一個oldList作為原始的List,然後又創建了一個newList來拷貝oldList。然後我們修改了newList的元素,最後輸出oldList和newList,發現oldList並沒有被改變。由此可見,因為我們使用了javalist拷貝,我們避免了引用傳遞。
2、原始List不會被更改
List<String> oldList = Arrays.asList("a", "b", "c");
List<String> newList = new ArrayList<>(oldList);
newList.set(0, "d");
System.out.println(oldList);
System.out.println(newList);
同樣的代碼中,我們修改了newList的元素,但是oldList沒有被更改。這是因為我們使用了javalist拷貝,可以有效的避免修改原始List。
3、數組類型轉換方便
List<String> oldList = Arrays.asList("a", "b", "c");
String[] arr = new String[oldList.size()];
arr = oldList.toArray(arr);
System.out.println(Arrays.toString(arr));
在上面的代碼中,我們將List轉換為數組。通過javalist拷貝,我們可以更加方便地進行數組類型轉換。
二、缺點
1、效率問題
List<String> oldList = Arrays.asList("a", "b", "c");
List<String> newList = new ArrayList<>(oldList);
雖然javalist拷貝很方便,但是它需要創建一個新的List對象,並且將原始List中的元素一個一個地添加到新List中。這個過程中,需要大量的時間和空間,因此效率不高。
2、線程安全問題
List<String> oldList = Arrays.asList("a", "b", "c");
List<String> newList = new ArrayList<>(oldList);
在多線程環境下,javalist拷貝可能會導致線程安全問題。如果多個線程同時訪問同一個List對象,並且其中一個線程修改了List中的元素,那麼其他線程也會受到影響。
三、如何實現javalist拷貝
1、使用循環來實現
List<String> oldList = Arrays.asList("a", "b", "c");
List<String> newList = new ArrayList<>();
for (String s : oldList) {
newList.add(s);
}
System.out.println(oldList);
System.out.println(newList);
在上面的代碼中,我們使用了循環來實現javalist拷貝。當然,這種方法需要較多的代碼量,並且效率較低。
2、使用Collections.copy()方法
List<String> oldList = Arrays.asList("a", "b", "c");
List<String> newList = new ArrayList<>(oldList.size());
Collections.copy(newList, oldList);
System.out.println(oldList);
System.out.println(newList);
而使用Collections.copy()方法則更加簡單方便,可以實現快速的javalist拷貝。但是,這種方法只適用於泛型List,對於其它類型的List則無法使用。
3、使用Object.clone()方法
List<String> oldList = Arrays.asList("a", "b", "c");
List<String> newList = ((ArrayList<>) oldList).clone();
System.out.println(oldList);
System.out.println(newList);
最後,我們還可以使用Object.clone()方法來實現javalist拷貝,它可以快速地生成一個與原始List對象相同的新對象,並複製原始對象中的值。但是,注意Object.clone()方法只適用於實現了Cloneable接口的對象。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/247331.html