আমার কোন জাভা সংগ্রহটি ব্যবহার করা উচিত?


127

এই প্রশ্নে আমি কীভাবে দক্ষতার সাথে সি ++ 11 এ একটি স্ট্যান্ডার্ড লাইব্রেরি ধারক নির্বাচন করতে পারি?সি ++ সংগ্রহগুলি বেছে নেওয়ার সময় ব্যবহার করার জন্য হ্যান্ডি ফ্লো চার্ট।

আমি ভেবেছিলাম যে এই লোকদের জন্য এটি একটি দরকারী সংস্থান যা নিশ্চিত না যে তাদের কোন সংগ্রহটি ব্যবহার করা উচিত তাই আমি জাবার জন্য একটি অনুরূপ ফ্লো চার্ট সন্ধান করার চেষ্টা করেছি এবং এটি করতে সক্ষম নই।

জাভাতে প্রোগ্রামিং করার সময় লোকেদের সঠিক সংগ্রহ চয়ন করার জন্য কোন সংস্থান এবং "চিট শিট" উপলব্ধ? লোকেরা কীভাবে জানবে যে তালিকা, সেট এবং মানচিত্রের প্রয়োগগুলি তাদের ব্যবহার করা উচিত?


জাভা জেনেরিকস অ্যান্ড কালেকশনস (নাফটালিন অ্যান্ড ওয়াডলার) বইটির একটি অধ্যায় রয়েছে।
ক্রিস্টোফ রাউসি

উত্তর:


292

যেহেতু আমি কোনও অনুরূপ ফ্লোচার্ট খুঁজে পাইনি তাই আমি নিজেই একটি তৈরির সিদ্ধান্ত নিয়েছি।

এই ফ্লো চার্টটি সিঙ্ক্রোনাইজড অ্যাক্সেস, থ্রেড সুরক্ষা ইত্যাদি বা উত্তরাধিকার সংগ্রহের মতো জিনিসগুলি চেষ্টা করে ও coverেকে রাখে না, তবে এটি 3 স্ট্যান্ডার্ড সেট গুলি, 3 স্ট্যান্ডার্ড মানচিত্র এবং 2 স্ট্যান্ডার্ড লিস্টের কভার করে না ।

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

এই চিত্রটি এই উত্তরের জন্য তৈরি হয়েছিল এবং এটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন ৪.০ আন্তর্জাতিক লাইসেন্সের অধীনে লাইসেন্সযুক্ত। সবচেয়ে সহজ এট্রিবিউশনটি এই প্রশ্ন বা এই উত্তরটির সাথে লিঙ্ক করে।

অন্যান্য উৎস

সম্ভবত সবচেয়ে দরকারী অন্যান্য রেফারেন্স হ'ল ওরাকল ডকুমেন্টেশন থেকে নিম্নলিখিত পৃষ্ঠাটি যা প্রতিটি সংগ্রহকে বর্ণনা করে ।

হ্যাশসেট বনাম ট্রিসেট

কখন HashSetবা TreeSetএখানে ব্যবহার করবেন সে সম্পর্কে একটি বিশদ আলোচনা রয়েছে : হ্যাশেট বনাম ট্রিসেট set

অ্যারেলিস্ট বনাম লিংকডলিস্ট

বিস্তারিত আলোচনা: লিংকডলিস্ট ওভার অ্যারেলিস্ট কখন ব্যবহার করবেন?


নিস! তবে আমি অবশ্যই আপনার LinkedListবনাম ArrayListসিদ্ধান্তের সাথে একমত নই । প্রথমত, তালিকাটি যদি উল্লেখযোগ্য আকারের হয় তবে তার LinkedListচেয়ে ভাল। LinkedListপ্রতি উপাদান উপাদান ওভারহেড আছে, তাই এটি একটি চেয়ে মেমরি গ্রাহনের ক্ষেত্রে asyptotically খারাপ ArrayList। এছাড়াও, যদি বেশিরভাগ অ্যাক্সেস তালিকার শেষে থাকে তবে একটি ArrayListপছন্দনীয় কারণ এটি ধ্রুবক-সময় এলোমেলো উপাদান অ্যাক্সেস সরবরাহ করে। nএকটি এর তম উপাদান অ্যাক্সেস LinkedListএকটি O(n)অপারেশন। ... প্রকৃতপক্ষে, লিঙ্কযুক্ত তালিকা ব্যবহারের সিদ্ধান্তটি সবসময় "না" হওয়া উচিত ।
ম্যাট বল

2
@ ম্যাটবাল আমি আপনার সাথে বেশিরভাগ অংশে সম্মত। তবে জাভা LinkedListএকটি দ্বিগুণ লিঙ্কযুক্ত তালিকা, সুতরাং শুরুতে এবং শেষে উভয়ই দ্রুত। আপনি লক্ষ করবেন যে তিনটি প্রশ্নের উপরের শাখাগুলির উত্তর দেওয়ার আগে হ্যাঁ উত্তর দিতে হবে LinkedList- সুতরাং অন্য কথায় আমি আপনার সাথে একমত হই যে বেশিরভাগ ক্ষেত্রেই উত্তরটি হয় না। সারি এবং প্রাত্যহিকের মতো বিষয় যেখানে আপনি ক্রমাগত তালিকার প্রান্ত থেকে জিনিসগুলি যুক্ত করতে এবং অপসারণ করছেন ভাল ব্যবহারের ক্ষেত্রে LinkedList
টিম বি

@ ম্যাটবাল মেমোরির ব্যবহার অনেক জটিল পরিস্থিতি হিসাবে যখন LinkedListউপাদানগুলির প্রতি মেমরি বেশি ব্যবহার করা হয় ... ArrayListমেমোরি কখনই প্রকাশ করে না। এর অর্থ হ'ল যদি আপনার কাছে এমন একটি তালিকা থাকে যা কখনও কখনও বিশাল আকারে বেড়ে যায় তবে সাধারণত ছোট হয় তবে ArrayListমেমরির আরও খারাপ পারফর্মেন্স দেয়। Listনিজে থাকা মেমরির ওভারহেড সাধারণত এটি থাকা উপাদানগুলির তুলনায় সাধারণত (যদিও সর্বদা নয়) ছোট হয়।
টিম বি

Map<K,V>এর অংশ নয়java.util.collection
মেহরাজ মালিক

@ মেহরাজমালিক হুম, লেবেলিং অস্পষ্ট যে আমি সম্মত। আমি জাভা.উটিলের অভ্যন্তরে সংগ্রহের অর্থ। অর্থাত্ java.util। * সংগ্রহের নামটি এখানে sertোকান *
টিম বি

66

প্রধান অ-সমবর্তী, অ-সিঙ্ক্রোনাইজড সংগ্রহগুলির সংক্ষিপ্তসার

Collection: আইটেমগুলির একটি আনর্ডারড "ব্যাগ" উপস্থাপন করে এমন একটি ইন্টারফেস, যাকে "উপাদান" বলা হয়। "পরবর্তী" উপাদানটি অপরিশোধিত (এলোমেলো)।

  • Set: Collectionকোনও ডুপ্লিকেট ছাড়াই একটি প্রতিনিধিত্বকারী একটি ইন্টারফেস ।
    • HashSet: একটি Setসমর্থিত a Hashtable। দ্রুততম এবং ক্ষুদ্রতম মেমরির ব্যবহার, যখন অর্ডারটি গুরুত্বহীন।
    • LinkedHashSet: একটি HashSetমধ্যে সহযোগী উপাদান একটি লিঙ্ক তালিকা যোগে সন্নিবেশ অর্ডার । "পরবর্তী" উপাদানটি হ'ল সাম্প্রতিকতম সন্নিবেশ করা উপাদান।
    • TreeSet: একটি Setযেখানে উপাদানগুলির দ্বারা আদেশ দেওয়া হয় Comparator(সাধারণত প্রাকৃতিক ক্রম )। সবচেয়ে ধীরে ধীরে এবং বৃহত্তম মেমরি ব্যবহার, তবে তুলনামূলক-ভিত্তিক ক্রমের জন্য প্রয়োজনীয়।
    • EnumSet: Setএকক এনাম ধরণের জন্য অত্যন্ত দ্রুত এবং দক্ষ কাস্টমাইজ করা।
  • List: Collectionযার ইন্টারফেসের উপাদানগুলি অর্ডার করা হয় এবং প্রতিনিধিত্ব করে এমন একটি প্রতিনিধিত্ব করে এমন একটি ইন্টারফেস যেখানে তার অবস্থানের প্রতিনিধিত্ব করে সেখানে প্রতিটি শূন্যই প্রথম উপাদান এবং (length - 1)শেষটি।
    • ArrayList: Listএকটি অ্যারে দ্বারা সমর্থিত, যেখানে অ্যারের দৈর্ঘ্য ("ক্ষমতা" বলা হয়) থাকে যা উপাদানগুলির সংখ্যার (তালিকার "আকার") হিসাবে অন্তত বৃহত্তর হয়। যখন আকার ক্ষমতা ছাড়িয়ে যায় (যখন (capacity + 1)-thউপাদান যুক্ত করা হয়), অ্যারেটি নতুন ক্ষমতা সহ পুনঃনির্ধারণ করা হয় - (new length * 1.5)এটি বিনোদন দ্রুত হয়, কারণ এটি ব্যবহার করে System.arrayCopy()। উপাদানগুলি মোছা এবং সন্নিবেশ / সংযোজন করার জন্য প্রতিবেশী সমস্ত উপাদান (ডানদিকে) সেই স্থানের মধ্যে বা বাইরে স্থানান্তরিত হওয়া প্রয়োজন। যে কোনও উপাদান অ্যাক্সেস করা দ্রুত, কারণ এটির (element-zero-address + desired-index * element-size)অবস্থান অনুসন্ধানের জন্য এটি কেবল গণনার প্রয়োজন । বেশিরভাগ পরিস্থিতিতে একটি ArrayListএর চেয়ে বেশি পছন্দ করা হয় LinkedList
    • LinkedList: Listঅবজেক্টের একটি সেট দ্বারা সমর্থিত, প্রতিটি তার "পূর্ববর্তী" এবং "পরবর্তী" প্রতিবেশীদের সাথে যুক্ত। একটি LinkedListএকটি হল Queueএবং Deque। অ্যাক্সেসের উপাদানগুলি প্রথম বা শেষ উপাদানটি থেকে শুরু করে এবং পছন্দসই সূচকটি না পাওয়া পর্যন্ত অনুসরণ করা হয়। সন্নিবেশ এবং মুছে ফেলা, একবার ট্র্যাভারসাল মাধ্যমে কাঙ্ক্ষিত সূচকটি পৌঁছে যাওয়ার পরে কেবলমাত্র তাত্ক্ষণিক-প্রতিবেশী লিঙ্কগুলিকে নতুন ম্যাপের জন্য চিহ্নিত করতে বা এখন-মোছা উপাদানটিকে বাইপাস করার জন্য একটি তুচ্ছ বিষয়।
  • Map: Collectionপ্রতিটি উপাদান একটি সনাক্তকারী "কী" রয়েছে এমন একটি প্রতিনিধিত্বকারী একটি ইন্টারফেস - প্রতিটি উপাদান একটি মূল-মান জুড়ি।
    • HashMap: একটি Mapযেখানে কীগুলি আনর্ডার্ড করা নেই এবং এর দ্বারা সমর্থনযুক্ত Hashtable
    • LinkedhashMap: কীগুলি সন্নিবেশ আদেশের মাধ্যমে অর্ডার করা হয়
    • TreeMap: একটি Mapযেখানে কীগুলি Comparator(সাধারণত প্রাকৃতিক ক্রম) দ্বারা অর্ডার হয়।
  • Queue: এমন একটি ইন্টারফেস যা প্রতিনিধিত্ব করে Collectionযেখানে উপাদানগুলি সাধারণত এক প্রান্তে যুক্ত হয় এবং অপরটি থেকে সরানো হয় (ফিফো: ফার্স্ট-ইন, ফার্স্ট-আউট)।
  • Stack: একটি ইন্টারফেস যা প্রতিনিধিত্ব করে Collectionএমন উপাদানগুলিকে প্রতিনিধিত্ব করে যেখানে একইভাবে উভয়ই যুক্ত (ধাক্কা দেওয়া) এবং সরানো (পপড) করা হয় (লিফো: লাস্ট-ইন, ফার্স্ট-আউট)।
  • Deque: "ডাবল সমাপ্ত সারিতে" সংক্ষিপ্ত, সাধারণত উচ্চারণ করা হয় "ডেক"। একটি লিঙ্কযুক্ত তালিকা যা সাধারণত যুক্ত হয় এবং উভয় প্রান্ত থেকে পড়ে (মাঝের নয়) read

বেসিক সংগ্রহ ডায়াগ্রাম:

নকশা

একটি সঙ্গে একটি উপাদান সন্নিবেশ তুলনা ArrayListএবং LinkedList:

নকশা


2
সংক্ষিপ্ত সংক্ষিপ্তসার মধ্যে সেরা যে কেউ যে কোনও জায়গায় পেতে পারেন :)
রুট ট্রাভেলার

11

এমনকি সহজ চিত্র এখানে। ইচ্ছাকৃতভাবে সরল!

  1. সংগ্রহ হ'ল "উপাদানগুলি" (একই ধরণের) নামক ডেটা ধারণ করে। এর থেকে বেশি নির্দিষ্ট কিছু অনুমান করা হয় না।

  2. তালিকা হ'লডেটাগুলিরএকটি সূচকযুক্ত সংগ্রহ যেখানে প্রতিটি উপাদানটির একটি সূচক থাকে। অ্যারের মতো কিছু তবে আরও নমনীয়।

    তালিকায় থাকা ডেটা সন্নিবেশের ক্রম রাখে।

    টিপিক্যাল অপারেশন: এন-তম উপাদান পান।

  3. সেট হ'ল উপাদানগুলির একটি ব্যাগ , প্রতিটি উপাদান মাত্র একবারে (উপাদানগুলি তাদেরequals()পদ্ধতিটিব্যবহার করে আলাদা করা হয়)।

    সেটটিতে থাকা ডেটাগুলি বেশিরভাগই কেবল কী কী ডেটা আছে তা জানার জন্য সংরক্ষণ করা হয়।

    সাধারণ ক্রিয়াকলাপ: তালিকায় কোনও উপাদান উপস্থিত রয়েছে কিনা তা বলুন।

  4. মানচিত্রটি তালিকার মতো কিছু, তবে উপাদানগুলির পূর্ণসংখ্যার সূচক দ্বারা অ্যাক্সেস করার পরিবর্তে আপনি তাদের কী দ্বারা তাদের অ্যাক্সেস করতে পারেন যা কোনও বস্তু। পিএইচপি তে অ্যারের মত :)

    মানচিত্রে ডেটাগুলি তাদের কী দ্বারা অনুসন্ধানযোগ্য।

    সাধারণ অপারেশন: এটির আইডি দ্বারা একটি উপাদান পান (যেখানে আইডি কোনও ধরণের, কেবল intতালিকার ক্ষেত্রে নয় )।

পার্থক্য

  • সেট এবং মানচিত্র: সেটে আপনি নিজেরাই ডেটা অনুসন্ধান করেন , যখন তাদের কী দ্বারা মানচিত্রে ।

  • তালিকা এবং মানচিত্র: তালিকাটিতে আপনি তাদের intসূচক অনুসারে উপাদান অ্যাক্সেস করুন (তালিকার অবস্থান), মানচিত্রে তাদের কী দ্বারা কোনও ধরণের ওস (সাধারণত: আইডি)

  • তালিকা এবং সেট: তালিকার মধ্যে উপাদানগুলি তাদের অবস্থানের সাথে আবদ্ধ এবং সদৃশ হতে পারে যখন সেটগুলিতে উপাদানগুলি কেবল "উপস্থিত" (PR উপস্থিত না থাকে) এবং অনন্য (এর অর্থ equals()বা এর compareTo()জন্য SortedSet)


1

এটি সহজ: আপনার যদি মানচিত্রের ইন্টারফেসের জন্য ম্যাপযুক্ত কীগুলির সাথে মানগুলি সংরক্ষণের প্রয়োজন হয়, অন্যথায় নকল হতে পারে এমন মানগুলির জন্য তালিকা ব্যবহার করুন এবং অবশেষে আপনি যদি আপনার সংগ্রহে ডুপ্লিকেট মান না চান তবে সেট ইন্টারফেসটি ব্যবহার করুন।

ফ্লোচার্ট ইত্যাদির সম্পূর্ণ বিবরণটি এখানে রয়েছে http://javatutorial.net/choose-the-right-java-colલેક્શન


1

মানচিত্র

যদি একটি চয়ন করে Map, আমি এই টেবিলটি জাভা 11 এর সাথে বান্ডিল করা দশটি বাস্তবায়নের প্রতিটিটির বৈশিষ্ট্যগুলির সংক্ষিপ্তসার তৈরি করেছি।

জাভা 11 এ তাদের বৈশিষ্ট্যগুলির তুলনা করে মানচিত্রের প্রয়োগের টেবিল



-2

আমার কোন জাভা সংগ্রহটি ব্যবহার করা উচিত?

এটি আপনি কোন সমস্যা সমাধানের চেষ্টা করছেন বা আপনার কী প্রয়োজনীয়তা রয়েছে তার উপর নির্ভর করে।

উদাহরণ:

  1. আপনি কি উপাদানগুলি সংরক্ষণ করার সময় বাছাই করতে চান? HashSet
  2. আপনি কি (কী, মান) জোড়াটি সঞ্চয় করতে চান? হ্যাশ মানচিত্র
  3. Elementsোকানোর সময় আপনি কি উপাদানগুলির ক্রম সংরক্ষণ করার জন্য চান? অ্যারেলিস্ট, লিংকডলিস্ট
  4. আপনি কী (কী, মান) জুটির কী বাছাই করতে চান? - শক্তিশালী পাঠ্য
  5. আপনি কি আপনার সমস্যা সমাধানের জন্য একটি স্ট্যাক প্রয়োগ করতে চান? - স্ট্যাক
  6. আপনি কি ফিফো (প্রথমত ফার্স্ট আউট) অ্যাক্সেস পেতে চান? - সারি
  7. আপনি কি চান যে কেবলমাত্র অনন্য উপাদানই সংরক্ষণ করা হোক? - হ্যাশসেট
  8. আপনি কী (কী, মান) সংরক্ষণ করার সময় কীটিকে "নাল" হিসাবে অনুমতি দিতে চান? - হ্যাশম্যাপ
  9. আপনি কি (কী, মান) জুটির জন্য কোনও নুল মান চান না? হ্যাশ টেবিল

এমনকি আইটেম 4 এর শক্তিশালী পাঠ্য দ্বারা প্রতিস্থাপন করা হয়েছে, বলুন, কনকন্ট্রেন্টসকিপলিস্টম্যাপ (কে, ভি) , এই উত্তরটি টিম বিয়ের সিদ্ধান্ত গ্রাফের সাথে আলিটালারমাইন্ডের "সংক্ষিপ্ত তালিকার বিবরণ" যুক্ত করে ?
গ্রেইবার্ড

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