在Java中,与“普通”HashSet相比,LinkedHashSet消耗的内存(字节)是多少? 我知道对于某些操作,LinkedHashSet稍慢一些,但是内存使用情况呢?
答案 0 :(得分:3)
https://github.com/DimitrisAndreou/memory-measurer/blob/master/ElementCostInDataStructures.txt
HashSet
是~32字节/元素; LinkedHashSet
是~40个字节/元素。
答案 1 :(得分:2)
顾名思义并且文档明确说明,LinkedHashSet
除了核心HashSet
之外,还需要维护一个链表。我认为可以安全地假设内存消耗的上限可以近似,就好像你只有两个独立的数据结构:哈希集和链表。他们消耗多少记忆,是一个单独的问题。
但是,如果您需要有关所用内存字节数的硬数据,您可以随时自行执行某些测试。它不应该太难测试,或谷歌一段时间 - 我确定在互联网上已经有一些测试结果。
@edit,在Louis'之后答案强>
对我而言,为什么差异较小似乎很有趣。这是我写的简单基准:
package com.company;
import com.javamex.classmexer.MemoryUtil;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Random;
public class Main
{
public static void main(String[] args)
{
// Creating data structures under test -------
HashSet<Integer> hashSet = new HashSet<>();
Random random = new Random();
for (int i=0; i<1000000; i++)
{
hashSet.add(random.nextInt());
}
LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>(hashSet);
// Measuring memory usage --------------------
long sizeOfHashSet = MemoryUtil.deepMemoryUsageOf(hashSet);
long sizeOfLinkedHashSet = MemoryUtil.deepMemoryUsageOf(linkedHashSet);
System.out.println("Size of HashSet:\n" + sizeOfHashSet + " B");
System.out.println("Size of LinkedHashSet:\n" + sizeOfLinkedHashSet + " B");
System.out.println("LinkedHashSet is bigger from HashSet by " + (sizeOfLinkedHashSet*100/sizeOfHashSet - 100) + "%");
System.out.println("\n");
long numberOfElements = hashSet.size();
System.out.println("Number of elements in the test HashSet: " + numberOfElements);
System.out.println("Average size of a single element in HashSet: " + sizeOfHashSet/numberOfElements + " B");
System.out.println("Average size of a single element in LinkedHashSet: " + sizeOfLinkedHashSet/numberOfElements + " B");
}
}
运行几次后,我注意到它打印出仙女稳定的结果(物体大小相差+/- 2 KiB),我在下面提到:
Size of HashSet:
56347616 B
Size of LinkedHashSet:
64348040 B
LinkedHashSet is bigger from HashSet by 14%
Number of elements in the test HashSet: 999876
Average size of a single element in HashSet: 56 B
Average size of a single element in LinkedHashSet: 64 B
有趣的是,它与路易斯给出的值不一致。但是,每个元素的字节差异与Louis写的相同(8 B)。有人可以解释价值观的差异吗?我是以错误的方式测量物体尺寸吗?