zoukankan      html  css  js  c++  java
  • 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("-------------------------");
        }
    }
  • 相关阅读:
    重新导入依赖的常见方式
    Required request body is missing 错误解决
    Maven 打包 package install deploy 区别
    linux命令-awk入门
    使用redis进行基于shiro的session集群共享
    frist Django app — 五、Test
    frist Django app — 四、 完善View
    frist Django app — 三、 View
    frist Django app— 二、 Model和管理界面
    frist Django app — 一、 创建工程
  • 原文地址:https://www.cnblogs.com/nayitian/p/3387823.html
Copyright © 2011-2022 走看看