集合OR 容器 通常我们会用数组去保存一些基本数据类型,数组是编译器支持的类型,但是数组的一个明显缺点就是具有固定尺寸,而在一般情况下,只有在程序运行的时候,我们才能知道要保存的具体数目。 Java类库提供了一套相当完善的容器框架(Collections Framework)来解决这个问题。其中基本的类型是List、Set、Queue和Map。这些对象类型也被称为集合类,但是由于Java中使用了Collection这个名称指代该类库的一个子集,所以一般使用更广泛的术语“容器”来称呼它们。 容器的基本任务是保存对象,更准确的说是保存对象的引用。但是各种容器的实现是存在很大差异的,没有一种容器是绝对优秀的能够适应所有的应用场景,所以我们需要了解各种容器的底层实现,然后根据实际的情况选择合适的容器。从下面的这张容器的分类图中就能看到Collections Framework的庞大,而且这还不包括Queue接口的实现(PriorityQueue以及各种风格的BlockingQueue等)、ConcurrentMap接口实现、CopyOnWriteArrayList和CopyOnWriteArraySet、EnumSet和EnumMap、以及Collections工具类中的多个工具方法。


Interface接口规范:Collections Framework定义了一些接口规范,那些常用的容器都会继承某些接口规范,每一种接口都对应给出相应的抽象类,如果类库提供的容器不能很好的完成你指定的任务,你可以扩写这些抽象类的子类,定制自己的容器。 
Collection接口:仅仅表示一组对象的集合,而没有指定对象的存放次序,以及能否包含重复元素,Collection接口自身还继承了Iterator接口。 下面要说的很多容器都实现了Collection接口,包括List、Set、Queue、Deque等接口。需要注意的是,同为容器的Map没有实现Collection接口。 Collection接口定义了容器最基本的一些特性,包含以下的接口方法定义: size方法:返回容器中元素的个数isEmpty方法:返回容器是否为空contains方法:返回容器中是否包含某个元素iterator方法:返回容器的迭代器add方法:用于向容器中添加元素remove方法:用于删除容器中的元素clear方法:清空容器中的元素toArray方法:将容器类转成相应的对象数组 

List接口:List继承于Collection接口,表示一个有序容器,容器内的元素会按照加入的顺序有序的存放,允许出现重复的元素,可以基于元素位置的访问。 List接口在Collection接口的基础上加上了以下方法的定义, get方法:获取指定位置的元素set:将指定位置设置成指定的元素indexOf:获取指定元素在容器中的位置listIterator:返回ListIterator类型的迭代器subList:根据区间位置,获取容器的子容器 
List接口的常见实现类有ArrayList、LinkedList、Vector等

Set接口:继承于Collection接口,特点是不能存放相同的元素,对有序性没有要求,Set接口中的方法定义基本和Collection接口一致,没有加入新的方法定义。 
常见的Set接口的实现有HashSet、SortedSet接口 

Queue接口:继承于Collection接口,是一个被定义用来存放一系列等待进行某个过程元素的容器,除了一些基本的容器操作,Queue队列还提供了一些额外的插入、提取和检查的操作。 
Queue接口中定义以下的方法: add方法:将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。offer方法:将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。peek方法:获取但不移除此队列的头;如果此队列为空,则返回 null。pool方法:获取并移除此队列的头;如果此队列为空,则返回 null。remove方法:获取并移除此队列的头。 包括Deque、BlockingQueue接口都直接继承与Queue接口

Map接口:是一个关于key(键)和value(值)的映射集合,每一个key对应一个value。 
Map接口中定义的一些基本方法: size方法:返回容器中元素的个数put方法:向容器中加入元素remove方法:删除容器中元素isEmpty方法:判断容器是否为空contains方法:判断容器是否包含指定元素clear方法:清除容器中的元素keySet方法:返回Map的key集合,是Set类型的 实现了Map接口的一些类:HashMap、Hashtable、WeakHashMap、SynchronizedMap、ConcurrentMap接口等

Deque接口:继承于Queue接口,在JDK1.6中被加入,也叫做双端队列,即可以在队列的两端进行插入和提取操作。 Deque接口在Queue接口的基础上,加上了addFirst、addLast、offerFirst、offerLast等方法,分别表示这些操作可以在两端进行。 
常见的Deque的实现类:ArrayDeque、ConcurrentLinkedDeque、LinkedList、BlockingDeque等。

Collections Framework中还包含一些其他的接口,但基本由上述接口扩展而来,如SortedSet、SortedMap、BlockingQueue、BlockingDeque、ConcurrentMap等 
______________________________________________________________________________________________________________________________________________________________________
通用的一些实现类 类库提供了一些非常有用的基于上述接口的容器实现类,并且能够很好的胜任日常开发中的大部分的场景。 
HashSet:基于Set接口的Hash表的实现,比较全面的实现了Set接口。元素在容器的中的顺序是无序的,底层是基于HashMap的实现,key表示set容器中国的值,value都是一个相同的对象,HashMap的put方法。 
TreeSet:基于红黑树实现,继承于NavigableSet接口,NavigableSet也就是SortedSet的扩展,具有了为给定搜索目标报告最接近匹配项的导航方法。 
LinkedHashSet:继承与HashSet类,实现了Set接口,具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。 
ArrayList:实现了List接口,底层基于数组实现,对元素的随机访问速度较快,但是插入和删除操作速度较慢。 
LinkedList:实现了List接口和Deque接口,底层是双重链表实现,对于元素的插入和删除操作较快,但是随机访问的性能较差。当通过队列使用时,LinkedList表现为一个FIFO队列。 
ArrayDeque:实现了Deque,是Deque接口一个非常高效的基于数组的实现。 
PriorityQueue:是一个基于优先级堆的无界优先级队列 
HashMap:基于哈希表的Map接口的实现,允许使用NULL值和key,除了非同步和可以使用null之外,和HashTable大致相同, 
TreeMap:基于红黑树的NavigableMap实现,其中的映射根据其键的自然顺序或者创建的时候提供的Comparator进行排序。 
LinkedHashMap:Map接口的哈希表和链表实现,具有可预期的迭代顺序。 
_________________________________________________________________________________________________________________________________
包装实现类 在java.util.Collections工具类中提供了一系列的静态内部类容器,这些内部类也实现了Collection接口,并且具有各自的特性,可以分为以下三类: Collections.unmodifiableInterface:返回指定Interface类型的容器,但是不允许用户去修改它们。相当于原来容器的一个不能修改的视图。Collections.synchronizedInterface:返回指定interface类型的容器,但是是线程安全的。Collections.checkedInterface:返回指定 interface 的一个动态类型安全视图。试图插入一个错误类型的元素将导致立即抛出ClassCastException。 ___________________________________________________________________________________________________________________________________
基于特点目的的实现: 
WeakHashMap:我们说容器是用来保存对象的,更准确的说是用来保存对象的引用,如果一个长生命周期的容器,保持着一个无用对象的引用,就会造成GC无法回收。weakHashMap以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的Map 实现有所不同。 IdentityHashMap:此类利用哈希表实现Map 接口,比较键(和值)时使用引用相等性代替对象相等性。换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2) 时,才认为两个键 k1 和 k2 相等。 CopyOnWriteArrayList:ArrayList的一个线程安全的变体,其中所有可变操作(addset 等等)都是通过对底层数组进行一次新的复制来实现的,一般需要很大的开销。CopyOnWriteArraySet:内部使用CopyOnWriteArrayList的Set EnumSet:与枚举类型一起使用的专用的Set实现。枚举 set 中所有键都必须来自单个枚举类型,该枚举类型在创建 set 时显式或隐式地指定。
EnumMap:与枚举类型一起使用的专用的Map实现。枚举映射中所有键都必须来自单个枚举类型,该枚举类型在创建映射时显式或隐式地指定。枚举映射在内部表示为数组。此表示形式非常紧凑且高效。 
——————————————————————————————————————————————————————————————————————用于并发用用的实现类: 
ConcurrentLinkedQueue:一个基于链接节点的无界的线程安全的队列,按照FIFO原则对元素进行排序。 ConcurrentHashMap:支持获取的完全并发和更新的所期望可调整并发的哈希表,是基于非阻塞实现的。 LinkedBlockingQueue:一个基于已链接节点的、范围任意的blocking queue,也是按照FIFO排序元素。 PriorityBlockingQueue:一个带有优先级的阻塞队列的实现。 
其他的并发容器可以在java.util.concurrent包下面找到

Java Collections Framework的更多相关文章

  1. (一)一起学 Java Collections Framework 源码之 概述

    . . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述 JDK 中很多类 LZ 已经使用了无数次,但认认真真从源码级研究过其原理的还只占少数,虽然从 ...

  2. (二)一起学 Java Collections Framework 源码之 AbstractCollection

    . . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述(未完成) (二)一起学 Java Collections Framework 源码之 Abs ...

  3. Java Collections Framework概览

    本文github地址 概览 容器,就是可以容纳其他Java对象的对象.Java Collections Framework(JCF)为Java开发者提供了通用的容器,其始于JDK 1.2,优点是: 降 ...

  4. Java Collections Framework 汇总

    1. Java Collections Framework Java集合框架概览 2. Java Collections Framework 之 RandomAccess接口 3. 关于ArrayLi ...

  5. Java Collections Framework知识结构目录

    The core collection interfaces are the foundation of the Java Collections Framework. The Java Collec ...

  6. Java Collections Framework Java集合框架概览

    Java SE documents -- The Collections Framework http://docs.oracle.com/javase/8/docs/technotes/guides ...

  7. 【DataStructure】The description of Java Collections Framework

    The Java Connections FrameWork is a group of class or method and interfacs in the java.util package. ...

  8. Java入门系列(七)Java 集合框架(JCF, Java Collections Framework)

    Java 集合概述 List.Set.Map可以看做集合的三大类 java集合就像一个容器,可以将多个对象的引用丢进该容器中. Collection和Map是java集合的根接口. List List ...

  9. Java Collections Framework 之 RandomAccess接口

    在研究Collections类的排序算法时候,看到这样的代码 : public static <T> int binarySearch(List<? extends Comparab ...

随机推荐

  1. VC中不同类型DLL及区别

    1. DLL的概念可以向程序提供一些函数.变量或类. 静态链接库与动态链接库的区别:(1)静态链接库与动态链接库都是共享代码的方式.静态链接库把最后的指令都包含在最终生成的EXE文件中了:动态链接库不 ...

  2. mvc学习

    视频: http://edu.51cto.com/index.php?do=lession&id=14581 博客: http://www.cnblogs.com/chsword/archiv ...

  3. Spring下载地址

    spring官方网站改版后,不提供直接下载,而是通过maven下载,所以将直接下载的地址给出: http://maven.springframework.org/release/org/springf ...

  4. Qt: qobject_cast<QPushButton*>(sender()) 简化信号与槽的编写

    当你觉得写代码是一件重复性极高的工作时,这时你就应该考虑换个方式来实现了. 提高代码效率,减少代码量. 代码片: void Widget::onClicked() { QPushButton* but ...

  5. Android Editext监听光标位置

    因为项目需要,需要实时监听光标的位置变化,网上提出的用TextWatcher和onTouchListener中调用contentText.getSelectionStart()都是获取的上一次位置. ...

  6. fork、vfork、clone区别

    在Linux中主要提供了fork.vfork.clone三个进程创建方法. 问题 在linux源码中这三个调用的执行过程是执行fork(),vfork(),clone()时,通过一个系统调用表映射到s ...

  7. OneNote快捷键

    转载自:http://onenoter.com/2013/04/5792 记录笔记和设置笔记格式 键入和编辑笔记 若要执行此操作 按 打开一个新的 OneNote 窗口. Ctrl+M 打开一个小的 ...

  8. SSMS错误代码大全

    0 操作成功完成. 1 功能错误. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文件. 5 拒绝访问. 6 句柄无效. 7 存储控制块被损坏. 8 存储空间不足,无法处理此 ...

  9. FormsAuthentication实现单点登录

    原文地址:http://www.wlm.so/Article/Detail/lmb48bk9f690n00000 单点登录,这种在网络非常常见,在这里讨论的是实现同一主域下的子站间的单点登录,同样也适 ...

  10. MySQL索引的查看创建和删除

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...