【发布时间】:2017-03-24 02:39:36
【问题描述】:
看了一些非官方的参考资料,想在这里确认一下我的理解是正确的。假设我们不时添加新的(独特的)元素,
-
ArrayList<T>会重新分配内存,因为它的内存需要是连续的,当新插入的元素的内存增长超过某个阈值时,会发生更大的连续内存空间的重新分配,现有的元素会被移动到新分配的更大的连续内存空间; -
HashSet<T>和HashMap<T>没有这样的问题,因为它们的记忆不需要连续?
顺便说一句,如果有关于这些领域的好文章,也感谢您的参考。
问候, 林
【问题讨论】:
-
阅读the javadoc。它说:当哈希表中的条目数超过负载因子和当前容量的乘积时,对哈希表进行重新哈希(即重建内部数据结构),使哈希表大约有两倍桶数
-
@LinMa 我评论中的引用摘自 HashMap 的 javadoc。我在评论中的链接链接到 HashMap 的文档。 HashSet 是使用 HashMap 实现的。你真的需要花一些时间仔细阅读。
-
LinkedList就是这样一种数据结构。 TreeSet 和 TreeMap 也是如此。但是你多虑了。不重新分配并不意味着它更快。 Map 和 List 的用途完全不同。如果需要列表,请使用列表。如果您需要一个集合,请使用一个集合。如果您需要地图,请使用地图。除了非常特定的用例之外,ArrayList 比 LinkedList 更快(并且使用更少的内存)。
标签: java arraylist hashmap hashset