一、List集合常見的子類有:
1、ArrayList:
底層數據結構是Objetc數組,查詢快,增刪慢。線程不安全,效率高。
2、Vector:
底層數據結構是Objetc數組,查詢快,增刪慢。線程安全,效率低,因為它給整個方法上面添加了synchronized,太笨重了。
3、LinkedList:
底層數據結構是雙向鏈表,查詢慢,增刪快。線程不安全,效率高。
4、CopyOnWriteArrayList:
底層數據結構是Objetc數組,查詢快,增刪慢。線程安全。
● ArrayList的一個線程安全的變體,其中所有可變操作(add、set 等等)都是通過對底層數組進行一次新的復制來實現的。
● 這一般需要很大的開銷,但是當遍歷操作的數量大大超過可變操作的數量時,這種方法可能比其他替代方法更有效。
在不能或不想進行同步遍歷,但又需要從并發線程中排除沖突時,它也很有用。
● 允許使用所有元素,包括 null。
● 此數組在迭代器的生存期內不會更改,因此不可能發生沖突,并且迭代器保證不會拋出 ConcurrentModificationException。
【即允許迭代器遍歷集合,集合修改元素】
案例:
public static void main(String[] args) {
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("Hello");
list.add("world");
list.add("java");
//允許迭代器遍歷集合,集合修改元素
ListIterator iterator = list.listIterator();
while (iterator.hasNext()) {
String s = (String) iterator.next();
if("world".equals(s)) {
list.add("PGH");
}
System.out.print(s + " "); //Hello world java 迭代器中元素不變
}
System.out.println(list); //[Hello, world, java, PGH]
}
● 創建迭代器以后,迭代器就不會反映列表的添加、移除或者更改。在迭代器上進行的元素更改操作(remove、set 和 add)不受支持。
這些方法將拋出 UnsupportedOperationException。
【即不允許迭代器遍歷集合,迭代器修改元素】
案例:
public static void main(String[] args) {
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("Hello");
list.add("world");
list.add("java");
//不允許迭代器遍歷集合,迭代器修改元素,報錯UnsupportedOperationException
ListIterator iterator = list.listIterator();
while (iterator.hasNext()) {
String s = (String) iterator.next();
if("world".equals(s)) {
iterator.add("PGH");
}
}
System.out.println(list); //java.lang.UnsupportedOperationException
}