2014-12-05 99 views
4

我需要java中的一点帮助。我只是一个java的初学者。但我相信我的基金会非常稳固。当两个对象相等时会发生什么

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

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

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

这不影响num2。然而,

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

这会影响obj2的。
现在,我很困惑=如何在java中工作。请有人分享一些有用的文档给我阅读。谢谢!

+0

NOP。这些是争论。我对如何在java中的对象值传递给另一个对象感到困惑。 – user859385 2014-12-05 14:51:21

+0

简单类型不是引用,只有值被复制'=' – rzysia 2014-12-05 14:52:40

+2

看看http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value – starf 2014-12-05 14:52:46

回答

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

这工作,因为int是基本数据类型

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

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

OBJ1持有到创建的对象的引用,而你只是将相同的参考从obj1传递到obj2

也就是说,obj1 & obj2指向相同的对象

更改了相同的对象,你是否使用由OBJ1或OBJ2,:)

Primtive vs Reference Data Types

对原始很好的解释VS引用数据类型以及它们的影响

+0

您在Primtive与参考数据类型上分享的文章非常有用。谢谢!我的基金会回到了一块。 XD – user859385 2014-12-05 15:03:08

+0

我很高兴听到:) – Gosu 2014-12-05 15:04:06

2

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

Object obj2 = obj1; 

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

+0

是Integer的一个对象?如果这是为什么是一个整数不被引用? – user859385 2014-12-05 14:53:47

+0

不要将int与Integer混淆。 int不是对象,它们是原始类型,不作为引用存储。 Integer类型的对象是不可变的(比如String)。你不能修改这些类型的对象。当然,Integer对象存储在像引用这样的变量中。 – 2014-12-05 14:55:28

+2

@ user859385'Integer'是一个对象类型。它是原始类型“int”的包装类。 – Tom 2014-12-05 14:55:36

0

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

现在有一个更准确的答案:当你指定一个对象(=是你的赋值操作符)时,你所做的基本上是说'这指向这个对象在内存中'。

因此,当你做obj1 = obj2时,你使用两个指向同一个对象的指针。当然,当你改变一个时,你改变了另一个,因为它们实际上是相同的并且是唯一的。原始类型(boolean,int,long,double,float,char,byte)是不可变的:你不能改变它们,你必须重新赋值它们。因此,你实际做的是改变你的一个参考而不接触另一个参考。

0

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

也许这本书能帮助你: http://pkris001.freeshell.org/OCA.pdf 您的问题是83页(PDF第116页)

上descriped简而言之: Java的不同之处存储对象和基本数据类型的值。

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

只有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. 

对于原始数据类型值,它有点不同。 原始数据类型(布尔,字节,短,int,long,char,float,double,...)直接存储在STACK存储器部分。

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 
相关问题