java容器---Collection{list{LinkedList ,ArrayList,Vector},Set}
Java容器:
Collection
├List???????接口
│├LinkedList???????链表
│├ArrayList?????????顺序结构动态数组类
│└Vector?????????向量
│?└Stack???????栈
└Set
Map
├Hashtable
├HashMap
└WeakHashMap?
首先介绍Collection接口:
??Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。
Java?SDK不提供直接继承自Collection的类,Java?SDK提供的类都是继承自Collection的“子接口”如List和Set。
???
??
2.???????Linkedlist,arrylist,此实现不是同步的。如果多个线程同时访问一个ArrayList或链接列表实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用Collections.synchronizedList
方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:
List list = Collections.synchronizedList(new ArrayList(...));
List list = Collections.synchronizedList(new LinkedList(...));
vector的Vector中的所有方法前面都有一个synchronized关键字做修饰,是线程安全的。
?
3.??Linkedlist,arrylist,vector类的iterator 和 listIterator方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出ConcurrentModificationException
。因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。因此实际应用是,先通过iterator和 listIterator遍历数组,确定元素后再进行增,删时,应用迭代器自身的方法来,修改是否类似?个人觉得也不能在迭代器中修改。如果修改,重新生成迭代器。