List以特定的索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象equals()方法来区分元素是否重复)。Map保存键值对映射,映射关系可以是一对一,多对一。 Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度是O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键构成排序树从而达到排序和去重的目的
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,他们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入慢,Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上比Array List差,已经很少用了。LInkedList使用的是双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按需要索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项就行了,所以插入速度快。如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换为线程安全的容器在使用
List和Set是,Map不是。Map是键值对映射容器,与List和Set有明显区别,而Set存储的零散的元素且不允许有重复元素,List是线性结构的容器,适用于按数值索引访问元素。
常用的 List Map List的具体实现包括了ArrayList和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何数据类型对象的元素列表。List适合用于按数值索引访问元素。 Map提供了一个更通用的元素存储方法。Map集合类用于存储元素对(称作 键和值),其中每个键映射到一个值
Collection是集合类的上级接口,继承与他的接口主要有Set和List。 Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索,排序,线程安全化的操作
ArrayList和Linked List都实现了List接口,他们有以下不同点: ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和他的前一个和后一个元素链接在一起,查找某个元素的时间复杂度就是O(n)。 相对于ArrayList,LinkedList的插入,添加,删除操作更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。 LinkedLsit比ArrayList更占内存,因为LinkedList为每一个节点存储了两个索引,一个指向前一项元素,一个指向后一项元素。
HashMap和HashTable都实现了Map接口,特性相似,但还有不同: 1.HashMap允许一个键为null,多个值为null,而HashTable不允许键值为Null 2.Hashtable是同步的,而Hash Map不是。因此 hashMap更适合单线程环境,hashtable适合多线程环境。 3.HashMap提供了可供应用迭代的键的集合,因此HashMap是快速失败的。另一方面,Hashtable提供了对键的列举 一般认为Hashtable是一个遗留问题。
iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。java.util包下面的所有的集合类都是快速失败,而Java.util.concurrent包下面的所有的类都是安全失败。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常
1.Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。 2.iterator对集合只能是向前遍历,ListIterator既可以向前也可以向后。 3.ListIterator实现了Iterator接口,并包含了其他功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引等等
Iterator提供了统一遍历操作集合元素的同意接口,Collection接口实现Iterable接口,每个集合都通过实现Iterable接口中的Iterator()方法返回Iterator接口的实例,然后对集合的元素进行迭代操作。 在迭代元素的时候不能通过集合的方法删除元素,负责抛出ConcurrentModificationException异常,但可以通过Iterator接口中的remove()方法进行删除
