`

NavigableMap与NavigableSet

阅读更多

 

可导航的Map和集合 NavigableMap and NavigableSet

Java集合框架(Java Collections Framework)加入了一个新的NavigableMap和NavigableSet接口。分别的扩展了SortedMap和SortedSet接口,本质上添加了搜索选项到接口。

NavigableMap接口

对于NavigableMap,有3个方法的集合。其中一个方法集合用于获取子Map,另一个集合用于获取Map Entity,最后一个用于设置Map键关联的工作。

在 第一个集合中存在3个方法。首先,navigableHeadMap(toKey)返回一个包含所有的键的NavigableMap,但是不包括 toKey,有一个返回带有所有键的NavigableMap的方法navigableTailMap(fromKey),从fromKey开始的,一直 到最后一个键的内容。最后,是一个naviagbleSubMap(fromKey,toKey)方法,返回一NavigableMap,从 fromKey开始,结束于toKey(这里是一个半开半闭区间[startKey,endKey))。感官上,这些方法与SortedMap的 headMap()、tailMap()和subMap()方法相同,但是返回不一样的类型,而不是上面提到的NavigableMap。

这里的第二个方法的集合是和Map的键有关的。对于SortedMap,你有firstKey()和lastKey()来获取某个Map的边界键值。NavigableMap有一些获取键的其他方法:

  • ceilingKey(key):用来获取大于或者等于给定的key的第一个键,如果没有的话就返回null。
  • floorKey(key):用来获取小于或者等于给定的key的第一个键,如果没有的话就返回null。
  • higherKey(key):用来获取大于给定的key的第一个键,如果没有的话就返回null。
  • lowerKey(key):用来获取小于给定的key的第一个键,如果没有的话就返回null。

第三个方法的集合可能是最有用的。当需要使用到SortedMap或者Map实例的时候,一般来说,你将获得键和获得对应的值。最后的方法的集合一般都是返回Map。实体实例取代了键。因此,你不必要去进行第二次查找操作。所以,这里有6个方法来操控第二个集合:

  • ceilingEntry(key):用于获取大于或等于给定key的第一个实体,如果没有则返回null。
  • firstEntry():用于获取Map的第一个实体,如果没有则返回null。
  • floorEntry(key):用于获取小于或等于给定的第一个实体key,如果没有则返回null。
  • higherEntry():用于获取大于给定的key的第一个实体,如果没有则返回null。
  • lastEntry():用于获取Map最后一个实体,如果没有则返回null。
  • lowerEntry(key):用于获取小于给定key的第一个实体,如果没有则返回null。

这里有两个单步从Map获取和删除实体的方法。提供了一个简单的不用使用迭代器而遍历所有Map元素的方法。下面是具体的介绍:

  • Map.Entry<K,V> pollFirstEntry():获取Map第一个键的实体并且从Map中移除该实体,如果Map为空则返回null。
  • Map.Entry<K,V> pollLastEntry():获取Map最后一个键的实体并且从Map移除该实体,如果Map为空则返回null。

另外还有两个值得起到的NavigableMap方法:descendingKeySet()和descendingEntrySet()。keySet()和entrySet()返回的是升序的键的集合,而新的NavigableMap方法是以降序进行工作的。

在Java 6中,这里有两个NavigableMap接口的实现。旧的TreeMap被从NavigableMap中继承而不是原来的SortedMap。另外,一 个该接口的并发的版本现在可以在ConcurrentSkipListMap类中找到。可能你并不熟悉skiplist,它们是一种排序过的链接,使用了 并行链表提高了搜索的速度。但TreeMap的结构是平衡的,并且粗略的从链表中寻找一个键,ConcurrentSkipListMap一直都是从最前 面开始,但是由于副skip list的作用,搜索的效果很接近于二分查找。

下面是一个具体例子,仅供参考:

import java.util.NavigableMap;
import java.util.TreeMap;

public static void main(String[] args) {
NavigableMap<String, Integer> nav = new TreeMap<String, Integer>();
nav.put("aaa", 111);
nav.put("bbb", 222);
nav.put("eee", 333);
nav.put("ccc", 555);
nav.put("ddd", 444);
System.out.printf("Whole list:%s%n", nav);

System.out.printf("First key: %s/tFirst entry: %s%n",nav.firstKey(), nav.firstEntry());

System.out.printf("Last key: %s/tLast entry: %s%n",nav.lastKey(), nav.lastEntry());

System.out.printf("Key floor before bbb: %s%n",nav.floorKey("bbb"));

System.out.printf("Key lower before bbb: %s%n", nav.lowerKey("bbb"));

System.out.printf("Key ceiling after ccc: %s%n",nav.ceilingKey("ccc"));

System.out.printf("Key higher after ccc: %s%n",nav.higherKey("ccc"));
}

输出结果:

Whole list:{aaa=111, bbb=222, ccc=555, ddd=444, eee=333}

First key: aaa First entry: aaa=111

Last key: eee Last entry: eee=333

Key floor before: bbb: bbb

Key lower before: bbb: aaa

Key ceiling after: ccc: ccc

Key higher after: ccc: ddd

NavigableSet接口

NavigableSet 工作类似于NavigableMap,但是没有键值对。在NavigableMap中的3组方法,这里有其中的两组。你可以可以获取一个可导航的子集,带 有navigableHeadSet(toElement), navigableSubSet(fromElement, toElement),和 navigableTailSet(E fromElement)方法。或者你可以获得特定的元素,通过ceiling(element), floor(element), higher(element), 和lower(element)方法。你也可以获取或删除元素,通过pollFirst()和pollLast()方法,升序的迭代 descendingIterator()补充了iterator()。

在表面之下,CouncurrentSkipListSet使用ConcurrentSkipListSet来完成所有的工作。

 

 

分享到:
评论

相关推荐

    Java1.8API中文手册

    另外,引入了TreeMap和TreeSet的子类NavigableMap和NavigableSet,支持高效的区间查询和排序。 二、Stream API Java 8 引入了Stream API,这是一组用于处理集合的新工具,可以进行高效且易于理解的并行数据处理。...

    Java7 SDK文档

    Java 7中对集合框架进行了优化,例如,改进了HashMap的性能,添加了NavigableMap和NavigableSet接口,提供更强大的排序和查找功能。 3. **I/O流**:Java的I/O系统在7版本中得到了进一步完善,NIO.2(New I/O 2)...

    Java6 Collection Framework 新特性概览.pdf

    - **定义**:这两个类分别实现了NavigableSet和NavigableMap接口。 - **特点**: - 在原有基础上增加了更多导航功能,提高了搜索效率。 #### 4. Collections 工具类中的新增方法 - **newSetFromMap(Map)** - ...

    Java API 1.6

    - **`NavigableMap`与`NavigableSet`**:提供有序遍历和范围操作的接口,便于在排序或区间操作时使用。 3. **I/O与NIO** - **NIO.2**:引入了New I/O 2,提供了文件系统操作的新API,如`java.nio.file`包,支持...

    javaAPI文档

    此外,`java.util`包中的一些经典集合框架,如`ArrayList`、`HashMap`和`HashSet`,在1.6版本中也有了新的特性,比如`TreeMap`和`TreeSet`引入了`NavigableMap`和`NavigableSet`接口,允许更灵活的排序和遍历操作。...

    Java类库的更新.pdf

    - Java 8 引入了新的集合接口,如 `NavigableMap` 和 `NavigableSet`,以及类型安全的队列 (`checkedQueue`)。 - 还有一些其他实用方法,如 `Collections.synchronizedXXX` 用于线程安全的集合操作,以及 `...

    Java structures

    此外,NavigableSet和NavigableMap提供了更高级的导航操作。 5. 序列化:ObjectOutputStream和ObjectInputStream支持对象的序列化和反序列化,是持久化数据或在网络间传输对象的关键。 二、设计模式 1. 单例模式...

    java api 1.7

    - `NavigableMap`和`NavigableSet`提供了排序和范围查询功能。 5. **文件系统API**: - 引入了`java.nio.file`包,提供了新的文件系统API,支持Path对象,更易于操作文件和目录。 6. **日期和时间API**: - `...

    java集合框架全面进阶.pdf

    7. **Java集合框架中的重要类和方法**:包括但不限于Collection、Set、List、Map、Iterator、EnumSet、EnumMap、SortedSet、NavigableSet、SortedMap、NavigableMap以及它们的实现类。 在Java集合框架的发展史上,...

    良葛格 JDK 5.0 学习笔记

    10. **集合框架的改进**:包括对Set、List和Map接口的实现类进行了性能优化,以及对NavigableSet和NavigableMap的新增,提供了有序和双向遍历的能力。 这些是JDK 5.0版本中的一些主要改进和新特性,对于Java初学者...

    JAVASE7 API

    - `NavigableMap`和`NavigableSet`提供了更多的导航和排序功能。 5. **类型推断**(Type Inference for Generic Instance Creation): Java 7引入了钻石操作符`&lt;&gt;`,简化了匿名内部类和泛型实例化过程,编译器...

    Java虚拟机规范 JavaSe7

    5. 集合框架增强:JavaSe7引入了新的集合接口和实现,如`Map.Entry`的`remove()`方法,以及`NavigableSet`和`NavigableMap`,提供了更强大的排序和遍历功能。 6. try-with-resources语句:这是一个新的异常处理结构...

    jdk1.5 java

    JDK 1.5对`TreeSet`和`TreeMap`进行了改进,提供了`NavigableSet`和`NavigableMap`接口,以及`subSet`、`headSet`和`tailSet`等方法,方便对有序集合进行高效的操作。 ### 8. **内省增强(Introspection ...

    java Tree

    博客文章可能还涵盖了如何自定义比较器以实现特定的排序逻辑,以及如何利用`NavigableSet`和`NavigableMap`的高级功能,如`higherKey()`, `lowerKey()`, `firstKey()`, `lastKey()`等,这些方法允许我们基于树的有序...

    JDK_API_1_6_zh_CN

    1. 集合框架的改进:Java 1.6对集合框架进行了优化,例如增加了`NavigableSet`和`NavigableMap`接口,它们提供了更高级别的排序和导航功能。 2. 枚举类型:在1.5版本引入后,1.6继续完善了枚举类型的使用,使得枚举...

    关于java树型结构

    - `java.util.NavigableSet`和`java.util.NavigableMap`:扩展了`TreeSet`和`TreeMap`,支持范围查询和导航操作。 5. **数据库中的树结构**: - SQL中的层次查询,如Oracle的CONNECT BY,MySQL的WITH RECURSIVE。...

    java1.7-API-英文版

    5. **集合框架增强**:Java 7对集合框架进行了优化,如`ArrayList`和`HashMap`的性能提升,以及`NavigableSet`和`NavigableMap`的引入,这些集合提供了按特定顺序遍历和查找元素的能力。 6. **自动资源管理**:`try...

    Java容器类接口框架总览1

    Map.Entry代表键值对,SortedMap接口提供了按键排序的Map,NavigableMap进一步提供了导航功能,便于查找最近的键值对。 5. **Set接口** Set接口代表不允许重复元素的集合,继承自Collection接口。Set接口没有顺序...

    JDK 7 源码

    JDK 7引入了`java.util.NavigableMap`和`java.util.NavigableSet`接口,这些接口扩展了`SortedMap`和`SortedSet`,提供了更高级别的遍历和查找功能。此外,`java.util.ConcurrentSkipListMap`和`java.util....

    javaAPI1.7机器翻译,

    9. **改进的集合框架**:包括`NavigableSet`和`NavigableMap`接口的增强,以及`Collections.sort()`和`Arrays.sort()`方法性能的提升。 10. **改进的反射API**:增加了对注解和类型参数的反射支持。 这个翻译文档...

Global site tag (gtag.js) - Google Analytics