java - একটি অ্যারের তালিকার ক্ষমতা এবং একটি অ্যারের আকারের মধ্যে পার্থক্য



arrays arraylist (4)

আপনি যদি arr = new Employee[100] সাথে একটি নতুন অ্যারে বরাদ্দ করেন তবে সেই অ্যারের আকার ( arr.length ) 100 হতে চলেছে It এতে 100 টি উপাদান রয়েছে। সমস্ত উপাদান প্রাথমিকভাবে নাল (যেমন এটি কোনও বস্তুর রেফারেন্সের অ্যারে) তবে এখনও, সেখানে 100 টি উপাদান রয়েছে।

আপনি যদি list = new ArrayList <Employee>(100) মতো কিছু করেন এবং list.size() পরীক্ষা করার চেষ্টা করেন, আপনি 0 পাবেন the তালিকার কোনও উপাদান নেই।

অভ্যন্তরীণভাবে, এটি সত্য যে ArrayList তার ক্ষমতা বাড়ানোর আগে 100 টি আইটেম রাখার জন্য পর্যাপ্ত জায়গা বরাদ্দ করে তবে এটি অভ্যন্তরীণ বাস্তবায়ন বিশদ, এবং তালিকাটি আপনার সামগ্রীটিকে "কোনও আইটেম সঞ্চিত নয়" হিসাবে উপস্থাপন করে। আপনি যদি কেবল list.add(something) করেন তবে আপনার তালিকায় আইটেম থাকবে।

সুতরাং তালিকাটি আগে থেকেই স্টোরেজ বরাদ্দ করা হলেও, API এর সাথে এটি প্রোগ্রামটির সাথে যোগাযোগ করে, আপনাকে বলে যে এতে কোনও আইটেম নেই। এর অভ্যন্তরীণ অ্যারেতে নাল আইটেমগুলি আপনার কাছে উপলভ্য নয় - আপনি সেগুলি পুনরুদ্ধার করতে বা তাদের পরিবর্তন করতে পারবেন না।

https://src-bin.com

আমি কোর জাভা আমি বইয়ের নীচে স্নিপেটটি পড়েছি।

নতুন অ্যারেলিস্ট <'কর্মচারী> (100) // সক্ষমতা 100 হিসাবে একটি অ্যারের তালিকা বরাদ্দ করা হচ্ছে

নতুন কর্মচারী হিসাবে নতুন অ্যারে বরাদ্দ করার সমান নয় [100] // আকার 100 হয়

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

আমি যখন সোর্স কোড অ্যারে তালিকাটি দেখেছি, কনস্ট্রাক্টর প্রদত্ত ক্ষমতার একটি অবজেক্ট অ্যারে তৈরি করে যা প্রদত্ত ক্ষমতার উপাদানগুলি ধরে রাখতে প্রস্তুত (নীচে কোড স্নিপেট)।

public ArrayList(int initialCapacity) {
     super();
     if (initialCapacity < 0)
         throw new IllegalArgumentException("Illegal Capacity: "+
                                            initialCapacity);
     this.elementData = new Object[initialCapacity];
 }

লেখক উপরোক্ত লেখায় যা উল্লেখ করেছেন তার প্রকৃত পার্থক্যটি আমি বের করতে পারছি না।


Answer #1

আমি এটি সঠিকভাবে বুঝতে না পারলে এটি কেবল খারাপ শব্দযুক্ত এবং সম্ভাব্য ভুল বলে মনে হচ্ছে।

আমি বিশ্বাস করি এটি যা বলার চেষ্টা করছে তা হ'ল অ্যারেলিস্টের প্রাথমিক ক্ষমতা এবং অ্যারেলিস্টের প্রাথমিক আকারের মধ্যে পার্থক্য রয়েছে।

List<Employee> employees = new ArrayList<>(100);
int size = employes.size();

আকার 0 হবে যখন প্রাথমিক ক্ষমতা 100 হবে।

আপনি কীভাবে উত্স কোডটি পড়ছেন তা দিয়ে আপনি সঠিক।


Answer #2

একটি অ্যারেলিস্ট হ'ল বিমূর্ত তালিকা উপস্থাপনের একমাত্র উপায় এবং অ্যারেলিস্টের ক্ষমতা সিস্টেম কীভাবে লজিকাল তালিকাকে কার্যকর করে তার একটি বাস্তবায়ন বিশদ।

একটি অ্যারেলিস্ট একটি আসল অ্যারে "কভারগুলির নীচে" ব্যবহার করে তালিকার উপাদানগুলিকে সঞ্চয় করে। কম্পিউটার মেমোরিতে অ্যারের আসল উপলব্ধি একটি নির্দিষ্ট আকার থাকে যখন এটি বরাদ্দ করা হয়; এই আকারটি অ্যারেলিস্টের ক্ষমতা। অ্যারেলিস্ট স্থির-দৈর্ঘ্যের অ্যারের পাশাপাশি তালিকার লজিকাল দৈর্ঘ্য সঞ্চয় করে একটি পরিবর্তনশীল-আকারের তালিকা এমুলেট করে। সুতরাং আপনার যদি 10 টি সক্ষমতা সহ একটি অ্যারেলিস্ট থাকে যেখানে 4 টি লজিক্যাল উপাদান রয়েছে, অ্যারেলিস্টটি দৈর্ঘ্য এবং একটি অ্যারে হিসাবে উপস্থাপিত হতে পারে

(4) | e1 | e2 | e3 | e4 | __ | __ | __ | __ | __ | __ |

যেখানে (4) হল তালিকার যৌক্তিক দৈর্ঘ্য এবং '__' এমন ডেটা উপস্থাপন করে যা উপেক্ষা করা হয় কারণ এটি যৌক্তিক তালিকার অংশ নয় part যদি আপনি এই অ্যারেলিস্টের 5 ম উপাদানটি অ্যাক্সেস করার চেষ্টা করেন তবে এটি একটি ব্যতিক্রম ছুঁড়ে দেবে কারণ এটি জানেন যে পঞ্চম উপাদানটি আরম্ভ করা হয়নি। তারপরে যদি আমরা তালিকায় অতিরিক্ত উপাদান ই 5 যুক্ত করি তবে অ্যারেলিস্ট হয়ে যায়

(5) | e1 | e2 | e3 | e4 | e5 | __ | __ | __ | __ | __ |

নোট করুন যে ক্ষমতাটি পরিবর্তিত হয়নি, যদিও লজিকাল দৈর্ঘ্য রয়েছে, কারণ অন্তর্নিহিত অ্যারে এখনও যৌক্তিক তালিকার সমস্ত ডেটা পরিচালনা করতে সক্ষম।

আপনি যদি এই তালিকায় দশটির বেশি উপাদান যুক্ত করতে পরিচালনা করেন তবে অ্যারেলিস্টটি ভাঙবে না। অ্যারেলিস্ট একটি বিমূর্ততা যার অর্থ সমস্ত অ্যারে ক্রিয়াকলাপের সাথে সামঞ্জস্যপূর্ণ। বরং, এর লজিকাল দৈর্ঘ্যটি তার আসল ক্ষমতা ছাড়িয়ে গেলে অ্যারেলিস্ট তার ক্ষমতা পরিবর্তন করে। যদি আমরা উপরের তালিকায় উপাদানগুলি (a1, a2, ..., a7) যুক্ত করে থাকি তবে ফলাফলযুক্ত অ্যারেলিস্টটি দেখতে দেখতে দেখতে পারে

(12) | e1 | e2 | e3 | e4 | e5 | এ 1 | a2 | a3 | a4 | a5 | a6 | a7 | __ | __ | __ | __ | __ | __ | __ | __ |

20 ক্ষমতা সহ।

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


Answer #3

পার্থক্যটি একটি স্থির আকারের ধারক (ডেটা স্ট্রাকচার) এবং একটি পরিবর্তনশীল আকারের ধারক মধ্যে।

একটি অ্যারে একটি স্থির আকারের ধারক হয়, অ্যারে তৈরি করা হয় এবং কখনই পরিবর্তন হয় না এমন উপাদানগুলির সংখ্যা এটি ধারণ করে। (যখন অ্যারেটি তৈরি করা হবে তখন সমস্ত উপাদানের কিছু ডিফল্ট মান থাকবে, উদাহরণস্বরূপ, রেফারেন্স ধরণের জন্য শূন্য বা ইনসগুলির জন্য 0, তবে সেগুলি অ্যারেতে থাকবে: আপনি প্রতিটি এবং প্রতিটি সূচক করতে পারেন))

একটি তালিকা একটি পরিবর্তনীয় আকারের ধারক, এতে উপাদানগুলির সংখ্যা পরিবর্তন হতে পারে, আপনি যতটা চান 0 থেকে শুরু করে (বাস্তবায়নের সীমা সাপেক্ষে)। তৈরির পরে উপাদানগুলির সংখ্যা হয় বৃদ্ধি বা সঙ্কুচিত হতে পারে। সর্বদা আপনি তার সূচী দ্বারা যে কোনও উপাদান পুনরুদ্ধার করতে পারেন।

তবে জাভা ধারণা List আসলে একটি ইন্টারফেস এবং এটি বিভিন্নভাবে প্রয়োগ করা যেতে পারে। সুতরাং LinkedList , LinkedList ইত্যাদি উপাদানগুলিকে প্রকৃতপক্ষে ধারণ করার জন্য তালিকার "পিছনে" একটি ডাটা স্ট্রাকচার রয়েছে। এবং সেই ডেটা স্ট্রাকচারটি নিজেই স্থির আকার বা পরিবর্তনশীল আকার হতে পারে এবং যে কোনও সময় তালিকার উপাদানগুলির সংখ্যার সঠিক আকার থাকতে পারে বা এটিতে কিছু extra "বাফার" স্থান থাকতে পারে।

LinkedList , উদাহরণস্বরূপ, সর্বদা এর অন্তর্নিহিত ডেটা কাঠামোতে হ'ল "উপাদানগুলির জন্য স্থানগুলি" এর প্রতিনিধিত্ব করে সেই তালিকায় যেমন রয়েছে তেমন সংখ্যক। কিন্তু ArrayList তার ব্যাকিং স্টোর হিসাবে একটি নির্দিষ্ট দৈর্ঘ্যের অ্যারে ব্যবহার করে।

ArrayList , যে কোনও সময় তালিকার উপাদানগুলির সংখ্যা এটির পিছনে থাকা অ্যারেতে থাকা উপাদানগুলির সংখ্যার চেয়ে আলাদা হতে পারে। উপাদানগুলির জন্য "অতিরিক্ত" জায়গাগুলিতে কেবল নাল বা 0 সেগুলি বা যে কোনও কিছু থাকে তবে ArrayList আপনাকে কখনই সেই জায়গাগুলিতে অ্যাক্সেস দেয় না। আপনি ArrayList উপাদান যুক্ত করার সাথে সাথে তারা অন্তর্নিহিত অ্যারেতে আরও বেশি জায়গা নেয়, অবশেষে অন্তর্নিহিত অ্যারে পূর্ণ না হওয়া পর্যন্ত। আপনি ArrayList যুক্ত নেক্সট এলিমেন্টটির ফলে সম্পূর্ণ নতুন নির্দিষ্ট আকারের অ্যারের কারণ হয়ে যায় - "বর্তমান" অ্যারের থেকে কিছুটা বড় - বরাদ্দ দেওয়া হয়, এবং এতে লিখিত সমস্ত তালিকা উপাদান (মূল অ্যারেটি ফেলে দেওয়া হয়)। এই ব্যয়বহুল ক্রিয়াকলাপ (বরাদ্দ এবং অনুলিপি) প্রায়শই ঘটে যাওয়া থেকে রোধ করতে নতুন অ্যারে বর্তমান অ্যারের চেয়ে বড় (কোনও কারণের সাথে) থাকে এবং এর ফলে এমন উপাদান রয়েছে যা সেই সময় তালিকার উপাদানগুলিকে ধারণ করবে না - তারা খালি (নাল) বা 0)।

সুতরাং, যেহেতু (সম্ভাব্যভাবে) তালিকার প্রতিনিধিত্বকারী উপাদানগুলির সংখ্যার মধ্যে পার্থক্য রয়েছে এবং প্রয়োগকারী ডেটা স্ট্রাকচারটি যে উপাদানগুলির ধারণ করতে পারে তার সংখ্যা দুটি কার্যকর রয়েছে।

তালিকার আকার এটির উপাদানগুলির সংখ্যা। তালিকার সক্ষমতা হ'ল এই মুহুর্তে ব্যাকিং ডেটা কাঠামোটি কতগুলি উপাদান ধারণ করতে পারে is তালিকাতে উপাদান যুক্ত করা বা সরানো হওয়ায় আকারটি পরিবর্তন হবে। আপনি যে তালিকাটি ব্যবহার করছেন তার বাস্তবায়ন করার পরে ক্ষমতাটি পরিবর্তন হবে। (অবশ্যই আকারের আকার আর কখনও বড় হবে না))

(বিটিডাব্লু, স্থির আকারের ধারকগুলির জন্য আকারকে ঘন ঘন দৈর্ঘ্য বলা হয়, সুতরাং অ্যারেগুলির একটি দৈর্ঘ্যের দৈর্ঘ্য থাকে এবং স্ট্রিংগুলির একটি পদ্ধতির দৈর্ঘ্য থাকে)) বিভিন্ন ভাষা - কখনও কখনও এমনকি একই ভাষা - "আকার" এবং "দৈর্ঘ্য" অসামঞ্জস্যভাবে ব্যবহার করে তবে তারা সর্বদা অর্থ আকার , এবং "ক্ষমতা" শব্দটি সর্বদা অন্তর্নিহিত ডেটা কাঠামোর আকার / দৈর্ঘ্যের জন্য ব্যবহৃত হয়))





arraylist