JDK1.5新特性,基础类库篇,集合框架(Collections)

时间:2022-09-23 17:30:41

集合框架在JDK1.5中增强特性如下:

一. 新语言特性的增强

  1. 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量。
  2. For-Loop循环(Enhanced for loop)- 节省了遍历集合中显式iterators的调用。
  3. 自动装箱/拆箱(Autoboxing/unboxing)- 自动将基本类型及其包装类之间进行互相转换。

更多阅读:JDK1.5新特性,语言篇

二. 增加了三个新的接口

  1. Queue - 队列接口,除了基本的集合操作外,它还提供了额外的插入、提取和检查操作。Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。
  2. BlockingQueue - 阻塞队列,从Queue接口扩展而来,如果BlockQueue是空的,从BlockingQueue获取元素的操作将会被阻塞,直到BlockingQueue进入元素才会被唤醒。同样,如果BlockingQueue是满的,任何试图往里存储元素的操作也会被阻塞,直到BlockingQueue里有空间才会被唤醒继续操作。
    特点:BlockingQueue不接受null元素;可以限定容量;主要用于生产者-使用者队列;它是线程安全的;类属于新加的包:java.util.concurrent
  3. ConcurrentMap - 并发映射,从Map接口扩展而来,支持原子putIfAbsent, remove, replace方法。
    特点:它是高性能的,相比Collections.synchronizedMap;它是线程安全的;类属于新加的包:java.util.concurrent

更多阅读:Java:集合篇,Collection接口框架图

三. 增加二个Queue的实现类,改型一个类以实现Queue接口,增加一Queue抽象实现类

  1. PriorityQueue - 一个用堆结构实现的*优先级队列。
  2. ConcurrentLinkedQueue - 一个用链表实现的线程安全的FIFO*队列。 (类属于新加的包:java.util.concurrent)
  3. LinkedList - Queue接口的一个改型实现;当作为Queue接口来访问时,LinkedList可作为一个FIFO队列来使用。
  4. AbstractQueue - 一个Queue实现的框架。

更多阅读:Java:集合篇,Collection接口框架图

四. 提供了五个实现BlockingQueue接口的类,类属于新加的包:java.util.concurrent

  1. LinkedBlockingQueue - 一个用链表实现的*阻塞队列,按 FIFO(先进先出)原则对元素进行排序。
  2. ArrayBlockingQueue - 一个由数组实现的有界阻塞队列。按 FIFO(先进先出)原则对元素进行排序。
  3. PriorityBlockingQueue - 一个用堆实现的*阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞检索的操作。
  4. DelayQueue - 一个用堆实现的*阻塞队列,只有在延迟期满时才能从中提取元素。
  5. SynchronousQueue - 一个简单的阻塞队列,其中每个 put 必须等待一个 take。

更多阅读:BlockingQueue接口

五. 提供了ConcurrentMap接口及ConcurrentHashMap实现类

ConcurrentHashMap - 一个高并发、高性能,用哈希列实现ConcurrentMap接口的类。 读取的时候永不上锁,允许用户选择写入并发的级别。它趋向于作为Hashtable的替代:它支持所有Hashtable的方法。

更多阅读:Java:concurrent包下面的Map接口框架图(ConcurrentMap接口、ConcurrentHashMap实现类)

六. 提供了特殊用途的List和Set实现:读操作极大的多于写操作的情况;迭代(iteration)不能被保证同步

  1. CopyOnWriteArrayList - 数组实现的List。其中所有可变操作(比如:add、set、remove)都是通过对基础数组进行一次新的复制来实现的。不需要同步,即使是迭代(iteration)过程中,因为此数组在迭代器的生存期内绝不会更改,因此不可能发生冲突,并且迭代器保证不会抛出 ConcurrentModificationException自创建迭代器以后,迭代器就不会反映列表的添加、移除或者更改。此种实现非常合适于事件处理器模型(event-handler lists):更改极少,遍历频率高且可能耗时。
  2. CopyOnWriteArraySet - copy-on-write数组实现的Set。 此类实现与CopyOnWriteArrayList类似。 不像其它多数Set实现,add、 remove、contains方法的耗时取决于set的大小。此种实现非常适合于维护事件处理模型(event-handler lists)且防止重复的情况。

更多阅读:CopyOnWriteArraySet类CopyOnWriteArrayList类

七. 为枚举类提供了Set和Map实现

  1. EnumSet - 一个用位向量(bit-vector)实现的非常紧凑高效的枚举类型Set实现。枚举 set 中所有键都必须来自单个枚举类型。
  2. EnumMap - 一个用数组实现的高效Map实现。枚举映射中所有键都必须来自单个枚举类型。

更多阅读:EnumSet类EnumMap类

八. 为泛型集合提供了一个包装方法,以动态检查向集合中插入的元素是否符合规定

Collections.checkedCollection - 返回指定 collection 的一个动态类型安全视图。试图插入一个错误类型的元素将导致立即抛出一个 ClassCastException。假设在生成动态类型安全视图之前,collection 不包含任何类型不正确的元素,并且对该 collection 的所有后续访问都通过该视图进行,则可以保证 此 collection 不包含类型不正确的元素。

应用场景:动态类型安全视图的另一个用途是调试。假设某个程序运行失败,抛出一个 ClassCastException,这指示一个类型不正确的元素被放入已参数化 collection 中。不幸的是,该异常可以发生在插入错误元素之后的任何时间,因此,这通常只能提供很少或无法提供任何关于问题真正来源的信息。如果问题是可再现的,那么可以暂时修改程序,使用一个动态类型安全视图来包装该 collection,通过这种方式可快速确定问题的来源。例如,以下声明:

     Collection<String> c = new HashSet<String>();

可以暂时用下面的声明代替:

     Collection<String> c = Collections.checkedCollection(new HashSet<String>(), String.class);

再次运行程序会造成它在将类型不正确的元素插入 collection 的地方失败,从而清楚地识别问题的来源。一旦问题得以解决,就可以将修改后的声明转换回原来的声明。

九. Collections工具类新加如下方法:

  1. frequency(Collection<?> c, Object o) - 返回指定 collection 中等于指定对象的元素数。
  2. disjoint(Collection<?> c1, Collection<?> c2) - 如果两个指定 collection 中没有相同的元素,则返回 true
  3. addAll(Collection<? super T> c, T... a) - 一种方便的方式,将所有指定元素添加到指定 collection 中。示范:
    Collections.addAll(flavors, "Peaches 'n Plutonium", "Rocky Racoon");
  4. Comparator<T> reverseOrder(Comparator<T> cmp) - 返回一个比较器,它强行反转指定比较器的顺序。如果指定比较器为 null,则此方法等同于 reverseOrder()(换句话说,它返回一个比较器,该比较器将强行反转实现 Comparable 接口那些对象 collection 上的自然顺序)。

更多阅读:Java:集合篇,Collections工具类用法

十. Arrays工具类新方法:

为hashCode、toString、equals三个方法的各种版本提供了嵌套(或“多维)支持。示范:

    @Test
public void testPrint() {
final int ARRAY_SIZE = 10;
int[] array = new int[ARRAY_SIZE]; for(int i=0; i<ARRAY_SIZE;i++)
array[i] = i;


System.out.println(Arrays.toString(array));
} @Test
public void testPrintNest() {
final int ARRAY_SIZE = 3;
int[][] array = new int[ARRAY_SIZE][ARRAY_SIZE]; for(int i=0; i<ARRAY_SIZE;i++)
for(int j=0; j<ARRAY_SIZE; j++)
array[i][j] = i+j;


System.out.println(Arrays.deepToString(array));
}

输出:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]

十一. Boolean类型改型为实现Comparable接口

本文参考:http://docs.oracle.com/javase/1.5.0/docs/guide/collections/changes5.html

JDK1.5新特性,基础类库篇,集合框架(Collections)的更多相关文章

  1. JDK1&period;5新特性,语言篇

    Java 1.5版本,就是Java 2 Standard Edition 5,Version 1.5,简称Java 5.版本代号Tiger. 一. 泛型(Generics) C++通过模板技术可以指定 ...

  2. JDK1&period;7新特性,语言篇

    1. 可以用二进制表达数字 可以用二进制表达数字(加前缀0b/0B),包括:byte, short, int, long // 可以用二进制表达数字(加前缀0b/0B),包括:byte, short, ...

  3. JavaSE----API之集合(Collection、List及其子类、Set及其子类、JDK1&period;5新特性)

    5.集合类 集合类的由来: 对象用于封装特有数据,对象多了须要存储:假设对象的个数不确定.就使用集合容器进行存储. 集合容器由于内部的数据结构不同,有多种详细容器.不断的向上抽取,就形成了集合框架. ...

  4. JDK1&period;8新特性——使用新的方式遍历集合

    JDK1.8新特性——使用新的方式遍历集合 摘要:本文主要学习了在JDK1.8中新增的遍历集合的方式. 遍历List 方法: default void forEach(Consumer<? su ...

  5. jdk1&period;6新特性

    1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...

  6. Atitit&period;编程语言新特性&&num;160&semi;通过类库框架模式增强&&num;160&semi;提升草案&&num;160&semi;v3&&num;160&semi;q27

    Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27 1. 修改历史2 2. 适用语言::几乎所有编程语言.语言提升的三个渠道::语法,类库,框架,ide2 2.1. 单根继承  ...

  7. JDK1&period;8新特性——Collector接口和Collectors工具类

    JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...

  8. JDK1&period;8新特性——Stream API

    JDK1.8新特性——Stream API 摘要:本文主要学习了JDK1.8的新特性中有关Stream API的使用. 部分内容来自以下博客: https://blog.csdn.net/icarus ...

  9. JDK1&period;8新特性&lpar;一&rpar; ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

随机推荐

  1. 让 HTML5 来为你定位

    Geolocation HTML5 的 geolocation 是一个令人兴奋的 API,通过这套 API,Javascript 代码就能够访问到用户的当前位置.当然,访问之前必须得到用户的明确认可, ...

  2. IIS 7中 ISAPI 错误解决

    在本地IIS种发布了一个测试网站,浏览的时候提示 404 错误,无法显示页面,具体错误如下: 解决办法如下: 选择IIS根目录,在右边的功能视图中选择 “ISAPI 和 CGI限制”,双击打开, 把相 ...

  3. UML从需求到实现---类图&lpar;2&rpar;

    上节写到了UML中的类图:UML从需求到实现---类图(1) 写完以后总觉得写的不够详细.里面很多细节没有说到.一篇文章就把强大的面向对象的类说完.当然是不可能的.这次我再补充一些关于UML中类图和类 ...

  4. Linux---- vim 插件

    http://hi.baidu.com/omnice/blog/item/4ba97317cc67cc10962b4378.html fuzzyfinder.vim 可以替代四个插件, 不过这个插件也 ...

  5. the-type-java-lang-charsequence-cannot-be-resolved-in-package-declaration

    http://*.com/questions/24301986/the-type-java-lang-charsequence-cannot-be-resolved-in-pa ...

  6. Java简介&lpar;4&rpar;-关键字

    abstract assert boolean break byte byte case catch char class const continue default do-while double ...

  7. H - Prince and Princess - HDU 4685&lpar;二分匹配&plus;强连通分量&rpar;

    题意:有N个王子M个公主,王子喜欢一些公主,而且只能是王子喜欢的人,他们才可以结婚,现在让他们尽可能多的结婚的前提下找出来每个王子都可以和谁结婚. 分析:先求出来他们的最大匹配,因为给的数据未必是完备 ...

  8. &lbrack;译&rsqb;Selenium Python文档:六、页面对象

    本章是介绍页面对象设计模式的教程.一个页面对象代表了web应用用户接口的一片区域,你的测试代码将与之交互的. 使用页面对象模式的好处: 可以创建在多个测试样例中都可使用的可重用代码 减少重复性代码 如 ...

  9. Egret--添加一个精灵事件

    class Hello extends egret.DisplayObjectContainer{ //入口函数 private onAddStage(event:egret.Event){ //打开 ...

  10. ThreadPoolExecutor使用

    构造方法参数讲解  参数名 作用 corePoolSize 核心线程池大小 maximumPoolSize 最大线程池大小 keepAliveTime 线程池中超过corePoolSize数目的空闲线 ...