爲什麼原始類型int自動更改爲對象Integer當我把primitve類型int到ArrayList在java中?爲什麼int在java中自動變爲Integer?
回答
Autoboxing
自動將primitive
類型轉換爲其合適的wrapper
對象。背後的原因是你不能把一個原語放入一個集合中。之前Java 5來了,你必須自己做這件事,但現在這是爲你自動處理。
在這裏看到這個鏈接查看更多細節:http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
這就是所謂的在java中auto-boxing
。
正如任何Java程序員所知道的,您不能將int(或其他原始值)放入集合中。集合只能保存對象引用,所以你必須將原始值裝入適當的包裝類(在int情況下爲Integer)。當你把對象從集合中取出時,你得到了你放入的Integer;如果您需要int,則必須使用intValue方法取消Integer。所有這些拳擊和拆箱都是一件痛苦的事情,並且會讓你的代碼混亂不堪。自動裝箱和取消裝箱功能可自動執行此過程,消除疼痛和混亂。
ArrayList中只能存儲對象。 int是一個原始數據類型,因此它對對象的等價物是「自動裝箱」的。這隻發生在Java 5之前,你必須自己填寫Integer。
自動裝箱發生,因爲集合只能保持對象不是原語。如果你需要一個int基元,你必須在讀出它時用intValue()方法取消它。
這是java 1.5引入的java語言特性。它被稱爲自動裝箱。
粗略地說,它在Java基本類型之間轉換爲它們相應的包裝類類型。編譯器檢測何時需要收件箱(原始到包裝器)或發件箱(包裝到原始),並將表達式擴展爲正確的字節碼。
因此,在幕後,當您添加int
時,會將Integer
的實例添加到列表中。
請閱讀有關引用類型和值類型的更多信息以更好地理解此內容。
ArrayList僅保存對對象的引用。它並不具有價值本身。
由於int是一個值類型,它沒有引用。當您將int轉換爲Integer時,您會在內存中爲Integer創建一些空間,該Integer包含一個int值,並且對您創建的Integer對象有一個引用。
現在你的ArrayList只是保存了Integer對象的地址,而不是保留整數本身。
認爲它是這樣的:在你的ArrayList 一個元件佔用的內存塊:200 你的Integer對象是存儲塊中:400。 在內存塊200中,不是保留整數的值,而是保持內存地址爲400.
原因,我不知道。我想他們只是決定這樣做,以保持簡單。
- 1. Java inline int swap。爲什麼在Java中
- 2. int爲什麼沒有改變? java的
- 3. 爲什麼我們在枚舉中寫入Integer而不是int?
- 4. Integer == int允許在java中
- 5. 爲什麼int的對象包裝是Integer而不是Int?
- 6. 爲什麼分割的結果在C#中會自動變爲int?
- 7. int爲什麼變窄?
- 8. 爲什麼out.write()在Java中改變int值?
- 9. 爲什麼Java不autobox INT []爲整數[]
- 10. Scala中Int和Integer有什麼不同?
- 11. 爲什麼在Java中加運算符總是產生Integer?
- 12. 爲什麼在默認值Java Integer結果中使用NullPointerException?
- 13. 爲什麼可以在Java中正確打印Integer對象?
- 14. 如何在java中將int []轉換爲Integer []?
- 15. 爲什麼char轉換爲int類型而不是char轉換爲Java中的Integer
- 16. 爲什麼PHP將String轉換爲Integer?
- 17. 爲什麼構造實例<Integer>而不是int
- 18. 爲什麼getActualTypeArguments返回Object而不是Integer for Option [Int]?
- 19. 爲什麼Integer和int可以互換使用?
- 20. Java HashMap <Integer,Integer> vs int []
- 21. 爲什麼在java中有變量
- 22. Java轉換爲Integer?
- 23. 爲什麼一定要我投來(INT?)在C#中,當變量類型爲[INT?]
- 24. php - 爲什麼id自動變成0?
- 25. integer在Python中被提升爲long,反之亦然。爲什麼?
- 26. 在Java中列出類的toArray爲什麼我無法將「Integer」列表轉換爲「Integer」數組?
- 27. 爲什麼我不能使用「instanceof」作爲Int和Integer的比較數組?
- 28. Sqlite Integer null == java int 0
- 29. 爲什麼(Integer)1 ==(Integer)1返回true,但(Integer)200 ==(Integer)200返回false?
- 30. Java屬性 - int變爲空
自動裝箱發生,因爲集合只能容納不是基元的對象 – pengibot
如果要使用基元,可以使用TIntArrayList作爲替代方法。 –