日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

float占几个字节_一个HashMap对象占多少字节?

發布時間:2025/4/16 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 float占几个字节_一个HashMap对象占多少字节? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對象=對象頭+成員變量+對齊填充

對象頭結構:java對象在Heap里面的結構是這樣的:對象頭跟對象體,對象體跟C里面的結構體是一樣的,對象頭由兩個域組成:用于存放hashcode、同步、GC的_mask域,和指向方法區該對象Class對象的指針——_klass域,對于64位系統,頭部長度理論上講應該是8+8=16字節。但是從java6u23以后開始,64位的機器會自動開啟指針壓縮的功能,此時引用指針的長度為4字節。所以,對象頭長度應該為8+4=12。

成員變量:分兩類,包括一些基本類型,如int,long.byte,short,boolean等,以及引用類型,如String,Date引用。如果是引用類型,也應該把引用類型指向的對象納入當前對象。

對齊填充:JVM規定,對象的大小必須是8字節的整數倍,如果不足,則會補齊。

此外,對于數組,還會有一個標示數組長度的字段。其實數組也是一種類,會在后文中介紹。

以此為理論基礎,我們來計算一下常用的對象占用空間大小。

Integer

類結構圖:可以看到,只有一個私有的int型數據

所以Integer長度為:頭(8+4)+ int(4) = 16字節

Long

類結構圖

類似于Integer,只有一個long型的私有成員。

所以總長度為:頭(8+4)+long(8)+padding(4)=24字節

Object

類結構圖

沒有成員變量,所以占用空間頭(8+4)+padding(4)=16字節

String:“string”

類結構圖

這個結構稍微有點復雜,涉及到了數組成員。其實數組也是一種類型,只不過這種類型是JVM在運行時生成的類型,并不在class文件中定義,我們將其當做一種特殊的類就可以了。既然涉及到了成員變量是對象,那么,我們就要把String分成兩部分來計算:

String類型:頭部(8+4)+int(4)+int(4)+指向char[]對象的引用類型(4)=24字節

char[]類型:數組類型比普通對象多一個標示數組長度的字段,占4個字節。對于字符串“String”來說,頭部(8+4)+數組長度(4)+“String”(2*6)+padding(4)=32字節

因此,它的總占用空間為56字節

ArrayList

類結構圖

其實,還有一個 modCount成員,繼承自AbstractList類,那么對于一個 list = new ArrayList(); list.add("String");的list來說,它擁有兩個int,一個大小為10的數組(當 list.add() 第一個元素的時候,它會初始化elementData為一個長度10的數組)

ArrayList: 頭部(8+4)+int(4)+int(4)+數組引用(4)=24字節

elementData[] : 頭部(8+4)+長度(4)+string引用(4*10)=56字節

"String"字符串:這個我們之前計算過了,為56字節

所以,總空間大小為24+56+56=136字節

HashMap

類結構圖

HashMap內部結構比較復雜,除了一些基本的類型,還有比較復雜一點的集合類型。如table,是一個Entry數組,用來存放鍵值對,所有put進map中key-value都會被封裝成一個entry放入到table中去。而還有一些輔助對象,如entry,繼承自AbstractMap的keySet,values,這些都是在遍歷map元素時用到的集合,他們的主要功能是通過在自己內部維護一個迭代器向外輸出table中的數據,并不實際儲存key-value數據。

以 ?Map map = new HashMap(); 這時候我們計算一下他的占用空間情況:

總空間為:48+16=64字節

hashmap:頭部(8)+int(4*4)+float(4)+table數組引用(4)+entrySet引用(4)+keySet引用(4)+values引用(4)+padding(4)=48字節

table:頭部(8+4)+長度(4)=16字節

然后我們put進去一條數據:map.put( "100002", "張明");

當HashMap初始化的時候,他會開辟一個長度為16的table數組,每當put一個新的key-value的時候,他會根據當前threshold來判斷是否需要擴容,如果需要擴容,則會以倍數增長的方式擴容table數組。如16、32、64.具體原理請參考 http://blog.csdn.net/zq602316498/article/details/39351363

接下來讓我們計算一下這個map多占用的空間

hashmap:頭部(8)+int(4*4)+float(4)+table數組引用(4)+entrySet引用(4)+keySet引用(4)+values引用(4)+padding(4)=48字節

table: 80+32+16+16+56+48+0= 216字節

table:頭部(8+4)+長度(4)+entry(4*16)=80字節

entry:頭部(8+4)+k(4)+value(4)+next(4)+int(4)+padding(4)=32字節

key(String):56字節

value(String) :48字節

next :因為就只有一個元素,所以next值為null,0字節

entrySet:為空指針,0字節

keySet:空指針,0字節

values:空指針,0字節

綜上分析,這個map占用48+216+0+0+0=264字節

然后我們繼續調用 map.keySet() 方法,此時,keySet會被賦予一個類型為 HashMap$KeySet 的對象,這個對象的結構如下:

可以看到,它并不復雜,只是用來遍歷map key集合的一個工具類,

keySet :頭部(8+4)+padding(4)=16字節

所以,總大小為264+16=280字節

然后我們繼續調動 map.values(),和上面類似

values : 頭部(8+4)+padding(4)=16字節

所以,總大小為 280+16=296字節

然后我們繼續調用 map.entrySet(),

entrySet:頭部(8+4)+padding(4)=16字節

所以總大小為 296+16=312字節

長按掃碼關注我!

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的float占几个字节_一个HashMap对象占多少字节?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。