जवाबों:
clone()
उथली प्रति बनाता है। जिसका अर्थ है कि तत्वों का क्लोन नहीं होगा। (क्या होगा अगर वे लागू नहीं कियाCloneable
?)
आप Arrays.copyOf(..)
इसके बजाय सरणियों की प्रतिलिपि बनाने के लिए उपयोग कर सकते हैं clone()
(हालांकि क्लोनिंग सरणियों के लिए ठीक है, इसके विपरीत कुछ भी)
यदि आप गहरी क्लोनिंग चाहते हैं, तो इस उत्तर को जांचें
clone()
तत्व हैं, भले ही उथलेपन का वर्णन करने के लिए एक छोटा सा उदाहरण Cloneable
:
ArrayList[] array = new ArrayList[] {new ArrayList(), new ArrayList()};
ArrayList[] clone = array.clone();
for (int i = 0; i < clone.length; i ++) {
System.out.println(System.identityHashCode(array[i]));
System.out.println(System.identityHashCode(clone[i]));
System.out.println(System.identityHashCode(array[i].clone()));
System.out.println("-----");
}
प्रिंटों:
4384790
4384790
9634993
-----
1641745
1641745
11077203
-----
System.arrayCopy
clone()
सरणियों के साथ उपयोग करने के लिए एक अच्छा विकल्प है .. विशेष रूप से। बलोच ने उल्लेख किया कि वह इसका उपयोग केवल सरणियों के लिए करेगा और कुछ नहीं। System.arrayCopy
ठीक है। Arrays.copyOf(..)
एक और विकल्प है जिसका उपयोग करना आसान है।
Arrays.copyOf
:-) इसमें एक विधि हस्ताक्षर है जो चर को सरल करता है (हाँ यह आपको सीमित करता है, लेकिन यह अधिकांश मामलों के लिए एकदम सही है) और मेरे जेडीके में कम से कम, System.arrayCopy
वैसे भी इसका उपयोग किया जाता है। उस टिप के लिए धन्यवाद!
array[i].clone()
को संदर्भित नहीं करता है array[i]
। उदाहरण के उस हिस्से का प्रदर्शन यही है।
यदि मैं टाइप ए की वस्तुओं की सरणी पर क्लोन () विधि लागू करता हूं, तो यह अपने तत्वों को कैसे क्लोन करेगा?
सरणी के तत्वों को क्लोन नहीं किया जाएगा।
क्या कॉपी उन्हीं वस्तुओं के संदर्भ में होगी?
हाँ।
या यह उनमें से प्रत्येक के लिए (ए प्रकार का तत्व) .clone () कहेगा?
नहीं, यह clone()
किसी भी तत्व पर कॉल नहीं करेगा ।
जब क्लोन किया जाता है तो प्राइमरी का 1D एलीमेंट एलिमेंट कॉपी करता है। यह हमें 2 डी सरणी (एरे के सरणी) को क्लोन करने के लिए प्रेरित करता है।
याद रखें कि 2 डी सरणी क्लोन उथले कॉपी कार्यान्वयन के कारण काम नहीं करता है clone()
।
public static void main(String[] args) {
int row1[] = {0,1,2,3};
int row2[] = row1.clone();
row2[0] = 10;
System.out.println(row1[0] == row2[0]); // prints false
int table1[][]={{0,1,2,3},{11,12,13,14}};
int table2[][] = table1.clone();
table2[0][0] = 100;
System.out.println(table1[0][0] == table2[0][0]); //prints true
}
clone
प्राथमिकताओं की 1D सरणी और गहरी प्रतिलिपि प्राप्त कर सकता हूं ? ये तो शानदार है! अच्छा प्रदर्शन किया Arrays.copyOfRange()
, System.arraycopy()
!
क्लोन सरणी की एक उथली प्रति है।
यह परीक्षण कोड प्रिंट करता है:
[१, २] / [१, २] [१००, २००] / [१००, २]
क्योंकि MutableInteger
दोनों सरणियों में साझा किया जाता है objects[0]
और objects2[0]
, लेकिन आप संदर्भ को objects[1]
स्वतंत्र रूप से बदल सकते हैं objects2[1]
।
import java.util.Arrays;
public class CloneTest {
static class MutableInteger {
int value;
MutableInteger(int value) {
this.value = value;
}
@Override
public String toString() {
return Integer.toString(value);
}
}
public static void main(String[] args) {
MutableInteger[] objects = new MutableInteger[] {
new MutableInteger(1), new MutableInteger(2) };
MutableInteger[] objects2 = objects.clone();
System.out.println(Arrays.toString(objects) + " / " +
Arrays.toString(objects2));
objects[0].value = 100;
objects[1] = new MutableInteger(200);
System.out.println(Arrays.toString(objects) + " / " +
Arrays.toString(objects2));
}
}