অ্যারেতে ক্লোন () কল করা কি এর সামগ্রীগুলি ক্লোন করে?


92

আমি যদি clone()টাইপ এ এর ​​অবজেক্টগুলির অ্যারেতে পদ্ধতিটি প্রার্থনা করি তবে এটি কীভাবে এর উপাদানগুলির ক্লোন করবে? অনুলিপি একই জিনিসগুলিতে উল্লেখ করা হবে? বা এটি তাদের (element of type A).clone()প্রত্যেকের জন্য কল করবে ?


4
আপনাকে প্রতিটি উপাদানকে ক্লোন করতে হবে।
পিটার লরি

উত্তর:


77

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  
-----  

4
এবং, যদি আপনি এটি করতে যাচ্ছিলেন, ব্যক্তিগতভাবে আমি ব্যবহার করতামSystem.arrayCopy
কর্সিকা

4
clone()অ্যারে ব্যবহার করার জন্য একটি ভাল বিকল্প..অন্যতম একচেটিয়াভাবে। ব্লচ উল্লেখ করেছেন যে তিনি এটিকে কেবল অ্যারে এবং অন্য কোনও কিছুর জন্য ব্যবহার করবেন না। System.arrayCopyভাল. Arrays.copyOf(..)অন্য বিকল্প যা ব্যবহার করা সহজ।
বোঝো

আমি এটি ফিরিয়ে নিয়েছি - আমি ব্যবহার করব Arrays.copyOf:-) এর একটি পদ্ধতির স্বাক্ষর রয়েছে যা ভেরিয়েবলগুলি সহজতর করে (হ্যাঁ এটি আপনাকে সীমাবদ্ধ করে তবে এটি বেশিরভাগ ক্ষেত্রেই নিখুঁত) এবং আমার জেডিকে অন্তত, System.arrayCopyযাইহোক এটি ব্যবহার করে প্রয়োগ করা হয়েছে । এই টিপটির জন্য ধন্যবাদ!
corsiKa

@ বোজো, আপনার উদাঃ থেকে অ্যারে [i] এবং ক্লোন [i] একই বস্তুকে উল্লেখ করবে তাই প্রথম দুটি সিসাউট একই। তবে অ্যারে [i] .ক্লোনটি অ্যারেতেও উল্লেখ করবে [i] তাই অ্যারে [i] .ক্লোন () আলাদা হ্যাশকোড মানটি কেন দেয়?
abhihello123

@ উইকস্টুডেন্ট, এর array[i].clone()উল্লেখ নেই array[i]। উদাহরণের সেই অংশটি এটিই প্রদর্শন করছে।
দাথন

19

আমি যদি টাইপ এ এর ​​অবজেক্টগুলির অ্যারেতে ক্লোন () পদ্ধতিটি প্রার্থনা করি তবে এটি কীভাবে এর উপাদানগুলির ক্লোন করবে?

অ্যারের উপাদানগুলি ক্লোন করা হবে না।

অনুলিপি একই জিনিসগুলিতে উল্লেখ করা হবে?

হ্যাঁ.

অথবা এটি প্রত্যেকের জন্য (এ টাইপের উপাদান) .ক্লোন () কল করবে?

না, এটি clone()কোনও উপাদানকেই কল করবে না ।


6

ক্লোন করা হলে আদিমদের 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
}

4
আপনি কি আমাকে বলছেন যে আমি cloneআদিমদের অ্যারে 1 ডি করতে পারি এবং একটি গভীর অনুলিপি পেতে পারি? এতো দুর্দান্ত! ভাল ভাড়া Arrays.copyOfRange(), System.arraycopy()!
জানেজ কুহার

4
ইয়েসসসসস! অ্যারে ক্লোন করা হলে
আদিমদের

4
মনে রাখবেন যে থম্মে গৌড় এন বলেছেন "আদিম"। অবজেক্টগুলির অ্যারেগুলির ক্লোনগুলি কেবলমাত্র রেফারেন্সের ক্লোন হয়ে থাকবে।
ক্রিশ্চিয়ান

আদিমদের কোনও রাজ্য না থাকায় এগুলি সহজাত পরিবর্তনযোগ্য। আপনি আদিমদের অগভীর অনুলিপি তৈরি করতে পারবেন না, যেহেতু কোনও রেফারেন্স নেই
জেরাস

5

ক্লোনটি অ্যারের অগভীর অনুলিপি।

এই পরীক্ষার কোডটি প্রিন্ট করে:

[১, ২] / [১, ২]
[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));                                                               
    }                                                                                                                                                    
}                                                                                                                                                        
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.