一直以来都没怎么好好深入学习过,有关集合类里面的东西,所以有些概念一直都很模糊。直到今天,才慢慢弄清楚它们之间的逻辑关系,现在把看来的成果总结一下。
1.其实有关集合的基础东西,我就不说了,想区分它们的关系,直接看一张图就明白了,如下2张图:
就这2张,已经把言语能说的关系,表达清楚了。现在来解释一下。
1.有关集合,有2个最终极的接口,一个是collection,另外一个是map。
2.两类接口,具体又分为了,3个小接口,分别是set,list和map。
3.图中黑色的部分,又是说这3个接口,最常用的实现类,也就是,你经常用到的,Hashset,ArrayList,Hashmap。
4.具体的其他比较,区别,下面再具体说。
Set、List和Map可以看做集合的三大类。
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是不能集合里元素不允许重复的原因)。
Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。
接下来,按下面的层次来,简洁的说一下:在这之前,我们来重新认识翻译一下几个关键词,collection---收集(也就是一堆在一起的意思),list----列表,清单(就是一列的意思),map---映射(也就是数学一对一的关系),还有一个就是array----数组,队列,列阵(我刚开始就没分清楚和list的区别),array和collection,map有啥关系呢?后边说。明白这几个单词意思,会概念清晰一点。
java.util.Collection [I]
+--java.util.List [I]
+--java.util.ArrayList [C]
+--java.util.LinkedList [C]
+--java.util.Vector [C]
+--java.util.Stack [C]
List接口下面有3个实现类:
List接口:List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。(后面说数组。。。。。。),允许重复元素
1.LinkedList 允许null元素。因为它有get,remove,insert方法在 LinkedList的首部或尾部。可被用作堆栈(stack),队列(queue)或双向队列(deque)。注意LinkedList没有同步方法
2.ArrayList ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。
3.Vector下面还有个stack子类 Vector非常类似ArrayList,但是Vector是同步的。vector其实就是向量的意思。
3.1Stack类 —— 堆栈类。当然有堆栈的一些特殊操作。当你需要堆栈这样的模型时,就可以使用这个集合。
+--java.util.Set [I]
+--java.util.HashSet [C]
+--java.util.SortedSet [I]
+--java.util.TreeSet [C]
Set接口:Set是一种不能包含有重复元素的集合,Set最多有一个null元素。
1.HashSet类 由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。不同步。
1.1LinkedHashSet子类 根据元素的hashCode值来决定元素的存储位置,将会按元素的添加顺序来访问集合里的元素
2.SortedSet接口 确保集合元素处于排序状态。
2.1TreeSet子类 TreeSet需要额外的红黑树算法来维护集合元素的次序。
3.enumset EnumSet是一个专为枚举类设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值。
EnumSet类没有暴露任何构造器来创建该类的实例,程序应该通过它提供的static方法来创建EnumSet对象。
java.util.Map [I]
+--java.util.Hashtable [C]
+--java.util.HashMap [C]
+--java.util.LinkedHashMap [C]
+--java.util.WeakHashMap [C]
Map接口 Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
1.Hashtable :任何非空(non-null)的对象都可作为key或者value。要同时复写equals方法和hashCode方法,而不要只写其中一个。Hashtable是同步的。
2.HashMap HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。
3.WeakHashMap WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收
2相互之间的区别
3最终总结
如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。(注意同步问题)
要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
还有2者的区别有:
容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置。一旦将对象置入容器内,便损失了该对象的型别信息。
数组则是把所有东西都拷贝进去,因此要需要定义数组类型。
友情提示:
1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。
2、Set和Collection拥有一模一样的接口。
3、List,可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)...。(add/get)
4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。
、Map中元素,可以将key序列、value序列单独抽取出来。
使用keySet()抽取key序列,将map中的所有keys生成一个Set。
使用values()抽取value序列,将map中的所有values生成一个Collection。
为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复。
整理了一下午,终于弄清楚了,看了很多,有些找不到了,把作者原文贴上,大家感兴趣可以,依次点进去看看,因为这里主要是以已经对此有了解的基础上,进行说明,所以有些地方就省略没说了,还有也没贴具体的代码了。想具体了解,点下面:
1.http://blog.csdn.net/softwave/article/details/4166598
2.http://android.blog.51cto.com/268543/400557
3.http://billy-lee.iteye.com/blog/356398
4.http://www.cnblogs.com/EvanLiu/p/3292700.html
累死了。。。