【问题标题】:What happens when 2 objects are equal to each other当 2 个对象彼此相等时会发生什么
【发布时间】:2014-12-05 23:44:46
【问题描述】:

我需要一点关于 java 的帮助。我只是java的初学者。但我相信我的基础很扎实。

当我的 2 个 ArrayList 对象遇到小问题时,我正在创建一个简单的 Java 应用程序。让我们称他们为list1list2。如果我要让 list1 等于 list2 list1 = list2; 并向 list2 list2.add(obj) 添加一个元素,那么该元素也会添加到 list1 中。

我做了研究,发现我应该这样做 list1 = new ArrayList(list2);我不知道 java 对象像指针一样工作。我认为只有当 2 个对象相等时才传递值。我什至创建了一个简单的测试应用程序,它可以设置和获取对象的数量。再次,我等于两个对象。更改 1 个对象的元素似乎也会影响另一个对象。我不知道我应该如何在谷歌上搜索这个。这就是为什么我要告诉你整个故事的原因。我只得到与 c 编程相关的文档。我觉得我的基础刚刚破碎。我只是知道= 现在是如何工作的。试过了

    int num1 = 666;
    int num2 = num1;
    num1 = 42;

这不会影响 num2。然而,

    Object obj1 = new Object();
    Object obj2 = obj1;
    obj1.changeSomeElement();

这会影响 obj2。
现在,我对 = 在 java 中的工作方式感到困惑。有人请分享一些有用的文档供我阅读。谢谢!

【问题讨论】:

  • 没有。这些都是论据。我对 java 中的对象值如何传递给另一个对象感到困惑。
  • 简单类型不是引用,只有值被=复制
  • 谢谢你。现在这很有用

标签: java


【解决方案1】:
int num1 = 666;
int num2 = num1;
num1 = 42;

这是可行的,因为 int 是一种原始数据类型

Object obj1 = new Object();
Object obj2 = obj1;
obj1.changeSomeElement();

这不起作用,因为 Object 是引用数据类型

obj1 持有对创建对象的引用,而您只是将相同的引用从 obj1 传递给 obj2

即obj1和obj2都指向同一个Object

无论您使用 obj1 还是 obj2,都会对同一个对象进行更改 :)

Primtive vs Reference Data Types

关于原始数据类型与参考数据类型及其含义的很好解释

【讨论】:

  • 您在原始数据类型与参考数据类型上分享的那篇文章非常有用。谢谢!我的基础又恢复了原状。 XD
  • 我很高兴听到这个消息 :)
【解决方案2】:

在 Java 中,变量是对对象的引用。所以当你说:

Object obj2 = obj1;

obj2 存储与 obj1 相同的引用。这就是为什么如果你修改了 obj1 引用的对象,你也在编辑 obj2 引用的对象(它是两个变量引用的同一个对象)。

【讨论】:

  • 整数是对象吗?如果是为什么不引用整数?
  • 不要将 int 与 Integer 混淆。 int 不是对象,它们是原始类型,不存储为引用。整数类型的对象是不可变的(如字符串)。您不能修改这些类型的对象。当然,整数对象存储在引用等变量中。
  • @user859385 Integer 是一个对象类型。它是原始类型int 的包装类。
【解决方案3】:

在您的第一种情况下,您通过重新分配 num1 来更改它。在您的第二个中,您在对象上调用了一个方法。

现在有一个更准确的答案:当您分配一个对象(= 是您的分配运算符)时,您所做的基本上就是说“this 指向内存中的这个对象”。

因此,当您执行obj1 = obj2 时,您使用了两个指向同一个对象的指针。当然,当你改变一个时,你就改变了另一个,因为它们实际上是相同的,而且只是。

原始类型(boolean、int、long、double、float、char、byte)是不可变的:您无法更改它们,必须重新分配它们。因此,您实际上所做的是更改其中一个引用而不触及另一个。

【讨论】:

    【解决方案4】:

    不要惊慌:) 你的困惑是由 Java 如何在内存中存储值造成的。

    也许这本书可以帮助你: http://pkris001.freeshell.org/OCA.pdf 您的问题描述在第 83 页(pdf-page 116)

    简而言之: Java 在存储对象和原始数据类型值方面有所不同。

    为您正在运行的程序分配的内存分为两部分。 HEAP-memory 和 STACK-memory。

    只有 HEAP 内存存储具体对象,没有其他内容。

    new MyClassX();  // this object exists in the HEAP
    

    堆栈内存用于保存这些已创建对象的引用。

    MyClassX refVar = new MyClassX(); // refVar holds one reference to the memory-address of the new MyClassX object.
    

    对于原始数据类型值,它有点不同。 原始数据类型(boolean、byte、short、int、long、char、float、double 等)直接存储在 STACK-memory 部分中。

    int primVal = 1; // primVal stores the concrete value not a reference of 1;
    

    那么当你复制时发生了什么......

    原始数据类型:

    int primValOne = 1; // primVal stores the concrete value 1;
    
    int primValTwo = primValOne; // primValTwo is a primitive datatype so it stores the concrete value 1, NOT a reference of primValOne
    

    对象:

    MyClassX refValOne = new MyClassX(); // refValOne stores a reference to a HEAP-memory position
    
    MYClassX refValTwo = refValOne; // refValTwo stores the same reference like refValOne now
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      相关资源
      最近更新 更多