一氯哮、List集合常見的子類有:
1脂凶、ArrayList:
底層數(shù)據(jù)結(jié)構(gòu)是Objetc數(shù)組敲街,查詢快,增刪慢。線程不安全摆尝,效率高温艇。
2、Vector:
底層數(shù)據(jù)結(jié)構(gòu)是Objetc數(shù)組堕汞,查詢快勺爱,增刪慢。線程安全讯检,效率低琐鲁,因為它給整個方法上面添加了synchronized,太笨重了人灼。
3围段、LinkedList:
底層數(shù)據(jù)結(jié)構(gòu)是雙向鏈表,查詢慢投放,增刪快奈泪。線程不安全,效率高灸芳。
4段磨、CopyOnWriteArrayList:
底層數(shù)據(jù)結(jié)構(gòu)是Objetc數(shù)組,查詢快耗绿,增刪慢。線程安全砾隅。
● ArrayList的一個線程安全的變體误阻,其中所有可變操作(add、set 等等)都是通過對底層數(shù)組進行一次新的復制來實現(xiàn)的晴埂。
● 這一般需要很大的開銷究反,但是當遍歷操作的數(shù)量大大超過可變操作的數(shù)量時,這種方法可能比其他替代方法更有效儒洛。
在不能或不想進行同步遍歷精耐,但又需要從并發(fā)線程中排除沖突時,它也很有用琅锻。
● 允許使用所有元素卦停,包括 null。
● 此數(shù)組在迭代器的生存期內(nèi)不會更改恼蓬,因此不可能發(fā)生沖突惊完,并且迭代器保證不會拋出 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]
}
● 創(chuàng)建迭代器以后,迭代器就不會反映列表的添加荷辕、移除或者更改凿跳。在迭代器上進行的元素更改操作(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
}