在Java中,与“正常”的LinkedHashSet相比,HashSet消耗的内存(字节)有多少?我知道,对于某些操作,LinkedHashSet稍慢一些,但是内存使用情况如何?
发布于 2016-12-17 20:55:42
https://github.com/DimitrisAndreou/memory-measurer/blob/master/ElementCostInDataStructures.txt
一个HashSet是~32个字节/元素;一个LinkedHashSet是~40个字节/元素。
发布于 2016-12-17 20:41:25
顾名思义和文档状态显式地显示,LinkedHashSet除了核心HashSet之外,还需要维护一个链接列表。我认为,在这里可以安全地假定内存消耗的上限可以近似为两个单独的数据结构:一个哈希集和一个链接列表。它们消耗了多少内存,这是另外一个问题。
但是,如果您需要有关使用的内存字节数的硬数据,则始终可以自己执行一些测试。这不应该是太难测试,或谷歌一段时间-我相信已经有一些测试结果在互联网上可用。
@编辑,在路易回答之后
对我来说,这似乎很有趣,为什么两者之间的差别更小。下面是我写的一个简单的基准:
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编写的(8B)相同。有人能解释一下价值观的差异吗?我是不是用错误的方法测量物体的尺寸?
https://stackoverflow.com/questions/41202793
复制相似问题