首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Int值和Integer对象是在哪里创建的?

Int值和Integer对象是在哪里创建的?
EN

Stack Overflow用户
提问于 2015-08-07 19:30:44
回答 3查看 2.5K关注 0票数 7

当我们初始化一些整数值时,比如

代码语言:javascript
复制
int a = 10; 

代码语言:javascript
复制
Integer b = new Integer(20);
Integer b = 30;

这些对象是在内存的什么地方创建的?

有没有像Integer-Pool这样的概念,就像我们有String-Pool for String?

EN

回答 3

Stack Overflow用户

发布于 2015-08-07 19:38:31

大多数JVM(甚至64位JVM)都使用32位引用。(较新的JVM对堆使用32位引用,最高可达32 GB)引用位于堆栈或CPU寄存器中,通常不会计算在内。Integer在堆上分配。

代码语言:javascript
复制
Integer i = new Integer(1); // creates a new object every time.
Integer j = 1; // use a cached value.

Integer a;将在堆栈中分配内存以保存引用值,并使用null进行初始化

newheap内存中创建实例

票数 4
EN

Stack Overflow用户

发布于 2015-08-07 19:38:21

使用new关键字创建的对象存储在堆中。

变量(对这些对象的引用)和原始类型(如int )存储在程序的堆栈中。

Integer在Java中并不是一个特殊的类。你可以对它使用算术运算符,它是不可变的,你甚至可以使用==进行相等测试(在-128到127的范围内,因为那些值已经被缓存了)。

有没有像整型池这样的概念,就像我们的String-Pool那样?

打开java.lang.Integer的代码并查看valueOf方法。很明显,他们确实使用了Integer池。

代码语言:javascript
复制
public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

另外,我认为这张图片会对你有所帮助:

票数 1
EN

Stack Overflow用户

发布于 2015-08-07 19:32:26

-128到+127范围内的Integer是预先创建的。你可以把它们想象成一个“整数池”。

任何其他值都是在运行时创建的。

这导致了Java中的一些微妙行为:

如果两个Integerfoobar的值相等且在-128到+127的范围内,则其表达式boo == far将为true。超出这个范围的值就不是真的了:对于这样的值,您需要使用.equals

就我个人而言,我发现这是有害的:从不在装箱类型上使用==

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31876668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档