জাভা 9 তালিকার জন্য নতুন কারখানার পদ্ধতি চালু করেছে, List.of :
List<String> strings = List.of("first", "second");
আগের এবং নতুন বিকল্পের মধ্যে পার্থক্য কী? অর্থাৎ এর মধ্যে পার্থক্য কী:
Arrays.asList(1, 2, 3);
এবং এই:
List.of(1, 2, 3);
জাভা 9 তালিকার জন্য নতুন কারখানার পদ্ধতি চালু করেছে, List.of :
List<String> strings = List.of("first", "second");
আগের এবং নতুন বিকল্পের মধ্যে পার্থক্য কী? অর্থাৎ এর মধ্যে পার্থক্য কী:
Arrays.asList(1, 2, 3);
এবং এই:
List.of(1, 2, 3);
উত্তর:
Arrays.asListএকটি চপল তালিকা ফেরৎ যখন তালিকা দ্বারা ফিরে List.ofহয় অপরিবর্তনীয় :
List<Integer> list = Arrays.asList(1, 2, null);
list.set(1, 10); // OK
List<Integer> list = List.of(1, 2, 3);
list.set(1, 10); // Fails with UnsupportedOperationException
Arrays.asListনাল উপাদানগুলিকে অনুমতি List.ofদেয় না যখন :
List<Integer> list = Arrays.asList(1, 2, null); // OK
List<Integer> list = List.of(1, 2, null); // Fails with NullPointerException
contains নালীর সাথে আলাদা আচরণ করে:
List<Integer> list = Arrays.asList(1, 2, 3);
list.contains(null); // Returns false
List<Integer> list = List.of(1, 2, 3);
list.contains(null); // Fails with NullPointerException
Arrays.asListপাস হওয়া অ্যারের একটি দর্শন দেয়, সুতরাং অ্যারেতে পরিবর্তনগুলিও তালিকায় প্রতিফলিত হবে। জন্য List.ofএই সত্য নয়:
Integer[] array = {1,2,3};
List<Integer> list = Arrays.asList(array);
array[1] = 10;
System.out.println(list); // Prints [1, 10, 3]
Integer[] array = {1,2,3};
List<Integer> list = List.of(array);
array[1] = 10;
System.out.println(list); // Prints [1, 2, 3]
List.contains(Object o)এর javadoc : "ছোঁড়ার [...] নালপয়েন্টারএক্সেপশন - যদি নিদিষ্ট উপাদান নাল এবং এই তালিকা নাল উপাদান (ঐচ্ছিক) অনুমতি দেয় না"। বা ইন্টারফেসের দৈর্ঘ্য ভূমিকা থেকে যে কয়েকজন পড়েছেন: "কিছু সংগ্রহের বাস্তবায়নে তাদের থাকতে পারে এমন উপাদানগুলির উপর বিধিনিষেধ রয়েছে"
List.of আসেImmutableList , এর আসল নামটি একটি জন-বাস্তবায়নের বিশদ মাত্র। এটি যদি সর্বজনীন হয় এবং কেউ Listআবার এটিকে ফেলে দেয় তবে পার্থক্যটি কোথায় ছিল? যেখানে Arrays.asListকোনও অ-জন- Listবাস্তবায়ন ফিরিয়ে দেয় , সেখানে পার্থক্য কোথায় , চেষ্টা করার সময় ব্যতিক্রম ছুঁড়ে addবা remove, বা তালিকাটি ফিরে আসে Collections.unmodifiableListযার দ্বারা কোনও পরিবর্তন করার অনুমতি নেই? এটি Listইন্টারফেসে নির্দিষ্ট চুক্তিগুলি সম্পর্কে । Javaচ্ছিক পদ্ধতি সহ সংগ্রহের ইন্টারফেসগুলি জাভা ১.২ থেকে সর্বদা অপরিষ্কার ওওপি ছিল ...
Arrays.asListএবং মধ্যে পার্থক্যList.ofজাভাডোকস এবং স্টুয়ার্ট মার্কস (বা এর পূর্ববর্তী সংস্করণগুলি) দ্বারা এই আলোচনা দেখুন ।
আমি কোড উদাহরণের জন্য নিম্নলিখিত ব্যবহার করব:
List<Integer> listOf = List.of(...);
List<Integer> asList = Arrays.asList(...);
List<Integer> unmodif = Collections.unmodifiableList(asList);
কাঠামোগত পরিবর্তনের যে কোনও প্রয়াসের List.ofফলস্বরূপ একটি UnsupportedOperationException। এর মধ্যে অ্যাড , সেট এবং অপসারণের মতো ক্রিয়াকলাপ অন্তর্ভুক্ত রয়েছে । তবে আপনি তালিকার অবজেক্টের বিষয়বস্তু পরিবর্তন করতে পারেন (যদি বস্তুগুলি অপরিবর্তনীয় না হয়), সুতরাং তালিকাটি "সম্পূর্ণরূপে অপরিবর্তনীয়" নয়।
এটি তৈরি করা অশোধিতযোগ্য তালিকার একই ভাগ্য Collections.unmodifiableList। কেবলমাত্র এই তালিকাটি মূল তালিকার একটি দর্শন , তাই যদি আপনি মূল তালিকাটি পরিবর্তন করেন তবে এটি পরিবর্তন করতে পারে।
Arrays.asListসম্পূর্ণরূপে অপরিবর্তনীয় নয়, এটির কোনও বিধিনিষেধ নেই set।
listOf.set(1, "a"); // UnsupportedOperationException
unmodif.set(1, "a"); // UnsupportedOperationException
asList.set(1, "a"); // modified unmodif! unmodif is not truly unmodifiable
একইভাবে, ব্যাকিং অ্যারে পরিবর্তন (যদি আপনি এটি ধরে থাকেন) তালিকা পরিবর্তন করবে।
কাঠামোগত অপরিবর্তনীয়তা প্রতিরক্ষামূলক কোডিং, সম্মতি এবং সুরক্ষার সাথে সম্পর্কিত অনেকগুলি পার্শ্ব প্রতিক্রিয়া সহ আসে যা এই উত্তরের ক্ষেত্রের বাইরে।
List.ofএবং জাভা 1.5 এর পরের কোনও সংগ্রহ nullউপাদান হিসাবে অনুমতি দেয় না । nullউপাদান হিসাবে বা এমনকি একটি চেহারা হিসাবে পাস করার চেষ্টা একটি ফলাফল NullPointerException।
যেহেতু Arrays.asList1.2 থেকে সংগ্রহ (সংগ্রহ ফ্রেমওয়ার্ক), এটি এর অনুমতি দেয় null।
listOf.contains(null); // NullPointerException
unmodif.contains(null); // allowed
asList.contains(null); // allowed
যেহেতু List.ofজাভা 9 তে চালু হয়েছে এবং এই পদ্ধতির দ্বারা তৈরি তালিকাগুলির নিজস্ব (বাইনারি) সিরিয়ালাইজড ফর্ম রয়েছে তাই তাদের পূর্ববর্তী জেডিকে সংস্করণগুলিতে ( বাইনারি সামঞ্জস্যতা নেই ) ডিজিট্রাইজ করা যায় না । তবে উদাহরণস্বরূপ, আপনি জেএসওএন দিয়ে ডি / সিরিয়ালাইজ করতে পারেন।
Arrays.asListঅভ্যন্তরীণভাবে কলগুলি new ArrayList, যা রেফারেন্স বৈষম্যের গ্যারান্টি দেয়।
List.ofঅভ্যন্তরীণ বাস্তবায়নের উপর নির্ভর করে। প্রত্যাবর্তিত দৃষ্টান্তগুলিতে রেফারেন্স সমতা থাকতে পারে, তবে যেহেতু এটির গ্যারান্টি নেই আপনি এতে নির্ভর করতে পারবেন না।
asList1 == asList2; // false
listOf1 == listOf2; // true or false
List.equalsতারা কীভাবে তৈরি করা হয়েছিল বা কোন ক্রিয়াকলাপ সমর্থন করে তা নির্বিশেষে তালিকাগুলিতে একই ক্রমে একই উপাদান রয়েছে তবে তালিকা সমান (মাধ্যমে ) সমান হবে তা উল্লেখযোগ্য নয় ।
asList.equals(listOf); // true i.f.f. same elements in same order
তালিকার উপাদানের সংখ্যা List.of2 বা তার চেয়ে কম হলে উপাদানগুলি একটি বিশেষায়িত (অভ্যন্তরীণ) শ্রেণীর ক্ষেত্রগুলিতে সংরক্ষণ করা হয়। একটি উদাহরণ সেই তালিকা যা 2 টি উপাদান (আংশিক উত্স) সঞ্চয় করে:
static final class List2<E> extends AbstractImmutableList<E> {
private final E e0;
private final E e1;
List2(E e0, E e1) {
this.e0 = Objects.requireNonNull(e0);
this.e1 = Objects.requireNonNull(e1);
}
}
অন্যথায় তারা অনুরূপ ফ্যাশনে একটি অ্যারেতে সংরক্ষণ করা হয় Arrays.asList।
List.ofবাস্তবায়নের যা ক্ষেত্র ভিত্তিক (আকার <2) হয় সামান্য দ্রুত কিছু অপারেশন উপর সঞ্চালন। উদাহরণ হিসাবে, size()অ্যারে দৈর্ঘ্য আনার সময় ছাড়া একটি ধ্রুবক আসতে পারে, এবং contains(E e)পুনরাবৃত্তির ওভারহেড প্রয়োজন হয় না।
এর মাধ্যমে List.ofঅবিচ্ছেদেযোগ্য তালিকা তৈরি করাও দ্রুত। উপরোক্ত কনস্ট্রাক্টরের সাথে 2 রেফারেন্স অ্যাসাইনমেন্ট (এবং এমনকি নির্বিচার পরিমাণের উপাদানগুলির জন্য একটি) এর সাথে তুলনা করুন
Collections.unmodifiableList(Arrays.asList(...));
যা 2 টি তালিকা এবং অন্যান্য ওভারহেড তৈরি করে। স্থানের শর্তাবলী, আপনি UnmodifiableListমোড়ক এবং কিছু পেনি সংরক্ষণ করুন । শেষ পর্যন্ত, HashSetসমমানের সঞ্চয়গুলি আরও দৃinc়প্রত্যয়ী।
উপসংহার সময়: List.ofযখন আপনি পরিবর্তন Arrays.asListকরতে না পারে এমন একটি তালিকা চান এবং যখন আপনি পরিবর্তন করতে পারে এমন একটি তালিকা চান তখন ব্যবহার করুন (উপরে বর্ণিত হিসাবে)।
Arrays.asListসম্পূর্ণরূপে পরিবর্তনযোগ্য নয়। asList.add(1);একটি ছোঁড়ার UnsupportedOperationException।
List.ofলোকে কল করতে চায় containsএবং নালপয়েন্টার এক্সসেপশন দেখে অবাক হয় না এমন সময় আমি খুব বেশি ব্যবহার করতে পারি না ।
তালিকা.ফ এবং অ্যারে.এএসলিস্টের মধ্যে পার্থক্যগুলি সংক্ষিপ্ত করে দেখি
List.ofযখন ডেটা সেট কম এবং অপরিবর্তিত থাকে তখন সেরা ব্যবহার করা যেতে পারে, তবে Arrays.asListবড় এবং গতিশীল ডেটা সেটের ক্ষেত্রে সেরা ব্যবহার করা যেতে পারে।
List.ofখুব কম ওভারহেড স্পেস নিন কারণ এতে ফিল্ড-ভিত্তিক বাস্তবায়ন রয়েছে এবং স্থির ওভারহেডের ক্ষেত্রে এবং প্রতি উপাদান ভিত্তিতে উভয়ই কম হ্যাপ স্পেস গ্রহণ করে। Arrays.asListআরও ওভারহেড স্থান নেওয়ার সময় কারণ সূচনা করার সময় এটি গাদাতে আরও বস্তু তৈরি করে।
দ্বারা List.ofপ্রদত্ত সংগ্রহটি Arrays.asListপরিবর্তনযোগ্য এবং সুতরাং থ্রেড-নিরাপদ যখন সংগ্রহটি ফেরত আসে তা পরিবর্তনীয় এবং থ্রেড নিরাপদ নয়। (অপরিষ্কার সংগ্রহের দৃষ্টান্তগুলি সাধারণত তাদের পারস্পরিক পরিবর্তনগুলির তুলনায় অনেক কম স্মৃতি গ্রহণ করে consume)
List.ofঅনুমতি দেয় না নাল উপাদানগুলোর থাকার Arrays.asListঅনুমতি দেয় নাল উপাদান।
Arrays.asListবনাম সম্পর্কে কথা বলার সময় এটি সত্য যে, প্রবীণ List.ofআক্ষরিকভাবে অ্যারের চারপাশে কেবল একটি মোড়ক। কমপক্ষে ওপেনজেডিকে বাস্তবায়নে অত্যন্ত ছোট ওভারহেড উপস্থিত রয়েছে। প্রকৃতপক্ষে, List.ofযে কোনও অ্যারের পাস করা হয়েছে তার অনুলিপিগুলি তৈরি করা দরকার, সুতরাং যদি না অ্যারে নিজেই খুব শীঘ্রই GC'd হয়ে যায় তবে মনে হবে এটির List.ofচেয়ে বড় মেমরির পদক্ষেপ রয়েছে।
List.of(x)এবং List.of(x, y)আরও দক্ষ কারণ তারা বিন্যাসে মোটেও বরাদ্দ দেয় না
List.ofপদ্ধতিগুলি প্রতিটি সময় নতুন তালিকা ফেরত প্রয়োজন হয় না। এই তালিকাগুলির একটি অনির্ধারিত পরিচয় রয়েছে, সুতরাং জেভিএম স্তরে পরিচালিত ক্যাচিং বা নকল বা স্কেলারিাইজেশন হতে পারে। যদি এই সংস্করণে না থাকে, তবে সম্ভবত পরবর্তী ক্ষেত্রে। এটি চুক্তি দ্বারা অনুমোদিত। বিপরীতে, Array.asListআপনি যে অ্যারেটি দিয়ে যাচ্ছেন তার পরিচয়ের উপর নির্ভর করে, ফলস্বরূপ তালিকাটি অ্যারেতে পরিবর্তনযোগ্য দৃষ্টিভঙ্গি রয়েছে, যা দ্বিপাক্ষিকভাবে সমস্ত পরিবর্তনকে প্রতিফলিত করে।
এছাড়াও উপরে উত্তর থেকে কিছু অপারেশন যা উভয় List::ofএবং Arrays::asListভিন্ন:
+----------------------+---------------+----------+----------------+---------------------+
| Operations | SINGLETONLIST | LIST::OF | ARRAYS::ASLIST | JAVA.UTIL.ARRAYLIST |
+----------------------+---------------+----------+----------------+---------------------+
| add | ❌ | ❌ | ❌ | ✔️ |
+----------------------+---------------+----------+----------------+---------------------+
| addAll | ❌ | ❌ | ❌ | ✔️ |
+----------------------+---------------+----------+----------------+---------------------+
| clear | ❌ | ❌ | ❌ | ✔️ |
+----------------------+---------------+----------+----------------+---------------------+
| remove | ❌ | ❌ | ❌ | ✔️ |
+----------------------+---------------+----------+----------------+---------------------+
| removeAll | ❗️ | ❌ | ❗️ | ✔️ |
+----------------------+---------------+----------+----------------+---------------------+
| retainAll | ❗️ | ❌ | ❗️ | ✔️ |
+----------------------+---------------+----------+----------------+---------------------+
| replaceAll | ❌ | ❌ | ✔️ | ✔️ |
+----------------------+---------------+----------+----------------+---------------------+
| set | ❌ | ❌ | ✔️ | ✔️ |
+----------------------+---------------+----------+----------------+---------------------+
| sort | ✔️ | ❌ | ✔️ | ✔️ |
+----------------------+---------------+----------+----------------+---------------------+
| remove on iterator | ❌ | ❌ | ❌ | ✔️ |
+----------------------+---------------+----------+----------------+---------------------+
| set on list-iterator | ❌ | ❌ | ✔️ | ✔️ |
+----------------------+---------------+----------+----------------+---------------------+
সংগ্রহগুলি সম্পর্কে আরও :: :: সিঙ্গলটনলিস্ট বনাম। তালিকা