জাভা অ্যারেলিস্ট অনুলিপি


214

আমার ArrayList l1আকার 10 রয়েছে I আমি l1নতুন তালিকা রেফারেন্স প্রকারের জন্য নিযুক্ত করি l2l1এবং l2একই ArrayListবস্তু নির্দেশ করবে ? অথবা ArrayListঅবজেক্টের একটি অনুলিপি বরাদ্দ করা হয়েছে l2?

l2রেফারেন্স ব্যবহার করার সময় , যদি আমি তালিকার অবজেক্টটি আপডেট করি তবে এটি l1রেফারেন্সের ধরণের পরিবর্তনগুলিও প্রতিবিম্বিত করে ।

উদাহরণ স্বরূপ:

List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
    l1.add(i);
}

List l2 = l1;
l2.clear();

2 টি তালিকার অবজেক্ট তৈরি করা, এবং পুরানো থেকে নতুন সংগ্রহগুলিতে অনুলিপি করা ছাড়াও কোনও নতুন রেফারেন্স ভেরিয়েবলের তালিকাগুলির অনুলিপি দেওয়ার কোনও উপায় নেই?

উত্তর:


460

হ্যাঁ, অ্যাসাইনমেন্টটি কেবলমাত্র (যা একটি রেফারেন্স) এর মানটি অনুলিপি করবে । তারা উভয়ই একই বস্তুর উল্লেখ করবে।l1l2

অগভীর অনুলিপি তৈরি করা বেশ সহজ যদিও:

List<Integer> newList = new ArrayList<>(oldList);

(ঠিক যেমন একটি উদাহরণ।)


1
দক্ষতার সাথে নতুন অ্যারেলিস্টে কেবল একটি অ্যারেলিস্টের কোনও অংশ অনুলিপি করা সম্ভব? উদাহরণস্বরূপ: একটি অ্যারেলিস্ট থেকে অন্য নতুন অ্যারেলিস্টে 5 এবং 10 পজিশনের মধ্যে উপাদানগুলি অনুলিপি করুন। আমার আবেদনে পরিসরটি আরও বড় হবে bigger
আশ্বিন

1
@ আশ্বিন: আচ্ছা এটি একটি ও (এন) অপারেশন, তবে হ্যাঁ ... আপনি List.subListমূল তালিকার একটি অংশে "ভিউ" পেতে ব্যবহার করতে পারেন ।
জন স্কিটি

অ্যারে তালিকাগুলি যদি নীস্ট হয় (ArrayList<ArrayList<Object>>)? এটি কি পুনরাবৃত্তভাবে সমস্ত বাচ্চা অ্যারেলিস্ট অবজেক্টের অনুলিপি তৈরি করবে?
বিড়াল

3
@ গুগল: না ... এটি কেবল অগভীর অনুলিপি।
জন স্কিটি

1
@ শানিকা এডিরিউইরা: আপনি এটি স্ট্রিম দিয়ে সাবলীল উপায়ে করতে পারতেন, হ্যাঁ। তবে জটিল অংশটি একটি গভীর অনুলিপি তৈরি করছে, যা বেশিরভাগ বস্তু সরবরাহ করে না। আপনার যদি মনে একটি নির্দিষ্ট কেস থাকে তবে আমি আপনাকে বিশদ সহ একটি নতুন প্রশ্ন জিজ্ঞাসা করব।
জন স্কিটি

67

ব্যবহার করার চেষ্টা করুন Collections.copy(destination, source);


14
কেন এটি পছন্দনীয় হতে পারে তা বোঝানোর জন্য যত্নশীল new ArrayList<>(source);?
অ্যালেক্স

6
@ এটসি এটি অ্যারোলিস্টের পরিবর্তে অগভীর অনুলিপি করার আরও একটি উপায় () এটি অন্য একটি অ্যালগরিদম ব্যবহার করেছে এবং এটি কেবলমাত্র
অ্যারেলিস্টের

14
এই পদ্ধতিটি খুব বিভ্রান্তিকর! আসলে, এটির বিবরণটি হ'ল। এটি বলে: "একটি উত্সের তালিকা থেকে উপাদানগুলিকে গন্তব্যে অনুলিপি করে", তবে সেগুলি অনুলিপি করা হয় না! সেগুলিকে রেফারেন্স করা হয়েছে যাতে কেবলমাত্র 1 টি কপির জন্য অবজেক্ট থাকবে এবং তারা যদি পরিবর্তনীয় হয় তবে আপনি সমস্যায়
ACV

5
জাভা-এপি-তে কোথাও গভীর ক্লোনিং কোনও সংগ্রহ শ্রেণি দ্বারা করা হয় না
বিকাশ

এই উত্তরটি পুরোটা বোঝায় না। Collections.copyএর কোনও বিকল্প নয় new ArrayList<>(source)। কি Collections.copyআসলে আছে অনুমান যে destination.size()হিসাবে হিসাবে বড় অন্তত হয় source.size(), এবং তারপর পরিসীমা সূচক-বাই-সূচক ব্যবহার কপি set(int,E)পদ্ধতি। পদ্ধতিটি গন্তব্যে নতুন উপাদান যুক্ত করে না । জাভাডোক থেকে এটি যথেষ্ট পরিমাণে পরিষ্কার না হলে উত্স কোডটি দেখুন।
রেডিওডেফ

35

হ্যাঁ l1এবং l2একই রেফারেন্স, একই বস্তুতে নির্দেশ করবে।

অন্যান্য অ্যারেলিস্টের ভিত্তিতে আপনি যদি নতুন অ্যারেলিস্ট তৈরি করতে চান তবে আপনি এটি করুন:

List<String> l1 = new ArrayList<String>();
l1.add("Hello");
l1.add("World");
List<String> l2 = new ArrayList<String>(l1); //A new arrayList.
l2.add("Everybody");

ফল কী হবে l1এখনো 2 উপাদান থাকবে এবং l23 উপাদান থাকবে।


আপনি দয়া করে List<String> l2 = new ArrayList<String>(l1)এবং এর মধ্যে পার্থক্য ব্যাখ্যা করতে পারেন List<String> l2 = l1?
মর্টালম্যান

@ মর্টালমান পার্থক্যটি হ'ল l2 = নতুন অ্যারেলিস্ট <স্ট্রিং> (l1) সম্পূর্ণ নতুন বস্তু এবং l2 পরিবর্তিত করা l1 কে প্রভাবিত করে না, তবে তালিকা <স্ট্রিং> l2 = l1 আপনি একটি নতুন অবজেক্ট তৈরি করছেন না তবে কেবল একই উল্লেখ করছেন fere l1 হিসাবে অবজেক্ট, সুতরাং এক্ষেত্রে l2.add ("Everybody"), l1.size () এবং l2.size () এর মতো একটি অপারেশন করা 3 এ ফিরে আসবে কারণ উভয়ই একই বস্তুকে উল্লেখ করছে।
আলফ্রেডো ওসোরিও

19

Src অ্যারেলিস্ট থেকে ডেস্ট অ্যারেলিস্টে মানগুলি অনুলিপি করার আরেকটি সুবিধাজনক উপায় হ'ল:

ArrayList<String> src = new ArrayList<String>();
src.add("test string1");
src.add("test string2");
ArrayList<String> dest= new ArrayList<String>();
dest.addAll(src);

এটি হ'ল মূল্যগুলির প্রকৃত অনুলিপি এবং কেবলমাত্র রেফারেন্সের অনুলিপি করা নয়।


10
আমি পুরোপুরি নিশ্চিত নই যে এটি সঠিক। আমার পরীক্ষাটি বিপরীতটি দেখায় (এখনও একই বস্তুর রেফারেন্স
দিচ্ছে

অ্যারেএডাপ্টারের সাথে অ্যারেলিস্ট ব্যবহার করার সময় এই সমাধানটি আমার পক্ষে কাজ করেছে
অ্যালব্যাক্স

1
এই উত্তরটি ভুল। অ্যাডএল () কেবল ইনভারটিগো যেমন বলেছিল তেমন রেফারেন্সগুলি অনুলিপি করে। এটি কোনও গভীর অনুলিপি নয়।
jk7

একটি অ্যারেলিস্টের জন্য <স্ট্রিং> এই উত্তরটি গ্রহণযোগ্য কারণ স্ট্রিং পরিবর্তনযোগ্য, তবে এটি অপির উদাহরণ, একটি অ্যারেলিস্ট <Integer> দিয়ে চেষ্টা করুন এবং আপনি দেখতে পাবেন যে এটি কেবল উল্লেখগুলি অনুলিপি করছে।
jk7

আমার দিনটি শুধু অনুমান করি না। এটি পরিসংখ্যান করে যেমন ইন্টিজার এবং লংয়ের মতো ক্লাসগুলিও অপরিবর্তনীয়, সুতরাং হর্ষালের উত্তর সরল ক্ষেত্রে যেমন অ্যারেলিস্ট <Integer> এবং অ্যারেলিস্ট <স্ট্রিং> এর জন্য কাজ করে। এটি ব্যর্থ হয় এমন জটিল বস্তুর জন্য যা স্থাবর নয়।
jk7

8

একটি পদ্ধতি অ্যাডআল () রয়েছে যা একটি অ্যারেলিস্টকে অন্যটিতে অনুলিপি করার উদ্দেশ্যে কাজ করে।

উদাহরণস্বরূপ আপনার দুটি অ্যারে তালিকা রয়েছে: উত্স তালিকা এবং টার্গেটলিস্ট , নীচের কোডটি ব্যবহার করুন।

targetList.addAll (sourceList);


এটি কেবল রেফারেন্সগুলি অনুলিপি করে।
বিকাশ

4

জাভা বস্তুগুলি পাস করে না, এটি অবজেক্টগুলিতে রেফারেন্স (পয়েন্টার) পাস করে। সুতরাং হ্যাঁ, l2 এবং l1 একই বস্তুর দুটি পয়েন্টার।

একই বিষয়বস্তু সহ আপনার দুটি আলাদা তালিকা প্রয়োজন হলে আপনাকে একটি স্পষ্ট অনুলিপি তৈরি করতে হবে।


3
আপনি কীভাবে "একটি স্পষ্ট অনুলিপি" বানাবেন? আমি মনে করি আপনি একটি গভীর অনুলিপি সম্পর্কে কথা বলছেন?
Cin316

1

List.copyOf Mod অপরিবর্তনীয় তালিকা

তুমি জিজ্ঞেস করেছিলে:

তালিকার অনুলিপি দেওয়ার জন্য অন্য কোনও উপায় নেই?

জাভা 9 List.ofআক্ষরিক ব্যবহারের Listজন্য অজানা কংক্রিটের শ্রেণিটির অবিশ্বাস্য create

LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of( 
    today.minusDays( 1 ) ,  // Yesterday
    today ,                 // Today
    today.plusDays( 1 )     // Tomorrow
);

সেই সাথে আমরাও পেলাম List.copyOf। এই পদ্ধতিটিও Listঅজানা কংক্রিটের শ্রেণীর একটি আপত্তিযোগ্য পরিবর্তন করে ।

List< String > colors = new ArrayList<>( 4 ) ;          // Creates a modifiable `List`. 
colors.add ( "AliceBlue" ) ;
colors.add ( "PapayaWhip" ) ;
colors.add ( "Chartreuse" ) ;
colors.add ( "DarkSlateGray" ) ;
List< String > masterColors = List.copyOf( colors ) ;   // Creates an unmodifiable `List`.

"অপরিবর্তনযোগ্য" দ্বারা আমরা তালিকার উপাদানগুলির সংখ্যা বোঝাতে চাইছি এবং প্রতিটি স্লটে একটি উপাদান হিসাবে রাখা অবজেক্টটি রেফারেন্স করা হয়েছে। আপনি উপাদানগুলি যুক্ত করতে, বাদ দিতে বা প্রতিস্থাপন করতে পারবেন না। তবে প্রতিটি উপাদানের মধ্যে থাকা অবজেক্ট রিভার্ট হতে পারে বা পরিবর্তন হতে পারে

colors.remove( 2 ) ;          // SUCCEEDS. 
masterColors.remove( 2 ) ;    // FAIL - ERROR.

IdeOne.com এ এই কোডটি সরাসরি চালিত দেখুন ।

তারিখ.আর স্ট্রিং (): [2020-02-02, 2020-02-03, 2020-02-04]

color.toString (): [অ্যালিসব্লিউ, পাপিয়াওয়াইপ, ডার্কস্লেট গ্রে]

মাস্টারল্যান্ড. টো স্ট্রিং (): [অ্যালিসব্লিউ, পাপায়াওয়াইপ, চার্ট্রেস, ডার্কস্লেট গ্রে]

আপনি অবজেক্ট রেফারেন্স সম্পর্কে জিজ্ঞাসা করেছেন। অন্যরা যেমন বলেছে, আপনি যদি একটি তালিকা তৈরি করেন এবং এটি দুটি রেফারেন্স ভেরিয়েবলগুলিকে (পয়েন্টার) নির্ধারণ করেন তবে আপনার এখনও কেবল একটি তালিকা রয়েছে। উভয়ই একই তালিকার দিকে ইঙ্গিত করে। আপনি যদি তালিকাটি সংশোধন করতে উভয় পয়েন্টার ব্যবহার করেন তবে উভয় পয়েন্টারই পরে পরিবর্তনগুলি দেখতে পাবেন, কারণ মেমরিতে কেবল একটি তালিকা রয়েছে।

সুতরাং আপনাকে তালিকার একটি অনুলিপি তৈরি করতে হবে। আপনি যদি সেই অনুলিপিটি অনিবার্যযোগ্য হতে চান তবে এই উত্তরে List.copyOfআলোচিত পদ্ধতিটি ব্যবহার করুন । এই পদ্ধতির ক্ষেত্রে, আপনি দুটি পৃথক তালিকাগুলি সমাপ্ত করেছেন, প্রত্যেকটি উপাদানগুলির সাথে একই সামগ্রীতে অবজেক্টের রেফারেন্স রাখে। উদাহরণস্বরূপ, Stringরঙগুলিকে উপস্থাপন করার জন্য আমাদের উপরে বর্ণিত উদাহরণস্বরূপ , রঙের অবজেক্টগুলি কোথাও মেমরির আশেপাশে ভাসছে। দুটি তালিকাগুলি একই রঙের বস্তুগুলিতে পয়েন্টার ধারণ করে। এখানে একটি চিত্র আছে।

এখানে চিত্র বর্ণনা লিখুন

প্রথম তালিকাটি colorsপরিবর্তনযোগ্য। এর অর্থ হ'ল উপরের কোডটিতে দেখা যায় এমন কিছু উপাদান সরানো যেতে পারে, যেখানে আমরা মূল তৃতীয় উপাদান Chartreuse(2 = অর্ডিনাল 3 এর সূচক) সরিয়েছি । এবং উপাদান যুক্ত করা যেতে পারে। আর উপাদানের কিছু অন্যান্য দিকে নির্দেশ পরিবর্তন করা যাবে Stringযেমন OliveDrabবা CornflowerBlue

বিপরীতে, চারটি উপাদান masterColorsস্থির হয়। অপসারণ, কোনও সংযোজন এবং কোনও অন্য রঙের বিকল্প নেই। এই Listবাস্তবায়নটি অবিশ্বাস্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.