一、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
}