我已经阅读了 Java 文档以及 LinkedHashMapskeyset()
维护秩序的这篇文章。
从 LinkedHashMap 对象返回键和值的顺序是否得到保证?
我的问题是,如果它保证顺序,那么为什么源代码不LinkedHashMap
返回Set
保证顺序的类型的对象LinkedHashSet
?
我可能想到的一个原因是 LinkedHashSet 使用了一个会增加内存分配的映射(取决于 AbstractSet 的实现方式)。是否也是因为它未来证明了密钥集的实现?
就像这个答案在这篇文章中所说:使用列表还是集合更好?
返回列表与编程到最合适的接口是一致的。
返回一个集合会给用户带来歧义,因为返回的集合可能是:Set、List 或 Queue。
因此,无需阅读文档keyset()
不是模棱两可吗?
keyset()
源代码:
public Set<K> keySet() {
Set<K> ks = keySet;
return (ks != null ? ks : (keySet = new KeySet()));
}
private final class KeySet extends AbstractSet<K> {
public Iterator<K> iterator() {
return newKeyIterator();
}
public int size() {
return size;
}
public boolean contains(Object o) {
return containsKey(o);
}
public boolean remove(Object o) {
return HashMap.this.removeEntryForKey(o) != null;
}
public void clear() {
HashMap.this.clear();
}
}