Java 在哪里创建int值和整数对象?

Java 在哪里创建int值和整数对象?,java,Java,当我们初始化一些整数值时,比如 int a = 10; 或 在内存中创建的对象在哪里 有没有像字符串池这样的整数池概念?Integers在-128到+127范围内是预先创建的。你可以把它们想象成一个“整数池” 任何其他值都是在运行时创建的 这导致了Java中的一些微妙行为: 如果两个Integer值foo和bar的值相等且在-128到+127范围内,则表达式boo==far。对于超出该范围的值,则不正确:对于此类值,需要使用.equals 就我个人而言,我发现这是有害的:永远不要在盒式类型上

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

int a = 10; 

在内存中创建的对象在哪里


有没有像字符串池这样的整数池概念?

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

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

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

如果两个
Integer
foo
bar
的值相等且在-128到+127范围内,则表达式
boo==far
。对于超出该范围的值,则不正确:对于此类值,需要使用
.equals


就我个人而言,我发现这是有害的:永远不要在盒式类型上使用
=

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

变量(对这些对象的引用)和基本类型(如
int
)存储在程序堆栈上

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

有没有像整数池这样的概念,比如我们用字符串池来表示字符串

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

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);
}
公共静态整数值(int i){
断言IntegerCache.high>=127;
如果(i>=IntegerCache.low&&i大多数JVM(即使是64位的JVM)使用32位引用(较新的JVM使用32位引用用于高达32 GB的堆),则引用位于堆栈或CPU寄存器中,并且通常不计数。整数在堆上分配

Integer i = new Integer(1); // creates a new object every time.
Integer j = 1; // use a cached value.
整数a;
将在堆栈中分配内存以保存引用值,并用null初始化


new
堆中创建实例
内存

新整数(20)也是这样吗?我认为这只适用于装箱。不适用于新整数(20),因为这将始终创建一个新对象。这仅适用于自动装箱,因为它使用了
valueOf
方法,其中使用了预先创建的值。请参阅“对象[…]存储在堆上。”也许你应该读一些关于的文字。事实上,这使你的陈述有资格成为w̶r̶o̶n̶g̶,但不完全正确。是的,让我们深入这一点向正在学习OO的人解释一下。我们肯定应该从转义分析和JVM增强开始(在他理解堆栈和堆之间的区别之前).是的,我知道你不应该用太多的技术细节压倒初学者。然而,这句话并不正确。其他读者可能更高级。一个好的解释应该简短而正确。让读者决定是否深入细节(超链接,呵呵?)。当我在某人的评论中看到改进的地方时,我会编辑它。出于同样的原因,也就是说,为了使它们更准确、正确和易于理解。如果你看到改进我的评论的地方,请这样做。感谢你的评论。我们知道代码整数a=127;是自动装箱的一个示例,编译器会自动将这一行转换为Integer a=Integer.valueOf(127);。因此,返回这些整数对象的是Integer.valueOf()方法,这意味着该方法必须在后台执行某些操作。\我很困惑,整数a;在堆或堆栈中?
Integer i = new Integer(1); // creates a new object every time.
Integer j = 1; // use a cached value.