Java对象创建和引用

Java对象创建和引用,java,object,memory,reference,Java,Object,Memory,Reference,我在考虑Java和内存管理,有一点我不确定 假设我们使用包装类Integer将int类型表示为对象 我们创建两个对象 整数x=1; 整数y=1: 我的问题是,Java是否在两个不同的内存位置创建了两个相同的对象,并用x和y引用它们。或者它只创建一个对象,并使用两个引用指向该对象 另外,是否有一种方法可以找出Java中对象存储在内存中的位置?JVM用于小整数对象。您需要获得java对象的地址。关于Integer,它有自己的缓存,不会为-128..127范围创建任何新实例 因此,在您的情况下,它将引

我在考虑Java和内存管理,有一点我不确定

假设我们使用包装类Integer将int类型表示为对象

我们创建两个对象

整数x=1; 整数y=1:

我的问题是,Java是否在两个不同的内存位置创建了两个相同的对象,并用x和y引用它们。或者它只创建一个对象,并使用两个引用指向该对象


另外,是否有一种方法可以找出Java中对象存储在内存中的位置?

JVM用于小整数对象。您需要获得java对象的地址。

关于Integer,它有自己的缓存,不会为-128..127范围创建任何新实例

因此,在您的情况下,它将引用相同的对象

整数类

     public static Integer valueOf(int i) {
         final int offset = 128;
         if (i >= -128 && i <= 127) { // must cache
             return IntegerCache.cache[i + offset];
         }
         return new Integer(i);
     }
公共静态整数值(int i){
最终整数偏移=128;

if(i>=-128&&i编译器通常会寻找这样的优化,并在写入时应用复制

您可以使用字符串进行检查,因为两个字符串定义如下

String x = "test";
String y = "test":
我们可以这样比较

if (x == y) 
任何其他时间都需要
.equals
进行比较

比如说

public class test
{
  public static void main(String[] args){
    String x = "test";
    String y = "test";
    if (x == y){
      System.out.print("Same object");
    }
  }
}
然后跑

$ java test 
Same object

在您的例子中,您正在创建两个不同的对象,到两个具有相同值的不同内存位置,它被存储两次。即使我认为您检查(x==y)如果它返回true,那么这两个变量x,y指的是同一个对象:)。==始终检查内存引用而不是对象状态,这样您就可以很容易地弄清楚。