তালিকা.ফ এবং অ্যারে.এএসলিস্টের মধ্যে পার্থক্য কী?


117

জাভা 9 তালিকার জন্য নতুন কারখানার পদ্ধতি চালু করেছে, List.of :

List<String> strings = List.of("first", "second");

আগের এবং নতুন বিকল্পের মধ্যে পার্থক্য কী? অর্থাৎ এর মধ্যে পার্থক্য কী:

Arrays.asList(1, 2, 3);

এবং এই:

List.of(1, 2, 3);

1
আরও দেখুন এই আলাপ স্টুয়ার্ট "পানপাত্র" মার্কস দ্বারা।
ব্যবহারকারী1803551

20
@ ব্যবহারকারী1803551 যদিও আমি আপনার হতাশাকে বুঝতে পারি, এই যুক্তিটি সত্যিই অযাচিত নজির স্থাপন করতে পারে। এখানে প্রচুর প্রশ্নের উত্তর রয়েছে যা 'স্পষ্টভাবে বর্ণিত' (একজন এটি কীভাবে সংজ্ঞায়িত করে তার উপর নির্ভর করে)। আমি আপনাকে এই আলোচনাটি মেটাতে আনার জন্য অনুরোধ করব তবে আমি নিশ্চিত যে এই জাতীয় আলোচনার ইতিমধ্যে উপস্থিত হওয়া উচিত (এবং আমি আশা করছি যে কেউ এটি খুঁজে পেতে এবং এটি লিঙ্ক করতে পারে :-)
দিমিত্রিস ফ্যাসারাকিস হিলিয়ার্ড

4
@ ব্যবহারকারী1803551 জাভাডোকস এই দুটি পদ্ধতির প্রয়োগের বিশদগুলির মধ্যে পার্থক্য (যেমন স্থান গ্রহণ বা কর্মক্ষমতা) উল্লেখ করেন না। আমি মনে করি লোকেরাও এই বিবরণগুলি জানতে চাইবে।
ZhekaKozlov

5
@ ঝেকা কোজলভ গৃহীত এবং অতি-উত্তরে উত্তরটিও হয় না। এটি আপনাকে গৃহীত মান সম্পর্কে কী বলে? এমনকি ডক্সের চেয়ে এটিরও কম তথ্য রয়েছে (সিরিয়ালাইজেশন, পরিচয়, ক্রম)। যদি কিছু থাকে তবে এই তথ্যটি যুক্ত করতে ওপেনজেডিকে একটি অনুরোধ করুন।
ব্যবহারকারী1803551

3
এই প্রশ্নটি মেটা নিয়ে আলোচনা হচ্ছে ।
দিমিত্রিস ফাসারাকিস হিলিয়ার্ড

উত্তর:


173

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]

22
কীভাবে এটি তৈরি করা হয়েছে তার উপর ভিত্তি করে কোনও তালিকা আচরণ করা আমার পক্ষে খুব একটা বস্তু কেন্দ্রিক বলে মনে হয় না। হয়তো যদি লিস্ট.এফ একটি অপ্রচলযোগ্য তালিকা প্রেরণ করে, এটি অর্থবোধ করবে। এটি এখানে একটি খুব ফাঁসযুক্ত বিমূর্ততা।
স্যান্ডি চ্যাপম্যান 11

5
আমি জাভা বিকাশকারী নই, সুতরাং এটি নৈমিত্তিক পর্যবেক্ষণ হিসাবে গ্রহণ করুন। আচরণের পার্থক্য করার পক্ষে সম্ভবত একটি ভাল কারণ রয়েছে তবে উদাহরণের মতো আমার কাছে তালিকা <ইন্টিজার> ফিরিয়ে দেওয়ার কোনও পদ্ধতি থাকলে ইন্টারফেসটি আমার জানার পক্ষে যথেষ্ট হবে না আমি যদি এটি পরীক্ষা করে দেখি তবে রানটাইম ব্যতিক্রম পাব কিনা তা আমার পক্ষে যথেষ্ট ছিল না know নালার জন্য তেমনিভাবে, সেই পদ্ধতিগুলির প্রয়োগের পরিবর্তনটি যদি অন্য কোথাও ঘটে থাকে তবে আমার পদ্ধতির কল সাইট থেকে কোড দূরের কোডকে প্রভাবিত করতে পারে। @ নিকোলাই
স্যান্ডি চ্যাপম্যান

8
@ স্যান্ডি চ্যাপম্যান এটি কিছু (বা সর্বাধিক?) এর সাথে অপ্রত্যাশিত আচরণ হতে পারে তবে এটি নথিভুক্ত আচরণ। থেকে List.contains(Object o)এর javadoc : "ছোঁড়ার [...] নালপয়েন্টারএক্সেপশন - যদি নিদিষ্ট উপাদান নাল এবং এই তালিকা নাল উপাদান (ঐচ্ছিক) অনুমতি দেয় না"। বা ইন্টারফেসের দৈর্ঘ্য ভূমিকা থেকে যে কয়েকজন পড়েছেন: "কিছু সংগ্রহের বাস্তবায়নে তাদের থাকতে পারে এমন উপাদানগুলির উপর বিধিনিষেধ রয়েছে"
অ্যারন

11
অ্যারন কমপক্ষে এটি একটি ভাল ডকুমেন্টেড ফাঁস বিমূর্ততা :) ভাল
স্যান্ডি চ্যাপম্যান

6
@ স্যান্ডি চ্যাপম্যান: কিছু প্রকার ফিরে List.of আসেImmutableList , এর আসল নামটি একটি জন-বাস্তবায়নের বিশদ মাত্র। এটি যদি সর্বজনীন হয় এবং কেউ Listআবার এটিকে ফেলে দেয় তবে পার্থক্যটি কোথায় ছিল? যেখানে Arrays.asListকোনও অ-জন- Listবাস্তবায়ন ফিরিয়ে দেয় , সেখানে পার্থক্য কোথায় , চেষ্টা করার সময় ব্যতিক্রম ছুঁড়ে addবা remove, বা তালিকাটি ফিরে আসে Collections.unmodifiableListযার দ্বারা কোনও পরিবর্তন করার অনুমতি নেই? এটি Listইন্টারফেসে নির্দিষ্ট চুক্তিগুলি সম্পর্কে । Javaচ্ছিক পদ্ধতি সহ সংগ্রহের ইন্টারফেসগুলি জাভা ১.২ থেকে সর্বদা অপরিষ্কার ওওপি ছিল ...
হোলগার

31

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করতে না পারে এমন একটি তালিকা চান এবং যখন আপনি পরিবর্তন করতে পারে এমন একটি তালিকা চান তখন ব্যবহার করুন (উপরে বর্ণিত হিসাবে)।


1
ভাবছি কেন এই উত্তর বিদ্যমান মানুষের জন্য, দেখুন এই
ব্যবহারকারী1803551

3
Arrays.asListসম্পূর্ণরূপে পরিবর্তনযোগ্য নয়। asList.add(1);একটি ছোঁড়ার UnsupportedOperationException
ম্যাপটাররা

"নুল বৈরী" এটি লাগানোর দুর্দান্ত উপায় a List.ofলোকে কল করতে চায় containsএবং নালপয়েন্টার এক্সসেপশন দেখে অবাক হয় না এমন সময় আমি খুব বেশি ব্যবহার করতে পারি না ।
নুমেনন

14

তালিকা.ফ এবং অ্যারে.এএসলিস্টের মধ্যে পার্থক্যগুলি সংক্ষিপ্ত করে দেখি

  1. List.ofযখন ডেটা সেট কম এবং অপরিবর্তিত থাকে তখন সেরা ব্যবহার করা যেতে পারে, তবে Arrays.asListবড় এবং গতিশীল ডেটা সেটের ক্ষেত্রে সেরা ব্যবহার করা যেতে পারে।

  2. List.ofখুব কম ওভারহেড স্পেস নিন কারণ এতে ফিল্ড-ভিত্তিক বাস্তবায়ন রয়েছে এবং স্থির ওভারহেডের ক্ষেত্রে এবং প্রতি উপাদান ভিত্তিতে উভয়ই কম হ্যাপ স্পেস গ্রহণ করে। Arrays.asListআরও ওভারহেড স্থান নেওয়ার সময় কারণ সূচনা করার সময় এটি গাদাতে আরও বস্তু তৈরি করে।

  3. দ্বারা List.ofপ্রদত্ত সংগ্রহটি Arrays.asListপরিবর্তনযোগ্য এবং সুতরাং থ্রেড-নিরাপদ যখন সংগ্রহটি ফেরত আসে তা পরিবর্তনীয় এবং থ্রেড নিরাপদ নয়। (অপরিষ্কার সংগ্রহের দৃষ্টান্তগুলি সাধারণত তাদের পারস্পরিক পরিবর্তনগুলির তুলনায় অনেক কম স্মৃতি গ্রহণ করে consume)

  4. List.ofঅনুমতি দেয় না নাল উপাদানগুলোর থাকার Arrays.asListঅনুমতি দেয় নাল উপাদান।


2
"অপরিষ্কার সংগ্রহের দৃষ্টান্তগুলি সাধারণত তাদের পারস্পরিক পরিবর্তনগুলির তুলনায় অনেক কম স্মৃতি গ্রাস করে" " - সত্যি? আপনি কি এ সম্পর্কে কিছুটা বিশদ দেওয়ার জন্য যত্ন নেবেন - আপনি কি বোঝাতে চাইছেন যে সেগুলি নিরাপদে ভাগ করা যায়, বা আপনি কী বোঝায় যে দৃষ্টান্তগুলি তাদের নিজেরাই আরও দক্ষতার সাথে কোনওভাবে প্রয়োগ করা যেতে পারে?
হাল্ক

1
@ হাল্ক উত্তরদাতা স্থান দক্ষতার বিষয়ে সঠিক। স্টুয়ার্ট মার্কসের আলাপ দেখুন: youtu.be/q6zF3vf114M?t=49m48s
heেকা কোজলোভ

2
@ Kaেকা কোজলোভ এটি সাধারণভাবে সত্য বলে প্রতীয়মান হয়েছে, তবে আমি খুব সন্দেহবাদী যে Arrays.asListবনাম সম্পর্কে কথা বলার সময় এটি সত্য যে, প্রবীণ List.ofআক্ষরিকভাবে অ্যারের চারপাশে কেবল একটি মোড়ক। কমপক্ষে ওপেনজেডিকে বাস্তবায়নে অত্যন্ত ছোট ওভারহেড উপস্থিত রয়েছে। প্রকৃতপক্ষে, List.ofযে কোনও অ্যারের পাস করা হয়েছে তার অনুলিপিগুলি তৈরি করা দরকার, সুতরাং যদি না অ্যারে নিজেই খুব শীঘ্রই GC'd হয়ে যায় তবে মনে হবে এটির List.ofচেয়ে বড় মেমরির পদক্ষেপ রয়েছে।
ক্রিস

4
@ ক্রিসহয়েস কমপক্ষে List.of(x)এবং List.of(x, y)আরও দক্ষ কারণ তারা বিন্যাসে মোটেও বরাদ্দ দেয় না
heেকা কোজলোভ

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

2

এছাড়াও উপরে উত্তর থেকে কিছু অপারেশন যা উভয় 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 |             |       |        ✔️       |          ✔️          |
+----------------------+---------------+----------+----------------+---------------------+
  1. ✔️ মানে পদ্ধতিটি সমর্থিত
  2. ❌ এর অর্থ হল যে এই পদ্ধতিটি কল করা একটি অসমর্থিত অপারেশন এক্সেক্সশন নিক্ষেপ করবে
  3. ❗️ মানে এই পদ্ধতিটি কেবল তখনই সমর্থিত হয় যদি পদ্ধতির আর্গুমেন্টগুলি কোনও মিউটেশন সৃষ্টি না করে, যেমন: কালেকশনস.সেনলেটোনলিস্ট ("foo") retain ) একটি অসমর্থিত অপারেশন এক্সেক্সশন ছুড়ে দেয়

সংগ্রহগুলি সম্পর্কে আরও :: :: সিঙ্গলটনলিস্ট বনাম। তালিকা


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