Collection,Map介绍

 

一、Collection和Map的结构图

Collection
├-List
│   ├LinkedList
│   ├ArrayList
│   └Vector
│     └Stack

├-Queue
│   ├……
│   ├LinkedBlockingQueue
│   └……

└-Set
     ├HashSet
     ├TreeSet
     └LinkedHashSet

Map
├-Hashtable
├-HashMap
└-WeakHashMap


二、集合类的特点

    当你事先不知道要存放数据的个数,或者你需要一种比数组下标存取机制更灵活的方法时,你就需要用到集合类。集合类存放于java.util包中。集合类存放的都是对象的引用,而非对象本身。出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。 集合类型主要有3种:set(集)、list(列表)和map(映射)。

A> 集
    集(set)是最简单的一种集合,Set与Collection有完全一样的接口。
    存入Set的每个元素必须是唯一的。因为对集中成员的访问和操作是通过集中对象的引用进行的,所以Set不保存重复元素,加入Set的Object必须定义equals()方法以确保对象的唯一性。
    Set接口不保证维护元素的次序。它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。集也有多种变体,可以实现排序等功能,如TreeSet。

B> 列表
    次序(order)是List最重要的特性,它保证以某种特定的次序来维护元素。List为Collection添加了许多方法,使得能够向List中间插入或移除元素(只推荐LinkedList使用)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和删除元素。列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。

C> 映射
    映射中每个项都是成对的。映射中存储的每个对象都有一个相关的关键字(Key)对象,并且唯一。关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。关键字本身并不能决定对象的存储位置,它需要通过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。

D>队列
    在处理元素前用于保存元素的 collection。除了基本的 Collection 操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。

三、详细介绍

1、集(Set)

A> HashSet
    为快速查找而设计的Set。存入HashSet的对象必须定义hashCode()。

B> TreeSet
    底层结构为tree的一种有序的Set。使用它可以从Set中提取有序的序列。

C> LinkedHashSet
    具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

    HashSet采用散列函数对元素进行排序,这是专门为快速查询而设计的;TreeSet采用红黑树的数据结构进行排序元素;LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素的次序,使得看起来元素是以插入的顺序保存的。需要注意的是,生成自己的类时,Set需要维护元素的存储顺序,因此要实现Comparable接口并定义compareTo()方法。

2、列表(List)

A> ArrayList
    实现基于动态数组的数据结构,并允许包括 null 在内的所有元素。
    以array实现完成的List。允许快速随机访问,但是当元素的插入或移除发生在List中间位置时,效率会很差。

B> LinkedList
    基于链表的数据结构,并且允许所有元素(包括 null)。提供最佳循序访问,以及成本低廉的“List中间位置元素插入和移除”。随机访问动作则相对缓慢。LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。

C> Vector
   Vector是线程同步的,所以它也是线程安全的.如果不考虑到线程的安全因素,一般用arraylist效率比较高。
   如果集合中的元素的数目大于目前集合数组的长度时,Vector增长率为目前数组长度的100%,而Arraylist增长率为目前数组长度的50%.如果在集合中使用数据量比较大的数据,用Vector有一定的优势.   

D> Stack
    Stack 类表示后进先出(LIFO)的对象堆栈。
    官方建议:
    Deque 接口及其实现提供了 LIFO 堆栈操作的更完整和更一致的 set,应该优先使用此 set,而非此类。例如:
        Deque<Integer> stack = new ArrayDeque<Integer>();

3、队列(Queue)


4、映射(Map)

A> HashMap
    实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。

B> HashTable
    实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。

C> TreeMap
    实现这样一个映象,对象是按键升序排列的。

D> WeakHashMap
    实现这样一个映象:通常如果一个键对一个对象而言不再被引用,键/对象对将被舍弃。这与HashMap形成对照,映象中的键维持键/对象对的生命周期,尽管使用映象的程序不再有对键的引用,并且因此不能检索对象。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值