2014-12-05 93 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 
相關問題