为什么原始类型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作为替代方法。 –