LinkedHashSet vs HashSet内存消耗

时间:2016-12-17 20:35:35

标签: java

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

2 个答案:

答案 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)。有人可以解释价值观的差异吗?我是以错误的方式测量物体尺寸吗?