1. java 中淺拷貝與深拷貝有什麼區別
淺拷貝 指的是你的類本身被拷貝,而沒有拷貝類本身屬性中的類
深拷貝 指的是包含類本身和屬性類在內的所有類的拷貝。
簡單點說:
就是淺拷貝的兩個對象中的屬性還會指向同一個類,而深拷貝則全部單獨了。也就是說深拷貝把關聯關系也拷貝了。
具體例子你可以參看我的blog,裡面篇文章介紹:)
2. java中的淺克隆和深克隆是什麼
克隆是指克隆對象,在堆空間復制一塊內存,是完全的兩個對象,不是指針指向!淺克隆是指克隆一個對象,而該對象的屬性只是基本數據類型,只克隆出該對象!深度克隆是指克隆的目標裡面還有引用類型,引用類型里還有引用類型,同時把引用類型克隆出來叫深度克隆!常用的方法有兩種,第一,需克隆的對象實現cloneable介面;第二,使用commons包提供的克隆方法。這兩種方法都能實現深度克隆!
3. java淺拷貝的對象兩個內向相等嗎
兩個對象內向相等。
java對象默認繼承java。long。Object類,裡麵包含clone方法。JDKAPI的說明文檔解釋這個方法將返回Object對象的一個拷貝。要說明的有兩點:一是拷貝對象是一個新對象,而不是一個引用。二是拷貝對象與用new操作符返回的新對象的區別就是這個拷貝已經包含了一些原來對象的信息,而不是對象的初始信息。
java中的基本數據類型判斷是否相等,直接使用==就行了,相等返回true,否則,返回false。
4. Java中數組的clone方法為什麼是淺復制
這個問題應該去看下API Object.clone(); 可以認為clone方法復制出來的數組 裡面的元素 還是使用原數組的元素 並沒有生成新的元素。
protected Object clone()
throws CloneNotSupportedException
The method clone for class Object performs a specific cloning operation. First, if the class of this object does not implement the interface Cloneable, then a CloneNotSupportedException is thrown. Note that all arrays are considered to implement the interface Cloneable and that the return type of the clone method of an array type T[] is T[] where T is any reference or primitive type. Otherwise, this method creates a new instance of the class of this object and initializes all its fields with exactly the contents of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned. Thus, this method performs a "shallow " of this object, not a "deep " operation.
5. JAVA 中的淺拷貝是什麼效果
首先必須知道Java拷貝的用途:Java克隆是為了得到一個對象,這個對象與克隆前的對象完全一樣,唯一不同就是它們所處的內存地址不相同。對於java中的一切對象(除了基本的數據結構int、float、string等之外)在進行賦值,方法傳遞的時候,都是一個內存地址的同一個對象! 所謂淺拷貝一般就是就是直接調用對象的clone()方法,這樣的拷貝,對於這個對象中的基本數據類型(int、string、float等)的屬性,是可以得到完全的拷貝,但是對於這個對象裡面的非基本數據類型(對象、集合等)的某些屬性,實際上並沒有進行克隆,而只是進行一個賦值操作而已,也就是說克隆出來的對象與原對象有一部分內容的內存地址是相同的,這在某些情況下會造成出錯! 由此提出了深拷貝的概念,即覆寫clone()方法,遍歷對象中的每一個屬性,採取合適的方式進行克隆即可。例如對於對象中的集合,可以遍歷集合,然後構造一個新的集合,重新存儲一遍... 更過關於Java克隆的問題詳見Blog。
6. java,,"淺克隆,只復制一個對象 ,深克隆 對象和引用一起復制"有java實例嗎不理解啊
對只包含進本類型的類來說,無所謂深克隆。但是一個類包含集合類或者復雜的類,就要考慮二者的區別了。
class Student {
private int id;
private Address address;
private ArrayList<Book> bookList;
}
對於以上類的一個對象a和克隆類 o來說:
淺克隆:
a !=o 但是 a.address == o.address, a.bookList == o.bookList
深克隆:
a !=o 但是 a.address != o.address, a.bookList != o.bookList
並且 bookList中的每個元素不是相同對象。
簡言之, 淺克隆只復制本對象,深克隆除了本對象,其兒子、孫子、....都要克隆。
以上純手敲,有錯請包涵。
7. java深度拷貝和淺度拷貝的問題
看來你並沒理解錯克隆,反而是改變東西的方法不對。
先還是講講克隆吧。
是的,上面的clone方法也就是Object的Clone方法是淺表復制,看看他的API說的:
「此方法會創建此對象的類的一個新實例,並像通過分配那樣,嚴格使用此對象相應欄位的內容初始化該對象的所有欄位;……。所以,此方法執行的是該對象的「淺表復制」,而不「深層復制」操作。 」
這你沒理解錯。
但你測試的方法貌似有問題,讓人不知你想干什麼。
本來sb1、sb2的a欄位內容相同的。這兩個欄位代表兩個對象,所謂倆對象,說白了實際上都是一個4位元組空間,存的是StringBuffer對象地址,也就是所謂a對象,實際上包含兩個東西,一個是a這個指針(我是在說JAVA),另一個指的是這個指針指向的堆棧裡面的空間(再復雜就不說了,參閱《JAVA虛擬機》)。相同也就意味著兩個變數指向的對象空間一樣。
這樣的話,如果你調用sb1.a.put...類似的方法朝a中放東西,那sb2也會變。
可你直接把sb1的a換了,也就是讓a指向另一個你new的空間。這樣和sb2有什麼關系,而且你以後再改sb1的a,sb2也不會變。
不說了,累。不懂就問我。
8. 淺復制和深復制的區別 java
淺復制和深復制的區別 java
大體上來說,深拷貝與淺拷貝的區別主要還是在於指針(或與指針)方面,淺拷貝只是簡單的把源對象(這個是指廣義的對象,不僅僅單指類的實例)的指針賦值給目標對象,對目標指針的操作就是對源對象的操作,所以在很多情況下,目標對象析構(或跳出其可見域)之後,源對象相關部分也就一同析構了。而深拷貝,是為目標對象重新分配空間,這樣可以與源對象的操作分開。
9. java中什麼是深拷貝,什麼是淺拷貝
簡單點跟你說吧,容易理解。
淺拷貝:
就是復制對象的值的時候,不管復制多少,所以的值都指向同一個對象。
深拷貝:
在復制對象的值的時候,同時也重新創建了一個對象,每個值都指向一個不同的對象。
如果你學習了c語言的指針,會理解的更深刻