Java集合教程 - Java特殊类型映射
已排序的映射
分类映射按顺序保存映射条目。
它基于键对映射条目进行排序从代码中的Comparable接口a Comparator对象。
如果键实现Comparable接口并且您使用Comparator对象,Comparator对象会做排序。
SortedMap接口继承了Map接口表示排序的映射。
Comparator comparator()返回用于在SortedMap中进行自定义排序的Comparator对象。
K firstKey()返回SortedMap中第一个条目的键。如果SortedMap为空,它会抛出一个NoSuchElementException。
SortedMap headMap(K toKey)返回其条目的SortedMap的视图将具有小于指定的toKey的键。视图由原始SortedMap支持。
K lastKey()返回SortedMap中最后一个条目的键。如果SortedMap为空,它会抛出一个NoSuchElementException异常。
SortedMap subMap(K fromKey,K toKey)返回SortedMap的视图其条目将具有从指定的键fromKey(包含)和toKey(exclusive)。
SortedMap tailMap(K fromKey)返回其条目的SortedMap的视图将具有等于或大于指定的fromKey的密钥。
TreeMap类是实现类SortedMap界面。下面的代码演示了如何使用SortedMap。import java.util.SortedMap;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
SortedMap sMap = new TreeMap<>();
sMap.put("CSS", "style");
sMap.put("HTML", "mark up");
sMap.put("Oracle", "database");
sMap.put("XML", "data");
SortedMap subMap = sMap.subMap("CSS", "XML");
System.out.println(subMap);
// Get the first and last keys String firstKey = sMap.firstKey();
String lastKey = sMap.lastKey();
System.out.println("First Key: " + firstKey);
System.out.println("Last key: " + lastKey);
}
}
上面的代码生成以下结果。
SortedMap与Comparator
要使用Comparator对象对SortedMap中的条目进行排序,使用TreeMap类的构造函数以Comparator作为参数。
以下代码显示了如何对基于排序映射的条目进行排序在他们的钥匙的长度随后按字母顺序键忽略情况:import java.util.Comparator;
import java.util.SortedMap;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Comparator keyComparator =
Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase);
SortedMap sMap = new TreeMap<>(keyComparator);
sMap.put("CSS", "style");
sMap.put("HTML", "mark up");
sMap.put("Oracle", "database");
sMap.put("XML", "data");
SortedMap subMap = sMap.subMap("CSS", "XML");
System.out.println(subMap);
// Get the first and last keys String firstKey = sMap.firstKey();
String lastKey = sMap.lastKey();
System.out.println("First Key: " + firstKey);
System.out.println("Last key: " + lastKey);
}
}
上面的代码生成以下结果。
导航映射
可导航映射由NavigableMap界面的实例表示。
它通过添加方法来扩展SortedMap接口对于键的最接近的匹配,以相反的顺序获得映射的视图等。
TreeMap类是NavigableMap接口的实现类。
以下代码显示如何使用NavigableMap。import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
NavigableMap nMap = new TreeMap<>();
nMap.put("CSS", "style");
nMap.put("HTML", "mark up");
nMap.put("Oracle", "database");
nMap.put("XML", "data");
System.out.println("Navigable Map:" + nMap);
Entry lowerXML = nMap.lowerEntry("XML");
Entry floorXML = nMap.floorEntry("XML");
Entry higherXML = nMap.higherEntry("XML");
Entry ceilingXML = nMap.ceilingEntry("XML");
System.out.println("Lower:" + lowerXML);
System.out.println("Floor:" + floorXML);
System.out.println("Higher:" + higherXML);
System.out.println("Ceiling:" + ceilingXML);
// Get the reverse order view of the map NavigableMap reverseMap = nMap.descendingMap();
System.out.println("Navigable Map(Reverse Order):" + reverseMap);
}
}
上面的代码生成以下结果。
并发映射
ConcurrentMap允许我们在不锁定映射的情况下执行并发操作。
我们可以在使用其实现类创建并发映射时选择并发级别。
ConcurrentHashMap类是ConcurrentMap接口的实现类。 它们都在java.util.concurrent包中。import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class Main {
public static void main(String[] args) {
ConcurrentMap cMap = new ConcurrentHashMap<>();
cMap.put("A", "A");
System.out.println("Concurrent Map: " + cMap);
System.out.println(cMap.putIfAbsent("A", "1"));
System.out.println(cMap.putIfAbsent("B", "B"));
System.out.println(cMap.remove("A", "B"));
System.out.println(cMap.replace("A", "B"));
System.out.println("Concurrent Map: " + cMap);
}
}
上面的代码生成以下结果。