概述

  一个集合,即collection,有时也被称为一个容器,是将多个元素聚集成一个单元的对象。Collections常被用来存储、检索、操纵聚集数据以及聚集数据间的通信。一般来说,Collections表示一组自然类群的数据项,比如一手扑克牌、一个信箱(由很多信件组成)或者电话簿(一组姓名到电话号码的映射)。 如果你熟悉Java语言或者任何一门其他编程语言,你可能已经对Collections比较熟悉了。

什么是集合框架?

  一个集合框架是一个统一的构架,用于表示和操纵集合。所有集合框架都包含下面几项:

  接口:即表示集合的抽象数据类型,ADT。接口使得在使用集合时不需要关注集合的实现细节。在面向对象语言中,接口一般会形成层次结构。
  实现:集合接口的具体实现。实际上它们是可复用的数据结构
  算法在实现集合接口的对象上进行的各种有意义的计算,如搜索、排序。实际上,算法是可复用的功能单元。
  除了Java集合框架以外,其他有名的集合框架有C++ STL和Smalltalk语言的集合层次架构。历史上,集合框架因为他们相当复杂而具有相当陡峭的学习曲线,并因此而恶名昭著。Java集合框架则打破了这个传统。

使用Java集合框架的好处

  Java集合框架提供了下面的好处:
  减轻编程负担:集合框架通过提供有用的数据结构和算法,使得我们从底层算法中解脱出来而能更专注于代码逻辑。
  提高编程效率和编程质量:
Java集合框架提供了各种有用的数据结构算法的高性能、高质量实现。因为程序员从自己实现各种数据结构的艰苦工作中解放出来,因此有更多时间用来改善程序质量和程序性能。
  允许互操作性
  减少了学习和使用新API的负担
  减少了设计新API的负担
  促进软件复用:
符合标准集合接口的新数据结构天生可复用。操作于实现集合接口的对象上的新算法亦然。

接口

  核心集合接口封装了不同类型的集合,如下图所示。这些接口使得我们可以操作集合而不必关心它们的具体实现细节。核心集合接口是Java集合框架的基础。正如我们可以从下图看到的,核心集合接口形成了层次结构:

图1 核心集合接口

  Set是一种特殊的集合,而一个SortedSet是一种特殊的Set,以此类推。注意上图的层次结构中包含两棵独立的树 — Map不是一个真正意义上的集合。
  注意所有的核心集合接口都是泛型化的(generic)。例如下面是Collection接口的声明:

  1. public interface Collection<E>...

  <E>语法告诉我们这个接口是泛型化的。当我们声明一个集合实例时,我们可以也必需指定集合中对象的类型。指定类型使得编译器能在编译时验证集合中的元素的类型都是正确的,从而减少运行时错误。如果想获取更多的关于泛型的信息,敬请参考Java Generic Turtorial 。
  当你学会使用这些接口后,你就了解了Java集合框架中的大部分内容。本章讨论关于如何有效使用这些接口的一些建议,包括何时使用何种接口。我们也将学会每个接口的一些习惯用法。
  为了保证核心集合接口的数量可控,Java平台没有为每一种集合类型的变种(如不可变集合、固定大小集合以及只可追加集合)都提供单独的接口。相反,每个集合接口上的修改操作都被设计成可选的,也就是某个集合接口的实现可能不会支持所有的修改操作。如果调用集合不支持的一个操作,将抛出UnsupportedOperationException。集合接口的实现必需用文档记录它支持哪些可选操作。

http://blog.csdn.net/zhoudaxia/article/details/27869981

https://zhidao.baidu.com/question/690821537522407564.html

[+]

 

1.常用集合框架结构

2. List

  2.1 ArrayList

List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。)
每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,在添加大量元素前,应用程序可以使用ensureCapacity 操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。
注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:

        List list = Collections.synchronizedList(new ArrayList(...)); 

2.2 LinkedList

List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 getremoveinsert 元素提供了统一的命名方法。LinkedList可以根据索引来访问集合中的元素,此外还实现了Deque接口,所以也可以当成双端队列来使用,即可当“栈”(先进后出),也可以当作队(先进先出);内部是以线性表和链表实现的,保证输入的顺序。通常用Iterator遍历。

注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法来“包装”该列表。

如下所示:

   List list = Collections.synchronizedList(new LinkedList(...));
 

3. Set

3.1 HashSet

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变

注意,此实现不是同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:

   Set s = Collections.synchronizedSet(new HashSet(...));

3.2 LinkedHashSet

具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。
同样,此实现不是同步的。需要

	Set s = Collections.synchronizedSet(new LinkedHashSet(...));进行包装

3.3 TreeSet

此实现为基本操作(addremovecontains提供受保证的 log(n) 时间开销

注意,此实现不是同步的。如果多个线程同时访问一个 TreeSet,而其中至少一个线程修改了该 set,那么它必须外部同步。这一般是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用Collections.synchronizedSortedSet 方法HashMap线程不安全,允许null作为key,HashTable线程安全,但是古老少用,不允许null作为key。来“包装”该 set。此操作最好在创建时进行,以防止对 set 的意外非同步访问:

   SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));

4. Map

4.1 HashMap

HashMap线程不安全,允许null作为key和Value,HashTable线程安全,但是古老少用,不允许null作为key。

最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:

  	 Map m = Collections.synchronizedMap(new HashMap(...));

参考文章:http://lib.csdn.net/article/javase/3788

 
http://blog.csdn.net/sdauzxl/article/details/52067042、
http://www.cnblogs.com/cathyqq/p/5279859.html
http://www.cnblogs.com/dashi/p/3597937.html

collections和collection 还有集合的更多相关文章

  1. Collections与Collection

    Collection是集合体系的最顶层,包含了集合体系的共性 Collections是一个工具类,方法都是用用Collection Collections方法: //static int binary ...

  2. FCL研究-集合- System.Collections 接口和对象集合

    [目录] 发现自己已经有很长一段时间写代码没什么进步了,随便读读FCL的源码,看看之前一直用的方法是如何实现的,也顺便提高下自己.FCL很是庞大,很难下口,于是用最笨的办法,先看常见的命名空间,逐个展 ...

  3. Mongodb学习笔记(二)Capped Collection固定集合

    一.Capped Collection固定集合 简单介绍 capped collections是性能出色的有着固定大小的集合(定容集合),以LRU(Least Recently Used最近最少使用) ...

  4. 使用collection查询集合属性

    介绍resultMap中使用collection查询集合属性 业务需求,查询部门中的多个人员 public class Department { private Integer id; private ...

  5. Java中Collections和Collection的区别

    java.util.Collection Collection 层次结构 中的根接口.Collection 表示一组对象,这些对象也称为 collection 的元素.一些 collection 允许 ...

  6. Backbone Collection——数据模型集合

    如果将一个Model对象比喻成数据库中的一条记录,那么Collection就是一张数据表.它表示为一个模型集合类,用于存储和管理一系列相同类型的模型对象. 1.创建集合集合用于组织和管理多个模型,但它 ...

  7. Java Collection - 001 集合的遍历

    import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.java.domain ...

  8. mybatis使用collection查询集合属性规则

    接上篇mybatis使用associaton进行分步查询 相关的类还是上篇中的类. 查询部门的时候将部门对应的所有员工信息也查询出来 DepartmentMapper.xml <!--嵌套结果集 ...

  9. Map、可变参数、静态导入、Collections、Arrays、集合嵌套

    Map双列集合 key 键 value 值 方法: put(K, V) //判断key值是否相等,相等,覆盖元素,不相等,存储 remove(K) Map集合的遍历(不要看到java提供了很多方法做一 ...

随机推荐

  1. 让PC端页面在手机端显示缩小版的解决方法

    做页面的时候我们做好pC端页面时,因编辑那边需求,在手机端页面也应该是缩小版,不能乱的.在网上找了各种解决方案,经实验,这种是可以的: 在head里边加上这两句meta  <meta name= ...

  2. 二、两条Linux删除数据跑路命令

    一.rm rm -rf / 无提示循环删除根目录,,删除存在被恢复的可能 二.dd dd if=/dev/urandom of=/dev/hda1 随机填写数据到相应分区,直到填满为止.重写后的分区无 ...

  3. MySQL创建远程用户并授权

    今天需要在本地测试系统功能,因为本地没有数据库,就需要在程序里面连接远程数据库: 先用ssh登录远程服务器,用root连上数据库看看情况: mysql> select Host,User,Pas ...

  4. codeforces157B

    Trace CodeForces - 157B One day, as Sherlock Holmes was tracking down one very important criminal, h ...

  5. LTI系统对WSS Processes的作用

    本文主要专注讨论LTI系统对WSS Process的影响.WSS Process的主要特性有mean以及correlation,其中correlation特性在滤波器设计,信号检测,信号预测以及系统识 ...

  6. DRF 版本 认证

    DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢大家都知道我们开发项目是有多个版本的 当我们项目越来越更新~版本就越来越多我们不可能新的版本出了~以前旧的版本 ...

  7. Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点

    这一小节,我们创建派生于CivilCreateEntityDemo的类CivilCreateCogoPoint,来创建几何空间点. 1 创建类并添加字段及方法 首先在项目资源管理器中向本项目中添加类, ...

  8. Android PowerManager电源管理(Android N )

    ./frameworks/base/core/java/android/os/PowerManager.java该类提供给Application访问电源相关接口. 它的内部类WakeLock是定义的唤 ...

  9. ajax提交 返回中文乱码问题

    接口返回数据相关 使用@ResponseBody后返回NUll 说明:刚把后台运行起来,兴高采烈的测试接口数据,结果无论如何都是返回null, 最终通过各种百度,发现原来是没有引入关键的Jar包. 解 ...

  10. LG P2473 [SCOI2008]奖励关

    题目链接:P2473 [SCOI2008]奖励关 题意:有n个宝物 每次等概率抛出其中之一一共抛出k次每个宝物有一个价值 和一个前提集合只有集齐了集合中的所有宝物 才可以领取这个宝物 范围:1 < ...