java 集合类的学习总结

一直以来都没怎么好好深入学习过,有关集合类里面的东西,所以有些概念一直都很模糊。直到今天,才慢慢弄清楚它们之间的逻辑关系,现在把看来的成果总结一下。

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相互之间的区别

Vector和ArrayList
不同:vector安全同步,arraylist不同步。
相同:都是采用数组实现的。

arraylist和linkedlist
不同:arraylist是数组实现的,linkedlist是链表实现的。
arraylist优势在于随机访问,linkedlist在于插入删除元素。

HashMap与TreeMap
HashMap优势在于插入,删除,定位,而TreeMap在于保存内部数据的特定顺序。

hashtable与hashmap
不同:hashtable是同步的,而hashmap不是同步的不安全。
还有最重要的一点,hashtable不允许空值,而hashmap允许空值的插入。

3最终总结

1.如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
  如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。(注意同步问题)
  要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法
  尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。




最后的最后,是不是上面还说了array(数组)和集合他们的关系?
他们的关系,其实不复杂,先看它们的位置
    java.util.Collections主要提供一些static方法用来操作或创建Collection,Map等集合。
    java.util.Arrays主要提供static方法对数组进行操作。
可以说,collections是对集合处理的辅助类型,一般都是推荐用arrays类,因为array效率毕竟比容器高
所以,我们重新再认识一下。一个叫容器,一个就是数组。是2个不同的东西。

但是,array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。而容器有size,可以知道具体又多少。

还有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



累死了。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值