keyset()
保持顺序。我的问题是,如果它保证顺序,为什么LinkedHashMap
的源代码不返回一个保证顺序的Set
类型的对象,比如LinkedHashSet
?我能想到的一个原因是,LinkedHashSet使用了一个map,这会增加内存分配(取决于AbstractSet的实现方式)。这也是因为它未来的实现可以支持keyset吗?就像这篇文章中所说的那样:Is it better to use List or Collection?
所以,如果没有阅读返回List符合编程到最高适当接口的原则。
返回Collection会对用户造成歧义,因为返回的集合可能是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();
}
}
LinkedKeySet
在其元素上提供排序。我并不想暗示一个Set
不能同时实现List
接口。@Andreas的回答解决了你关于“为什么”的问题;而我试图解决的是“我们该怎么办”的一面。 - Austin