我聽說過某些語言中被稱爲「盒裝」的類型。說一個類型是「盒裝」是什麼意思?
在Java中,我聽說過「autoboxing」。這是什麼?它是否有類型的包裝類?如果我使用盒裝或非盒裝類型,我的代碼如何更改?
我聽說過某些語言中被稱爲「盒裝」的類型。說一個類型是「盒裝」是什麼意思?
在Java中,我聽說過「autoboxing」。這是什麼?它是否有類型的包裝類?如果我使用盒裝或非盒裝類型,我的代碼如何更改?
某些數據類型被視爲「原始」,這意味着它們不被視爲對象並且不具有對象的屬性。
在大多數平臺上,整數和字符都是原始類型的例子,但可以裝箱。
拳擊意味着將它們包裹在一個對象中,以便它們具有對象的行爲。
確切的意思和行爲取決於您使用的語言。有些語言(比如Smalltalk ......至少在我這樣做的時候會迴避......)不允許任何基本類型,並且認爲所有東西都是一個對象,但是會有與此相關的性能損失,因爲在最後當天,處理器需要使用原始數據和原始內存來完成有用的工作。如果要添加兩個已裝箱的整數(例如,在幕後將其「拆箱」爲原始類型),則會添加數字,然後將它們裝箱回新的整數。
盒裝類型意味着值被分配在堆上的塊中並通過指針引用。這對於實現運行時的一致性(它使擁有泛型函數等變得更容易)是有益的,但需要額外的間接尋址。
通常,當您使用集合時,您正在處理對象數組。在像Java這樣的語言中,原語和對象之間有區別。當一個圖元被「裝箱」時,它基本上只是一個原始圖元的包裝,所以它可以很好的滿足期待Object的其他框架。
自動裝箱只是將原始物體放入物體或將物體透明地從物體中拉出來的行爲,所以您不必擔心自己做了額外的步驟。
是的,裝箱意味着採取值類型並將其包裝在引用類型中。由於Java引入了自動裝箱,你可以這樣做:
void foo(Object bar) {}
//...
foo(1);
並且java會自動將int 1變成一個Integer。在以前的版本中,你不得不做的事:在列表中使用泛型工作時,因爲你不能使用泛型使用原語,所以存儲整數
foo(new Integer(1));
自動裝箱是最有用的在Java中,你必須製作一個List<Integer>
並將這些整數放入列表框中。
對Java的更具體信息:
自動裝箱允許Java自動在大多數情況下自動轉換之類的東西boolean
和int
其對象版本Boolean
和Integer
。它也允許相反的情況發生。
例如:java的
int a = 3; // no boxing is happening
Integer b = 3; // newer versions of java automatically convert the int 3 to Integer 3
int c = b; // these same versions also automatically convert Integer 3 to int 3
舊版本不具有自動裝箱將需要此代碼做同樣的事情:
int a = 3; // works the same
Integer b = new Integer(3); //must set up a Integer object manually
int c = b.intValue(); //must change Integer object to a primitive
然而,也有一些情況下,您仍然有手動完成任務。例如,假設你有兩個方法,像這樣一類:
assertEquals(int a, int b);
assertEquals(Object a, Object b)
現在,如果你試着這樣做:
Integer a = 3;
int b = 3;
assertEquals(a, b); // this will not compile
這不工作的原因是因爲它無法弄清楚是否應該將a
解除爲int
或將b
解鎖爲Integer
。因此,應該調用哪個方法簽名是不明確的。要解決此問題,您可以執行以下操作之一:
assertEquals((int) a, b);
assertEquals(a, (Integer) b);
裝箱意味着它們採用常規值類型並在其周圍創建對象。有點像把它放在一個盒子裏。這通常是要避免的,因爲構建對象的開銷。