当2个对象彼此相等时会发生什么

时间:2014-12-05 14:48:24

标签: java

我需要一些java帮助。我只是java的初学者。但我相信我的基础非常扎实。

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

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

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

这不会影响num2。然而,

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

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

4 个答案:

答案 0 :(得分:3)

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

这是有效的,因为int是原始数据类型

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

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

obj1持有对创建的Object的引用,你只是将同一个引用从obj1传递给obj2

即obj1& obj2引用相同的对象

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

Primtive vs Reference Data Types

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

答案 1 :(得分:2)

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

Object obj2 = obj1;

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

答案 2 :(得分:0)

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

现在有一个更精确的答案:当你分配一个对象(=你的赋值运算符)时,你所做的就是说'这指向内存中的这个对象'。

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

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

答案 3 :(得分:0)

不要恐慌:) 您的困惑是由Java如何将值存储在内存中创建的。

也许这本书可以帮到你: http://pkris001.freeshell.org/OCA.pdf 第83页(pdf-第116页)

描述了您的问题

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

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

只有HEAP-memory存储具体对象,而不存储任何其他对象。

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

STACK-memory用于保存这些创建对象的引用。

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;

所以当你复制时会发生什么...

primitve数据类型:

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