Answers:
Map界面提供了三个 集合视图,这些视图允许将地图的内容视为一组键,值的集合或一组键-值映射。该订单的地图被定义为其中在地图上的集合视图迭代返回元素的顺序。某些地图实现(例如
TreeMap
类)会对其顺序做出具体保证;其他人,例如HashMap
上课者,则不会。
- 地图
此链表定义了迭代顺序,通常是将键插入映射的顺序(insert-order)。
所以,是的,keySet()
,values()
,和entrySet()
顺序(三组收集的意见中提到)返回值的内部链接列表的用途。是的,JavaDoc支持Map
并LinkedHashMap
保证它。
毕竟,这就是本课的重点。
Collection
只是values()返回的基类。它返回的Collection的实现仍由LinkedHashMap
。在LinkedHashMap
这种情况下,它将返回一个LinkedValues
实例,即LinkedHashMap.java中的私有类。
Map
),该文档明确将地图的顺序与地图集合视图上的迭代器联系在一起(并弄清楚这些集合视图是什么)。那是我所缺少的。
从源头上看,看起来确实如此。keySet()
,values()
和entrySet()
都在内部使用相同的条目迭代器。
不要混淆LinkedHashMap.keySet()
并LinkedHashMap.entrySet()
返回Set,因此它不保证订购!
Set
是一个接口HashSet
,TreeSet
等众生它的实现。接口的HashSet
实现Set
不能保证排序。但是TreeSet
可以。也LinkedHashSet
可以。
因此,取决于如何Set
实现LinkedHashMap
才能知道返回的Set引用是否可以保证排序。我查看了的源代码LinkedHashMap
,它看起来像这样:
private final class KeySet extends AbstractSet<K> {...}
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...}
因此,LinkedHashMap / HashMap具有自己的Set
ie 实现KeySet
。因此,请勿将此与混淆HashSet
。
同样,通过将元素插入存储桶的方式来保持顺序。看一下的addEntry(..)
方法LinkedHashMap
并将其与之比较,以HashMap
突出显示HashMap
和之间的主要区别LinkedHashMap
。
AFAIK没有记录,因此您不能“正式”假设如此。但是,当前的实施方式不太可能会改变。
如果您想确保顺序,则可能要遍历整个地图,然后将其插入具有所选顺序功能的排序集中,尽管您自然会支付性能费用。
我认为您不能假定keySet()和values()的顺序。
我可以轻松地编写LinkedHashMap的实现,只要我坚持Map中定义和在HashMap中覆盖的这两个方法的协定,该实现将返回无序的keySet()和values()。
LinkedHashMap
该类的全部目的是在迭代地图时保留元素的顺序,并且对此行为进行了详细说明。如果编写子类而不遵守基类规范,那么您所做的事情就非常错误。
values()
以及的问题keySet()
,因此我将问题扩展为包括该问题。这意味着可以关闭更多问题作为重复项。