আমি যদি clone()
টাইপ এ এর অবজেক্টগুলির অ্যারেতে পদ্ধতিটি প্রার্থনা করি তবে এটি কীভাবে এর উপাদানগুলির ক্লোন করবে? অনুলিপি একই জিনিসগুলিতে উল্লেখ করা হবে? বা এটি তাদের (element of type A).clone()
প্রত্যেকের জন্য কল করবে ?
উত্তর:
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()
কোনও উপাদানকেই কল করবে না ।
ক্লোন করা হলে আদিমদের 1D অ্যারে অনুলিপি করে। এটি আমাদের 2D অ্যারে (অ্যারের অ্যারে) ক্লোন করতে প্ররোচিত করে।
মনে রাখবেন যে অগভীর অনুলিপি প্রয়োগের কারণে 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
আদিমদের অ্যারে 1 ডি করতে পারি এবং একটি গভীর অনুলিপি পেতে পারি? এতো দুর্দান্ত! ভাল ভাড়া Arrays.copyOfRange()
, System.arraycopy()
!
ক্লোনটি অ্যারের অগভীর অনুলিপি।
এই পরীক্ষার কোডটি প্রিন্ট করে:
[১, ২] / [১, ২] [100, 200] / [100, 2]
কারণ 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));
}
}