Java中的Integer()有多大?

Integer()有多大? 我问因为下面发生的事情。

在尝试将10 ^ 6个整数(在[0,10 ^ 6)中)放入双端队列后,我的堆内存耗尽。 该实现使用双向链表并显示为

Deque implements Iterable { } 

但是当使用Strings时,我能够完成而不必增加堆的大小:

 String hw = "Hello, world."; for (i=0;i<10**6;i++) { myDq.addToEnd(hw); } 

hw总是引用相同的一个对象,所以即使你要添加10 ^ 6个项目(因此内部有~10 ^ 6个节点),你只会分配一个String对象 – 很多对这个对象的引用,但只是那一个对象。

事实上,即使你做了类似的事情:

 for (i=0;i<10**6;i++) { String hs = "Hello, world." myDq.addToEnd(hw); } 

由于字符串实习,你只有一个String :整个JVM中所有相等的字符串文字都使用相同的一个String对象。

如果你把它改成一点,我怀疑你会得到同样的OOM:

 for (i=0;i<10**6;i++) { String hs = new String("Hello, world.".toCharArray()); myDq.addToEnd(hw); } 

每次都会分配一个新的String ,并带有原始String的char数组的副本。

(OOM是OutOfMemoryError的常见昵称,这是Java在堆空间用尽时抛出的,无法通过垃圾收集器(GC)回收。在这种情况下,列表和通过它可以访问的所有对象 -程序仍然可以访问内部节点对象, IntegerString值等,因此无法进行GC操作,因此JVM无处可寻求更多的堆空间。)