簡體   English   中英

java如何存儲數據結構

[英]how java stores data structures

我還沒有找到任何好的答案,但是在數組之類的數據結構中,java是否將對象存儲在數組中或指向所述對象的指針,

這是一個與之相關的示例,因為我有一個占用50個字節的對象,並希望以2種不同的方式組織它,而不必在每次搜索之前對其進行排序,因此我將其分為2個數組。 是假設指針為2bytes將占用2 * 50 * n個字節或((2 * 2)+50)* n

我知道那不是確切的,但是如果n是2000,那將是接近的

在Java中,主要有兩種類型-原語和對象。 對象總是存儲在堆中,而您的變量是一個指針。 例如, int[]存儲值,而Integer[]存儲指向具有int字段的Integer實例的指針。

每個對象只有一個副本,並且引用將存儲在每個數組中。 盡管它對您是透明的,但是您創建的對象實際上並沒有存儲在數組內部,數組只是Java用於指示“按此順序的一系列對象”的機制。 數組實際上由一系列指針組成,這些指針可以是32位或64位(取決於程序所運行的硬件)。 不管對象的大小是多少,指針都將相同。

因此,如果要將這兩個對象都存儲在兩個不同的數組中,則使用的內存總量將為n*50+2*2*n n*50因為那是存儲這些對象所需的內存,對於組成每個數組的兩組指針,則需要2*2*n

Java中的所有對象都是通過引用來處理的-當您擁有除原始數據類型以外的任何數組時,該數組僅包含指針。 不可能(就像在C語言中一樣)構造一個存儲值而不是引用的數組(或就此而言,其他任何類型的對象)。

因此,從上面回答您的示例,Java數組占用((2 * 2)+50)* n個字節。 2 * 2 * n用於兩個指針數組,n * 50用於對象。

在Java中,所有對象都是指針。 因此,任何與內容對象無關的數組都具有相同的大小。

其他幾個人回答了眼前的問題。 我將添加兩個要點:

  1. 瑣碎的技術性:我認為Java中的指針通常為4個字節,盡管在任何規范中均未指定,因此取決於實現。

  2. 絕對不是瑣碎的技術性:數組中存儲的不是對象本身而是指針(在Java術語中稱為“句柄”)。 因此,假設您有兩個指向同一對象集的數組,例如“ arrayByFoo”和“ arrayByBar”,而arrayByFoo [42]與arrayByBar [27]指向同一對象。 然后,您說arrayByFoo [42] .setPlugh(3)。 您已經更改了對象,因此,如果稍后再說arrayByBar [27] .getPlugh(),它將返回更新后的值3。

另一方面,如果您說arrayByFoo [42] = new MyObject(),則現在已經更改了引用,因此arrayByFoo [42]不再等於arrayByBar [27]。 arrayByBar仍指向舊對象,而arrayByFoo現在指向新對象。 (當然,假設您還不更新arrayByBar。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM