假設我們有三個 Bear 物件:mamma、poppa 和 baby。我們創建一個“熊”ArrayList 并將指向三個熊的指標添加到 ArrayList。
// Create three bears
Bear momma = new Bear();
Bear poppa = new Bear();
Bear baby = new Bear();
// Create an ArrayList, add the three Bear pointers
ArrayList bears = new ArrayList();
bears.add(momma);
bears.add(poppa);
bears.add(baby);
上面的代碼產生了檔案中顯示的記憶體結構。
請注意, bears.add(momma) 行不會將 momma Bear 物件的副本添加到 ArrayList。相反,它只是將指向 momma Bear 物件的指標添加到 ArrayList。在 Java 中,通常會有這樣的“淺”指標指向一個物件——有一個物件有許多指向它的指標。
關于記憶體結構,請參考下面給出的檔案第 3 頁的圖表: 檔案
我的疑惑,
1)有人能解釋一下上面這段話想說什么嗎?
如檔案中所述,java中的淺指標是什么意思?
ArrayList 中究竟存盤了什么。在顯示結構的影像中,顯示有兩個指標指向 ArrayList 中的每個元素。
據我所知,ArrayLists 只能將參考變數存盤到物件。但是,從 ArrayList 中的塊內部指向的指標是什么?
ArrayLists 中存盤的是什么?
uj5u.com熱心網友回復:
Bear momma = new Bear();
這段代碼是這個的簡寫:
Bear momma; [1]
new Bear(); [2]
momma = that thing; [3]
第一行創建了一個新變數,并將其命名為 momma。在java中,所有變數都很小。想想帶有標題的便利貼。因此,這會抓取一張便利貼,在上面寫下標題,然后將其留空。
第二行是一整只熊,它比便利貼大得多。請記住:如果您想要一個新的熊,new Bear()需要由您或其他人的代碼執行。
第三行只是在你的便利貼上寫下熊住的地址。
便利貼很小;它們有足夠的空間容納原語(int, long, byte, double, float, short, boolean, character- 這就是所有原語,用語言硬編碼)..或地址。
每當你呼叫一個方法時,你都會復制一份你的 postit(postit 很小而且你有很多)并將副本交給方法。當該方法完成后,它會將這些帖子扔進垃圾箱。
讓我們嘗試一些東西。假設熊有一個setName方法。
Bear bear1 = new Bear();
Bear bear2 = bear1;
bear1.setName("Bruno");
System.out.println(bear2.getName());
這將列印布魯諾!- 我們有 2 個 postits,兩個都有相同的地址。只有一只熊。
Bear bear = new Bear();
bear.setName("Bruno");
test(bear);
System.out.println(bear.getName());
public void test(Bear bear) {
bear.setName("Brenda");
}
這將列印“布倫達”。我們制作了一只新熊,然后我們有一張貼有這只熊地址的便利貼。然后我們復制這個 postit,把它交給測驗方法。然后該方法跟隨它的帖子上的地址(.是java for:Follow(“取消參考”是官方術語)并告訴熊它在那里找到它的名字是什么。
private static final Bear brenda = new Bear("brenda");
...
Bear bear = new Bear();
bear1.setName("Bruno");
test(bear);
System.out.println(bear1.getName());
public void test(Bear bear) {
bear = brenda;
}
這列印布魯諾!你可能已經預料到了布倫達。請記住,=在 java 中是:“清除您的 postit 并復制此 postit 的地址”。
主代碼將 postit 的副本傳遞給測驗方法。然后這個測驗方法會擦掉這個postit,在上面寫下另一只熊的地址,然后把它扔進垃圾桶。該test方法在這里沒有任何用處。
ArrayLists 是 postits 的串列。不是熊的名單——這需要整個動物園,太笨重了。
Bear bear = new Bear();
List<Bear> bears = new ArrayList<Bear>();
bears.add(bear);
test(bears);
System.out.println(bears.get(0));
public void test(List<Bear> bears) {
bears.clear();
bears.add(brenda);
}
上面代碼的測驗方法從串列中洗掉帶有第一個熊地址的 postit,然后添加一個帶有 brenda 地址的新 postit。然后主代碼從串列中獲取第一個 postit 的副本。其中將有布倫達的地址。(為什么要復制?一切都是復制品。Java 正在復制數百萬個帖子。從 CPU 的角度來看,它只是復制一個數字)。
Bear bear = new Bear("bruno");
bear = new Bear("brenda");
這是一只新的熊,在你的便利貼上寫下它的地址。
然后它產生另一只熊(我們現在有 2 只熊)。然后它把地址劃出給布魯諾,然后把地址寫給布倫達。
布魯諾怎么了?布魯諾在樹林里迷路了。現在世界上有零個貼有布魯諾地址的便利貼,所以這個資訊(布魯諾住在哪里)丟失了。布魯諾還在,但我們不知道在哪里。森林遼闊,沒關系,我們永遠不會碰到他。
最終,垃圾收集器將完全擺脫 bruno。可憐的布魯諾。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/415837.html
標籤:
上一篇:C鏈表不兼容的指標型別
下一篇:使用欄位元素初始化指向結構的指標
