根据 Java 8 中的this链接,为了避免地图中的冲突(HashMap, LinkedHashMap, and ConcurrentHashMap
),使用平衡树而不是{{ 1}}。
然后有什么区别:
LinkedList
和其他地图(TreeMap
)都是使用自我平衡树实现的,因为最差情况下的可访问性相同。 HashMap, LinkedHashMap, and ConcurrentHashMap
的排序我可以实现如下:
entry
除了排序和可访问性之外,public <K extends Comparable,V extends Comparable> LinkedHashMap<K,V> sortByKeys(LinkedHashMap<K,V> map){
List<K> keys = new LinkedList<K>(map.keySet());
Collections.sort(keys, (Comparator<? super K>) new Comparator<String>() {
@Override
public int compare(String first, String second) {
return first.compareTo(second);
}
});
}
的其他属性是什么?
答案 0 :(得分:0)
两者(TreeMap和其他地图(HashMap,LinkedHashMap和ConcurrentHashMap)都是使用自平衡树实现的,因为最坏情况下的可访问性是相同的。
在recalculate bucket index时jdk7和旧jdk size >= threshold中,每个存储桶作为linked list发送,但在jdk8中调整balancing-trees并将每个存储桶作为Red-Black Tree
将这样的东西放到jdk7中的HasMap中只有一个桶。然后查找节点为O(N)。
class Foo{
int hashCode(){
return 0;
}
}
Foo first=new Foo();
Foo last=new Foo();
map.put(first,"anything");
map.put(last,"anything");
map.get(last | first);// O(N)
将这样的东西放到jdk8中的HasMap中只有一个桶,但密钥实现了Comparable。然后查找节点为O(log(N)),但如果i
相同,查找节点将回退到O(N)。
class Foo implements Comparable<Foo> {
private int i;
public Foo(int i) {
this.i = i;
}
public int hashCode() {
return 0;
}
@Override
public int compareTo(Foo that) {
return i - that.i;
}
}
Foo first=new Foo(1);
Foo last=new Foo(2);
map.put(first,"anything");
for(int i=2;i<threshold;i++)
map.put(new Foo(i + 1), "anything");
map.put(last,"anything");
map.get(last | first);// O(log(N))
对LinkedHashMap进行排序,您可以创建一个TreeMap实例,因为Map.keySet()返回无序集而不是列表,因此您无法通过对其键进行排序来对地图进行排序。
public <K extends Comparable<? super K>, V> Map<K, V> sortByKeys(Map<K, V> map) {
return new TreeMap<K, V>(map);
}