java中集合-----Collection,学习集合,先理解Java集合框架,能够熟练使用java.util包中的相关接口进行开发。
1、类集合框架
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection接口
Collection是最基本的集合接口,一个Collection代表一组Object,Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。
List与Set:
接口 | 实现 | 历史集合类 |
Set | HashSet | |
TreeSet | ||
List | ArrayList | Vector |
LinkedList | Stack | |
Map | HashMap | Hashtable |
TreeMap | Properties |
这里没有 Collection
接口的实现。历史集合类,之所以这样命名是因为从 Java 类库 1.0 发行版就开始沿用至今了。
如果从历史集合类转换到新的框架类,主要差异之一在于所有的操作都和新类不同步。您可以往新类中添加同步的实现,但您不能把它从旧的类中除去。
Collection的集合接口
|————Set子接口:无序,不允许重复。
|————List子接口:有序,允许有重复元素。
List与Set的区别:
Set:检索元素效率低下,删除和插入效率高,删除和插入并且不会引起元素位置的变化。
List:和数组类似,List可以动态增长,查找元素效率高,删除与插入效率低,因为会引起其他元素位置的变化。
Iterator接口:
一些集合类提供了内容遍历的功能,通过java.util.Iterator接口。这些接口允许遍历对象的集合,依次操作每个元素对象。当使用Iterator时,在获得Iterator的时候包含一个集合快照。通常在遍历一个Iterator的时候不建议修改集合本省。
Iterator与ListIterator的区别:
Iterator:只能正向遍历集合,适用于获取移除元素。
ListIterator:继承Iterator,可以双向列表的遍历,同样支持元素的修改。
Map集合
HashMap与HashTable有什么区别?对比Hashtable VS HashMap
两者都是用key-value方式获取数据。Hashtable是原始集合类之一(也称作遗留类)。
HashMap作为新集合框架的一部分在Java2的1.2版本中加入。它们之间有一下区别:
● HashMap和Hashtable大致是等同的,除了非同步和空值(HashMap允许null值作为key和value,
而Hashtable不可以)。
● HashMap没法保证映射的顺序一直不变,但是作为HashMap的子类LinkedHashMap,
如果想要预知的顺序迭代(默认按照插入顺序),你可以很轻易的置换为HashMap,如果使用Hashtable就
没那么容易了。
● HashMap不是同步的,而Hashtable是同步的。
● 迭代HashMap采用快速失败机制,而Hashtable不是,所以这是设计的考虑点。
什么叫做快速失败特性
从高级别层次来说快速失败是一个系统或软件对于其故障做出的响应。一个快速失败系统设计用来
即时报告可能会导致失败的任何故障情况,它通常用来停止正常的操作而不是尝试继续做可能有缺陷的工作。
当有问题发生时,快速失败系统即时可见地发错错误告警。在Java中,快速失败与iterators有关。如果一个iterator
在集合对象上创建了,其它线程欲“结构化”的修改该集合对象,并发修改异常 (ConcurrentModificationException)
抛出。
怎么样使HashMap同步:
HashMap可以通过Map m = Collection.synchronizedMap(HashMap)来达到同步的效果。
1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;
2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应
用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。
但HashMap的同步问题可通过Collections的一个静态方法得到解决: Map Collections.synchronizedMap(Map m)