JDK1.6新特性,基础类库篇,集合框架(Collections)
2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马)。
集合框架增强如下:
1. 增加了如下新接口(Interface)
- Deque - 一个双端队列,支持元素从双端插入与移除。从Queue接口继承而来。
- BlockingDeque - 一个队列当获取元素时如果队列为空则阻塞以等待;当插入时等待队列有空间可用。继承自Deque接口,此接口类属于java.util.concurrent包。
- NavigableSet - 一个可导航的继承于SortedSet接口的Set。 它可以按正序或倒序访问,此接口意图取代SortedSet接口。
- NavigableMap - 一个可导航的继承于SortedMap的Map。它可以对键(key)按正序或倒序访问,此接口意图取代SortedMap接口。
- ConcurrentNavigableMap - 一个继承于ConcurrentMap接口与NavigableMap接口的接口(它类属于java.util.concurrent包)。
2. 增加了如下实体类(classes)
- ArrayDeque - 一个高效的可伸缩的,由数组实现Deque接口的实现类。
- ConcurrentSkipListSet - 一个可缩放并发的NavigableSet接口实现类。
- ConcurrentSkipListMap - 一个可缩放并发的ConcurrentNavigableMap接口实现类。
- LinkedBlockingDeque - 一个由链表实现的可缩放并发的FIFO阻塞队列。
- AbstractMap.SimpleEntry - 一个简单易变的Map.entry实现。
- AbstractMap.SimpleImmutableEntry - 一个简单不变的Map.Entry实现。
3. 下列已经存在的类获得改良
- LinkedList - 改良发实现Deque接口。
- TreeSet - 改良以实现NavigableSet接口。
- TreeMap - 改良以实现NavigableMap接口。
4. Collections工具类增加方法
- newSetFromMap(Map) - 返回指定映射支持的 set。得到的 set 与底层实现映射有相同的顺序、并发性和性能特征。可以通过如下代码实现类似于IdentityHashSet这样的功能:
- Set<Object> identityHashSet = Collections.newSetFromMap(new IdentityHashMap<Object, Boolean>());
- asLifoQueue(Deque) - 以后进先出 (Lifo) Queue 的形式返回某个 Deque 的视图。
5. Arrays工具类增加方法
Arrays工具类现在有方法copyOf和copyOfRange,可以复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度;可以将指定数组的指定范围复制到一个新数组。
之前:
- int[] newArray = new int[newLength];
System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
现在:
- int[] newArray = Arrays.copyOf(a, newLength);
6. 总结
Java集合框架(Java Collections Framework)加入了一个新的NavigableMap和NavigableSet接口。分别的扩展了SortedMap和SortedSet接口,本质上添加了搜索选项到接口。
在Java 6中,这里有两个NavigableMap接口的实现。旧的TreeMap被改良以实现NavigableMap接口;另外,一个该接口的并发的版本现在可以在ConcurrentSkipListMap类中找到。可能你并不熟悉skiplist,它们是一种排序过的链接,使用了 并行链表提高了搜索的速度。但TreeMap的结构是平衡的,并且粗略的从链表中寻找一个键,ConcurrentSkipListMap一直都是从最前面开始,但是由于副skiplist的作用,搜索的效果很接近于二分查找。
最大的改变是,更好的双向集合存取访问(Deque接口等)。
NavigableMap/NavigableSet示范代码:
- package com.clzhang.sample.thinking;
- import java.util.Map;
- import java.util.NavigableMap;
- import java.util.NavigableSet;
- import java.util.SortedMap;
- import java.util.TreeMap;
- import java.util.TreeSet;
- import org.junit.Test;
- public class JDK16Navigable {
- @Test
- public void testMap() {
- NavigableMap<Double, Integer> map = new TreeMap<Double, Integer>();
- map.put(1.1, 1);
- map.put(2.2, 2);
- map.put(3.3, 3);
- map.put(4.4, 4);
- // 小于该key且离该key最近的一个key
- Double lowerKey = map.lowerKey(2.0);
- System.out.println("lowerKey():" + lowerKey);
- // 大于该key且离该key最近的一个entry
- Map.Entry<Double, Integer> entry = map.higherEntry(2.0);
- System.out.println("higherEntry() key:" + entry.getKey() + " value:" + entry.getValue());
- // 小于等于该key且离该key最近的一个key
- Double floorKey = map.floorKey(2.2);
- System.out.println("floorKey():" + floorKey);
- // 大于等于该key且离该key最近的一个key
- Double ceilingKey = map.ceilingKey(2.0);
- System.out.println("ceilingKey():" + ceilingKey);
- // 小于该key的一个Map
- SortedMap<Double, Integer> headMap = map.headMap(2.0);
- System.out.println("headMap():" + headMap);
- // 大于等于该key的一个Map
- SortedMap<Double, Integer> tailMap = map.tailMap(2.0);
- System.out.println("tailMap():" + tailMap);
- // 简单的不用使用迭代器而遍历所有Map元素的方法;也可以使用pollLastEntry()获取倒序输出。
- Map.Entry<Double, Integer> entryEach = null;
- while ((entryEach = map.pollFirstEntry()) != null) {
- System.out.println("pollFirstEntry():" + entryEach.getKey() + entryEach.getValue());
- };
- System.out.println("-------------------------");
- }
- @Test
- public void testSet() {
- NavigableSet<Integer> set = new TreeSet<Integer>();
- set.add(1001);
- set.add(1002);
- set.add(1003);
- set.add(1004);
- // 小于
- Integer lower = set.lower(1003);
- System.out.println("lower:" + lower);
- // 小于等于
- Integer floor = set.floor(1003);
- System.out.println("floor:" + floor);
- // 迭代,也可以使用pollFirst()获取正序输出。
- Integer integer1 = null;
- while ((integer1 = set.pollLast()) != null) {
- System.out.println("pollFirst():" + integer1);
- }
- System.out.println("-------------------------");
- }
- }
JDK1.6新特性,基础类库篇,集合框架(Collections)的更多相关文章
- JDK1.5新特性,语言篇
Java 1.5版本,就是Java 2 Standard Edition 5,Version 1.5,简称Java 5.版本代号Tiger. 一. 泛型(Generics) C++通过模板技术可以指定 ...
- JDK1.7新特性,语言篇
1. 可以用二进制表达数字 可以用二进制表达数字(加前缀0b/0B),包括:byte, short, int, long // 可以用二进制表达数字(加前缀0b/0B),包括:byte, short, ...
- JDK1.5新特性,基础类库篇,集合框架(Collections)
集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...
- JavaSE----API之集合(Collection、List及其子类、Set及其子类、JDK1.5新特性)
5.集合类 集合类的由来: 对象用于封装特有数据,对象多了须要存储:假设对象的个数不确定.就使用集合容器进行存储. 集合容器由于内部的数据结构不同,有多种详细容器.不断的向上抽取,就形成了集合框架. ...
- JDK1.8新特性——使用新的方式遍历集合
JDK1.8新特性——使用新的方式遍历集合 摘要:本文主要学习了在JDK1.8中新增的遍历集合的方式. 遍历List 方法: default void forEach(Consumer<? su ...
- jdk1.6新特性
1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...
- Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27
Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27 1. 修改历史2 2. 适用语言::几乎所有编程语言.语言提升的三个渠道::语法,类库,框架,ide2 2.1. 单根继承 ...
- JDK1.8新特性——Collector接口和Collectors工具类
JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...
- JDK1.8新特性——Stream API
JDK1.8新特性——Stream API 摘要:本文主要学习了JDK1.8的新特性中有关Stream API的使用. 部分内容来自以下博客: https://blog.csdn.net/icarus ...
- JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用
jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default Lambda表达式 L ...
随机推荐
- 写出3个使用this的典型应用
(1).在html元素事件属性中使用,如: <input type=”button” onclick=”showInfo(this);” value=”点击一下” /> (2).构造函数 ...
- Maven常用指令
Maven是通过pom.xml配置好一系列操作,然后通过命令行来进行控制操作的.格式为 mvn 命令 常用命令主要有: mvn 命令 -v:查看maven版本 compile:编译项目 test:测试 ...
- 分享自己针对Automation做的两个成熟的框架(QTP 和Selenium)
自己在google code中开源了自己一直以来做的两个自动化的框架,一个是针对QTP的一个是针对Selenium的,显而易见,一个是商业的UI automation工具,一个是开源的自动化工具. 只 ...
- 11、java5线程池之异步任务CompletionService
JDK文档描述: public interface CompletionService<V> 将生产新的异步任务与使用已完成任务的结果分离开来的服务.生产者 submit 执行的任务.使用 ...
- UINavigationController出现nested push animation can result in corrupted navigation bar的错误提示
今天在測试过程中,出现了这样一个bug.分别有两种情景: (前提是:app是基于UINavigationController构建的) 1.从Controller-A中push进来B.在B中点击返回,返 ...
- 【jsPDF】jsPDF插件实现将html页面转换成PDF,并下载,支持分页
1.目的:在前段是 jQuery库 或者 VUE库 或者两者混合库,将html 页面和数据 转换成PDF格式并下载,支持分页 1.项目背景: 对客户报修记录进行分类统计,并生成各种饼图.柱状图.线性图 ...
- (原)CosFace/AM-Softmax及其mxnet代码
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/8525241.html 论文: CosFace: Large Margin Cosine Loss fo ...
- Spring 多数据源事务配置问题
2009-12-22 在SpringSide 3 中,白衣提供的预先配置好的环境非常有利于用户进行快速开发,但是同时也会为扩展带来一些困难.最直接的例子就是关于在项目中使用多个数据源的问题,似乎 很难 ...
- boost boost::asio::read socket.read_some 区别
boost boost::asio::read 尝试读一定数量的字节,直到读到为止,或者出错 socket.read_some 读一下socket,读到多少算多少 带async的类似
- 预加载与智能预加载(iOS)
来源:Draveness(@Draveness) 链接:http://www.jianshu.com/p/1519a5302141 前两次的分享分别介绍了 ASDK 对于渲染的优化以及 ASDK 中使 ...