Java Collections Framework获得了Jolt大奖。学名是集合框架。也有人叫容器。实际上就是一些常用数据结构的实现。
●实际上只有三种容器:Map、List、Set
1.Hashtable、Vector等是过去遗留下来的类,目的是为了兼容旧的系统,我们现在不要再使用它们。遗留类和现在新的集合框架类唯一的区别是前者(Hashtable,Vector等)是线程安全的,后者(Map,List,Set等)不是线程安全的。在多线程环境下(涉及到并发访问时)当然要线程安全集合类了,这时候我们仍然可以不需要使用旧的集合类,
在Collections中有相应的方法返回同步的Collection对象。如:
public static Collection synchronizedCollection(Collecton c)
public static List synchronizedList(List list)
等等。
●这些接口具有众多的实现,该如何选择数据结构呢?
●对List(列表)实现的选择(可选:数组、ArrayList或LinkedList)
1.假如你不需要可变容量的功能,首选数组(数组比所有容器都快)。
2.一般情况下,如果没有特别需要,首选ArrayList---遍历速度很快(实际上是线性表中的顺序表)。
3.假如你经常需要往List的中间插入或删除数据,则首选LinkedList(实际上是线性表中的链表)。
●对Set(集合)实现的选择(HashSet,TreeSet,LinkedHashSet)
1.如果没什么特别需要,首选HashSet---添加和查询速度很快
2.如果需要排序,选择TreeSet(有原生排序,有特殊需求,可实现自己的排序器)
3.LinkedHashSet---遍历更快
●对Map实现的选择(类似Set的选择)
1.首选HashMap
2.需要排序选择TreeMap
3.LinkedHashMap--遍历更快
●最佳实践
1.Effective Java第43条建议:返回零长度的数组或者集合,而不是null。
在Collections类中分别有Collections.emptySet(),Collections.emptyList(),Collections.emptyMap()等方法。见名知义,从方法名我们可以知道它们返回的是一个不可变的空集全。正合我意。
同理,在需要返回数组的方法中,我们尽量避免返回null,而是返回长度为零的数组。如:
Person[] getAllPerson(){
if(length==0){
return new Person[0];
}
}
你可能会有不必要的担心:null返回值比零长度数组更好,因为它避免了分配数组所需要的开销。但实际上这种观点是站不住脚的,具体原因在此不赘述。有兴趣可参看Effective Java。
2.使用集合框架类时,使用泛型。
3.要使用Map,List,Set等作为类型声明或返回值,而不是使用具体类型。