在Java中,與「常規」HashSet相比,Java中有多少內存(字節)是LinkedHashSet? 我知道LinkedHashSet對於某些操作稍慢,但內存使用情況如何?LinkedHashSet vs HashSet內存消耗
回答
https://github.com/DimitrisAndreou/memory-measurer/blob/master/ElementCostInDataStructures.txt
HashSet
一個是〜32個字節/元件;一個LinkedHashSet
是〜40個字節/元素。
顧名思義,文檔狀態明確,LinkedHashSet
,除了核心HashSet
,需要維護一個鏈表。我認爲這裏假設內存消耗的上限可以近似,就好像你只有兩個獨立的數據結構:一個散列集和一個鏈表。他們消耗多少內存,是一個單獨的問題。但是,如果您需要關於使用的內存字節數的硬數據,您可以隨時自行執行一些測試。測試或谷歌一段時間不應該太難 - 我確定互聯網上已經有一些測試結果可用。
@edit,路易斯的回答後
這似乎有趣,我爲什麼差別較小。這裏有一個簡單的基準我寫道:
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昆明植物研究所不同)我下面要介紹後:
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)。有人可以解釋價值觀的差異嗎?我是否以錯誤的方式測量物體的大小?
'HashSet'是32字節/元素; 'LinkedList'是24個字節/元素,'LinkedHashSet'是40個字節/元素。他們不完全只是添加。 –
在運行32位與64位JVM時可能存在差異,有或沒有'CompressedOops',等等。 –
- 1. Direct2D內存消耗
- 2. joda ArrayIntList(5000000)vs int [5000000]內存消耗
- 3. CF vs Full Framework中的內存消耗
- 4. Memcacheq vs cronjob在內存消耗方面
- 5. 內存消耗
- 6. HashSet的VS TreeSet的VS LinkedHashSet上添加重複值
- 7. 爲什麼我的hashset如此消耗內存?
- 8. HSQLDB內存消耗
- 9. QRegularExpressionMatch內存消耗
- 10. QTreeView內存消耗
- 11. EntityManager內存消耗
- 12. Boost.Flyweight內存消耗
- 13. Luakit內存消耗
- 14. 佔內存消耗
- 15. visual studio 2010內存消耗
- 16. Emgu CV - 內存泄漏(內存消耗)
- 17. .NET內存消耗問題
- 18. JTextArea消耗大量內存
- 19. Tomcat 6內存消耗
- 20. Netty 4 beta1內存消耗
- 21. CGImageRef |內存消耗|泄漏
- 22. MongoDB內存消耗低
- 23. BigDecimal(Java)的內存消耗
- 24. Node.js和MongoDB內存消耗
- 25. KDB/Q內存消耗
- 26. SOLR收集內存消耗
- 27. Groovy 64位內存消耗
- 28. Matlab函數內存消耗
- 29. Sidekiq消耗太多內存
- 30. 減少內存消耗
沒有看到那個笨蛋@Bruno_Ferreira – pvg
可能是幾個指針和列表標題的代價。你是否在[GrepCode](http://grepcode.com)上檢查實現源? –