【问题标题】:Java object creation and referencingJava 对象的创建和引用
【发布时间】:2013-11-05 11:30:29
【问题描述】:

我在考虑 Java 和内存管理,有些事情我不确定。

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

我们创建了两个对象

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

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

另外,有没有办法在 Java 中找出对象在内存中的存储位置?

【问题讨论】:

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

标签: java object memory reference


【解决方案1】:

JVM implements cache 用于小型 Integer 对象。而你 do not need 来获取 java 对象的地址。

【讨论】:

    【解决方案2】:

    关于整数 - 它有自己的缓存,不会为 -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);
         }
    

    【讨论】:

      【解决方案3】:

      编译器通常会寻找类似的优化并应用 Copy on Write http://en.wikipedia.org/wiki/Copy-on-write

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        • 2016-05-03
        • 2021-08-28
        相关资源
        最近更新 更多