首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LinkedHashSet与HashSet内存消耗

LinkedHashSet与HashSet内存消耗
EN

Stack Overflow用户
提问于 2016-12-17 20:35:34
回答 2查看 1K关注 0票数 0

在Java中,与“正常”的LinkedHashSet相比,HashSet消耗的内存(字节)有多少?我知道,对于某些操作,LinkedHashSet稍慢一些,但是内存使用情况如何?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-17 20:55:42

https://github.com/DimitrisAndreou/memory-measurer/blob/master/ElementCostInDataStructures.txt

一个HashSet是~32个字节/元素;一个LinkedHashSet是~40个字节/元素。

票数 3
EN

Stack Overflow用户

发布于 2016-12-17 20:41:25

顾名思义和文档状态显式地显示,LinkedHashSet除了核心HashSet之外,还需要维护一个链接列表。我认为,在这里可以安全地假定内存消耗的上限可以近似为两个单独的数据结构:一个哈希集和一个链接列表。它们消耗了多少内存,这是另外一个问题。

但是,如果您需要有关使用的内存字节数的硬数据,则始终可以自己执行一些测试。这不应该是太难测试,或谷歌一段时间-我相信已经有一些测试结果在互联网上可用。

@编辑,在路易回答之后

对我来说,这似乎很有趣,为什么两者之间的差别更小。下面是我写的一个简单的基准:

代码语言:javascript
复制
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不同),如下所示:

代码语言:javascript
复制
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)相同。有人能解释一下价值观的差异吗?我是不是用错误的方法测量物体的尺寸?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41202793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档