কেন জাভা ভেক্টর (এবং স্ট্যাক) শ্রেণিকে অপ্রচলিত বা অবমূল্যায়ন হিসাবে বিবেচনা করা হয়?


677

জাভা ভেক্টরকে কেন কোনও উত্তরাধিকার শ্রেণি, অপ্রচলিত বা অবমূল্যায়ন হিসাবে বিবেচনা করা হয়?

সমঝোতার সাথে কাজ করার সময় কি এর ব্যবহার বৈধ নয়?

এবং যদি আমি অবজেক্টগুলিকে ম্যানুয়ালি সিঙ্ক্রোনাইজ করতে না চাই এবং কেবল অন্তর্নিহিত অ্যারের (যেমন CopyOnWriteArrayListআছে) এর নতুন কপিগুলি তৈরি না করেই থ্রেড-নিরাপদ সংগ্রহটি ব্যবহার করতে চাই , তবে এটি ব্যবহার করা ভাল Vector?

কি সম্পর্কে Stack, যা একটি সাবক্লাস Vector, আমি এর পরিবর্তে আমার কী ব্যবহার করা উচিত?


এগুলি অপ্রচলিত, তবে এগুলি অবমানিত নয়।
মারকুইস

উত্তর:


655

Vectorপ্রতিটি স্বতন্ত্র অপারেশনে সিঙ্ক্রোনাইজ করে। এটি আপনি যা করতে চান তা প্রায় কখনও নয়।

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

অবশ্যই, এটির প্রয়োজন নেই এমনকী এটির লকিংয়ের ওভারহেডও রয়েছে।

মূলত, বেশিরভাগ পরিস্থিতিতে এটি সুসংগতকরণের জন্য একটি ত্রুটিযুক্ত পদ্ধতি। মিঃ ব্রায়ান হেন্ক যেমন উল্লেখ করেছেন, আপনি কলগুলি ব্যবহার করে একটি সংগ্রহকে সাজিয়ে তুলতে পারেন Collections.synchronizedList- Vector"" প্রতিটি ক্রিয়াকলাপটি সিঙ্ক্রোনাইজ করুন "বিটের সাথে" পুনরায় আকারিত অ্যারে "সংগ্রহের বাস্তবায়ন উভয়ের সংমিশ্রণের বিষয়টি দুর্বল ডিজাইনের আরেকটি উদাহরণ; সজ্জা পদ্ধতির উদ্বেগের পরিষ্কার বিচ্ছিন্নতা দেয়।

Stackসমতুল্য হিসাবে - আমি Deque/ ArrayDequeদিয়ে শুরু দেখতে চাই ।


108
"সাধারণত আপনি ক্রিয়াকলাপের পুরো ক্রমটি সিঙ্ক্রোনাইজ করতে চান" " - এটাই হচ্ছে মাধ্যম! ধন্যবাদ!
fjsj

7
জাভা কোন সংস্করণে অবহেলিত ভেক্টর (বর্তমানে আমি জাভা 7 ব্যবহার করেছি) .কিন্তু আমি কখনও হতাশ হিসাবে দেখি না? বিদায় ওয়ে সুন্দর ব্যাখ্যা ... + 1
সমির মাঙ্গরোলিয়া

17
@ সমীর: এটি সরকারীভাবে অবহেলিত নয় - এটি কেবলমাত্র অ্যারেলিস্টকেই সাধারণত পছন্দ করা হয়।
জন স্কিটি

26
@ সমীর: না, আমি ভবিষ্যতের পূর্বাভাস দেওয়ার চেষ্টা করব না।
জন স্কিটি

5
খালি gr8। ভেক্টর অবচিত করা হয় না তার একটি উত্তরাধিকার class.There অবচিত এবং উত্তরাধিকার এবং হ্যাঁ আছে দেখতে মধ্যে পার্থক্য হতে হবে stackoverflow.com/questions/2873254/...
প্রশান্ত Shilimkar

82

ভেক্টর ছিল 1.0 এর অংশ - আসল বাস্তবায়নের দুটি ত্রুটি ছিল:

1. নামকরণ: ভেক্টরগুলি কেবলমাত্র তালিকাগুলি যা অ্যারে হিসাবে অ্যাক্সেস করা যায় তাই এটি বলা উচিত ছিল ArrayList(যা জাভা ১.২ সংগ্রহের প্রতিস্থাপন Vector)।

2. concurrency: সব get(), set()পদ্ধতি synchronized, তাই আপনি জরিমানা সিঙ্ক্রোনাইজেশন নিয়ন্ত্রণ গ্রেনেড আছে করতে পারবে না।

ArrayListএবং এর মধ্যে খুব বেশি পার্থক্য নেই Vector, তবে আপনার ব্যবহার করা উচিত ArrayList

এপিআই ডক থেকে

জাভা 2 প্ল্যাটফর্ম v1.2 হিসাবে, এই শ্রেণিটি জাভা সংগ্রহের ফ্রেমওয়ার্কের সদস্য হয়ে তালিকার ইন্টারফেস বাস্তবায়নের জন্য পুনরায় প্রবর্তিত হয়েছিল। নতুন সংগ্রহ বাস্তবায়নের বিপরীতে ভেক্টর সিঙ্ক্রোনাইজ করা হয়েছে।


অ্যারে হিসাবে অ্যাক্সেস করা যায় যা তালিকা? অ্যারেলিস্ট খুব ছোট বা আকর্ষণীয় নাম নয়, এটি কারণেই ভেক্টর অন্য কোথাও ব্যবহৃত হয় (যেমন এসটিএল)।
ধরি

6
@ ধড়ির তালিকাটি এর অন্তর্নিহিত বাস্তবায়ন হিসাবে একটি অ্যারের সাথে তালিকাবদ্ধ করুন। আছে ArrayList, LinkedListযা সব ইন্টারফেস বাস্তবায়ন ইত্যাদি List, তাই আপনি যদি ব্যবহার করতে চান Listজানতে অন্তর্নিহিত বাস্তবায়ন আসলে কি আপনি শুধুমাত্র একটি গ্রহণ করতে পারেন করেও পদ্ধতি Listইত্যাদি পদ্ধতি একটি প্যারামিটার, তবে সেখানকার প্রয়োগকারীদের জন্য প্রযোজ্য যেমন Mapইত্যাদি। এদিকে, সি ++ এর একটি std::arrayবর্গ রয়েছে যা সি-স্টাইলের স্ট্যাটিক দৈর্ঘ্যের অ্যারেগুলির জন্য কেবলমাত্র একটি টেম্পলেট-ভিত্তিক প্রতিস্থাপন।
জাব

41

ভেক্টর ব্যবহার সম্পর্কে ইতিমধ্যে বর্ণিত উত্তরগুলি ছাড়াও, ভেক্টরের গণনা এবং উপাদান পুনরুদ্ধারের চারপাশে প্রচুর পদ্ধতি রয়েছে যা তালিকা ইন্টারফেসের চেয়ে আলাদা এবং বিকাশকারীরা (বিশেষত যাঁরা জাভা শিখেছিলেন ১.২ এর আগে) তারা যদি সেগুলিতে থাকে তবে সেগুলি ব্যবহার করার প্রবণতা থাকতে পারে কোড। যদিও গণনাগুলি দ্রুততর, তবুও তারা পরীক্ষা করে না যে সংগ্রহটি পুনরাবৃত্তির সময় পরিবর্তন করা হয়েছিল, যা সমস্যার কারণ হতে পারে এবং ভেক্টরকে এটির সিঙ্ক্রোনাইজেশনের জন্য বেছে নেওয়া যেতে পারে - একাধিক থ্রেড থেকে অ্যাটেন্ডেন্ট অ্যাক্সেসের ফলে এটি এটিকে একটি বিশেষ ক্ষতিকারক সমস্যা হিসাবে পরিণত করে। এই পদ্ধতির ব্যবহারটি ভেক্টরকে প্রচুর কোডও দম্পতি করে, যেমন এটি কোনও ভিন্ন তালিকা প্রয়োগের সাথে প্রতিস্থাপন করা সহজ হবে না।


14

কোনও থ্রেড-নিরাপদ থেকে থ্রেড-নিরাপদ সংগ্রহ পেতে আপনি সিঙ্ক্রোনাইজডjava.util.Collection কালেকশন / তালিকা পদ্ধতিটি ব্যবহার করতে পারেন ।


2
কেন এটি ভেক্টরের চেয়ে ভাল?
fjsj

8
জোন যেমন উল্লেখ করেছেন, ভেক্টরও তত ভাল পারফর্ম করবে না এবং এই পদ্ধতিটি আপনাকে সিঙ্ক্রোনাইজেশন করার জন্য যখন একটি ভাল ধারণা হয় তা চয়ন করতে দেয়। এটি সম্পূর্ণরূপে একটি ডিজাইনের সমস্যা। আপনার ভ্যাক্টারের ওপরে আরেলিস্ট ব্যবহার করা উচিত কারণ আপনার অ-সিঙ্ক্রোনাইজড অ্যাক্সেসে ডিফল্ট হওয়া উচিত।
ব্রায়ান হেন্ক

কিভাবে এই প্রশ্নের উত্তর দেয়?
মারকুইস

8

java.util.Stackসিঙ্ক্রোনাইজেশন ওভারহেড উত্তরাধিকার সূত্রে প্রাপ্ত হয় java.util.Vector, যা সাধারণত ন্যায়সঙ্গত হয় না।

যদিও এর থেকে অনেক বেশি উত্তরাধিকার সূত্রে প্রাপ্ত। সত্য যে java.util.Stack extends java.util.Vectorঅবজেক্ট ওরিয়েন্টেড নকশা একটি ভুল। পুরিস্টরা লক্ষ্য করবেন যে এটি স্ট্যাকের সাথে traditionতিহ্যগতভাবে সংযুক্ত অপারেশনগুলির বাইরেও প্রচুর পদ্ধতি সরবরাহ করে (যথা: পুশ, পপ, পিক, আকার)। এছাড়া করতে সম্ভব search, elementAt, setElementAt, remove, এবং অন্যান্য অনেক র্যান্ডম অ্যাক্সেস অপারেশন। এটি মূলত ব্যবহারকারীর উপর নির্ভর করে এটির স্ট্যাক নন-স্ট্যাক অপারেশন ব্যবহার করা থেকে বিরত থাকুন Stack

এই পারফরম্যান্স এবং ওওপি ডিজাইনের কারণে, জাভাডকjava.util.StackArrayDeque প্রাকৃতিক প্রতিস্থাপন হিসাবে প্রস্তাব দেয়। (একটি ডেকা স্ট্যাকের চেয়ে বেশি, তবে কমপক্ষে এটি দুটি প্রান্তে হ্যান্ডেলগুলি সীমাবদ্ধ না করে বরং সবকিছুতে এলোমেলো অ্যাক্সেসের প্রস্তাব দেয়))

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