Collection در جاوا؛ انواع، ویژگی و نحوه بهینه‌سازی 

Collection در جاوا؛ انواع، ویژگی و نحوه بهینه‌سازی 

نوشته شده توسط: تیم فنی نیک آموز
تاریخ انتشار: ۱۹ مهر ۱۴۰۳
آخرین بروزرسانی: ۱۸ مهر ۱۴۰۳
زمان مطالعه: 18 دقیقه
۱
(۱)

Collection در جاوا برای برنامه‌نویس مثل یک جعبه‌ابزار برای برق‌کار است؛ همان‌قدر ضروری، کاربردی و با ابزارهای متنوع. این ساختارهای داده‌ای قدرتمند به شما امکان می‌دهند اطلاعاتتان را به‌سادگی و به‌طور کارآمد سازماندهی کنید. در این مقاله، با انواع مختلف Collection، ویژگی‌، کاربرد و نحوه استفاده از آن‌ها آشنا خواهیم شد. اگر به فکر قدرت بخشیدن به مهارت برنامه‌نویسی خود در جاوا هستید، این مطلب راهنمای شما خواهد بود.

تعریف Collection و اهمیت استفاده از آن در برنامه نویسی

فریم‌ورک Collection یک بسته نرم‌افزاری در جاوا به‌نام  java.util بوده که شامل تمام کلاس‌ها و رابط‌های موردنیاز برای مدیریت موثر داده‌ها است؛ شبیه به یک جعبه ابزاری که ابزارهای مختلفی برای مرتب‌سازی و دسته‌بندی اطلاعات در اختیار شما قرار می‌دهد. 

مفاهیم پایه‌ ای Collection در جاوا 

Collection در جاوا از چهار جزء اصلی تشکیل شده است:

۱. رابط‌ها (Interfaces)

این رابط‌ها، قوانین کلی برای نحوه‌ سازماندهی داده‌ها را تعریف می‌کنند. درست مثل برچسب‌ روی قفسه‌ که نوع وسایل موجود را مشخص می‌کنند، رابط‌ها هم به شما می‌گویند که هر Collection در جاوا باید چه ویژگی‌هایی داشته باشد.

۲. پیاده‌سازی‌ ها (Implementations)

این پیاده‌سازی‌، همان قفسه‌های فیزیکی هستند که براساس نوع داده‌ها، آن‌ها را به شکل‌های مختلفی سازماندهی می‌کنند. مثلا یک قفسه با طبقات متعدد برای کتاب‌ها مناسب است، درحالی‌که برای نگهداری ابزار، به قفسه‌ای با قلاب و محفظه نیاز داریم. در فریم‌ورک Collection در جاوا نیز پیاده‌سازی‌های مختلفی وجود دارند که هر کدام برای نوع خاصی از داده‌ها مناسب هستند.

۳. الگوریتم‌ ها (Algorithms)

این الگوریتم‌ها، حکم دستیارهای حرفه‌ای انبار را دارند. آن‌ها با روش‌های کارآمد، به شما کمک می‌کنند تا داده‌ها را مرتب‌، جستجو و مدیریت کنید. درست مثل اینکه دستیار انبار می‌داند برای پیدا کردن یک وسیله‌ خاص، باید به کدام قفسه مراجعه کند، الگوریتم‌ها هم می‌دانند برای انجام عملیات مختلف روی داده‌ها، باید از کدام روش استفاده کنند.

۴. کلاس (Class)

کلاس شبیه به یک الگو یا نقشه اولیه است که براساس آن، آبجکت ساخته می‌شوند. فرض کنید می‌خواهید آبجکت‌های مختلفی از نوع «دانشجو» ایجاد کنید. با تعریف یک کلاس «دانشجو»، مشخص می‌کنید که هر دانشجو چه ویژگی‌هایی (مثل نام، رشته تحصیلی و غیره) دارد.

متدهای Collection در جاوا

رابط Collection در جاوا، مجموعه‌ای از روش‌های کاربردی را برای مدیریت داده‌ها در اختیار شما قرار می‌دهد. در جدول زیر، با برخی از این متدها آشنا می‌شوید:

 

ردیف  روش  شرح
۱ add(E e) این روش برای اضافه کردن یک عنصر به Collection شما کاربرد دارد.
۲ addAll(Collection<? extends E> c) با این روش می‌توانید تمام عناصر یک Collection دیگر را به Collection خودتان منتقل کنید.
۳ remove(Object element) اگر عنصر خاصی را دیگر نمی‌خواهید، با این روش می‌توانید آن را از Collection حذف کنید.
۴ removeAll(Collection<?> c) گاهی اوقات می‌خواهید یک Collection کامل از ابزارها را از Collection خودتان پاک کنید. این روش برای همین منظور طراحی شده است.
۵ removeIf(Predicate<? super E> filter) با این روش قدرتمند، می‌توانید Collection خود را از تمام عناصری که یک شرط خاص را برآورده نمی‌کنند، پاک‌ کنید.
۶ retainAll(Collection<?> c) برعکس روش قبل، با این روش می‌توانید فقط عناصری را نگه دارید که در Collection دیگر هم وجود دارند.
۷ size() کنجکاو هستید که ببینید چند عنصر (ابزار) در Collection شما وجود دارد؟ این روش تعداد کل عناصر را به شما نشان می‌دهد.
۸ clear() اگر می‌خواهید Collection خود را کاملا خالی کنید و از تمام عناصر خلاص شوید، این روش به کارتان می‌آید.
۹ contains(Object element) با این روش می‌توانید دنبال یک عنصر خاص در Collection خودتان بگردید.
۱۰ containsAll(Collection<?> c) این روش هم به جستجو کمک می‌کند، اما به دنبال این است که ببیند آیا تمام عناصر یک Collection دیگر در Collection شما وجود دارند یا نه.
۱۱ iterator() این روش یک (iterator) برای شما ایجاد می‌کند که می‌توانید با استفاده از آن، تک تک عناصر Collection را بررسی و با آن‌ها کار کنید.
۱۲ toArray() با این روش می‌توانید Collection خود را به یک آرایه تبدیل کنید. این کار زمانی مفید است که نیاز دارید داده‌ها را به‌شکل دیگری سازماندهی کنید.
۱۳ toArray(T[] a) این روش هم به تبدیل به آرایه کمک می‌کند؛ با این تفاوت که می‌توانید نوع آرایه خروجی را هم مشخص کنید.
۱۴ isEmpty() با یک سوال ساده، این روش به شما می‌گوید که آیا Collection شما خالی است یا نه.
۱۵ parallelStream() این روش کمی پیشرفته‌تر است و یک جریان موازی از عناصر Collection را برای شما ایجاد می‌کند. این جریان برای پردازش سریع داده‌ها کاربرد دارد.
۱۶ stream() این روش هم یک جریان ترتیبی از عناصر Collection را ایجاد می‌کند که برای پردازش تک‌به‌تک داده‌ها مفید است.
۱۷ spliterator() این روش یک «تقسیم‌کننده» (spliterator) برای Collection ایجاد می‌کند که برای پردازش موازی داده‌ها در سطح پایین‌تر کاربرد دارد.
۱۸ equals(Object element) با این روش می‌توانید دو Collection را با هم مقایسه کنید و ببینید که آیا عناصر آن‌ها کاملا یکسان هستند یا نه.
۱۹ hashCode() این روش یک کد هش برای Collection شما برمی‌گرداند

 

انواع Collection‌ در جاوا

رابط Collection در جاوا ستون فقرات فریم‌ورک Collection است. این رابط، مجموعه‌ای از روش‌ها (متدها) را تعریف می‌کند که هر گروه از اطلاعات باید داشته باشد. به عبارتی، Collection Interface قوانین و قواعدی را مشخص می‌کند که همه Collectionها باید از آن پیروی کنند. در ادامه، با انواع Collection‌ در جاوا آشنا خواهید شد:

List Interface

تصور کنید می‌خواهید فهرستی از کتاب‌های مورد علاقه‌تان را تهیه کرده یا ترتیب پخش آهنگ‌های موردنظر خود را مشخص کنید. در این‌جا، به ابزاری قدرتمند در دنیای برنامه‌نویسی جاوا به نام List Interface برمی‌خوریم. رابط لیست، زیرمجموعه‌ای از رابط Collection در جاوا است. این رابط به شما امکان می‌دهد مجموعه‌ای مرتب از آبجکت‌ها را مدیریت کنید. در این لیست، می‌توانید هر نوع داده‌ای را قرار دهید، حتی اگر مقادیر تکراری وجود داشته باشند.

رابط لیست مثل یک قانون کلی است که مشخص می‌کند لیست‌ها باید چه ویژگی‌هایی داشته باشند. چند نمونه از سربازان بااستعداد این رابط، کلاس‌های ArrayList، LinkedList، Vector و Stack هستند. برای اینکه لیست خودتان را بسازید، کافی است از کلمه کلیدی new به همراه یکی از کلاس‌های عضو خانواده‌ لیست (مثلا ArrayList) و نوع داده‌ای که می‌خواهید در آن ذخیره شود، استفاده کنید. در اینجا مثالی برای درک بهتر آوردیم:

 

List<String> myBooks = new ArrayList<>(); // لیستی برای ذخیره‌ی نام کتاب‌ها
List<Integer> myNumbers = new LinkedList<>(); // لیستی برای ذخیره‌ی اعداد صحیح

 

پس از ساختن لیست می‌توانید اطلاعات به آن اضافه یا از آن کم کنید.

ArrayList

ArrayList کلاسی است که رابط List را پیاده‌سازی کرده و از یک آرایه‌ پویا برای ذخیره اطلاعات استفاده می‌کند. یعنی هروقت بخواهید، به لیستتان می‌توانید اطلاعات جدید اضافه کرده یا اطلاعات قبلی را حذف کنید. علاوه‌براین، ArrayList انواع مختلفی از اطلاعات مثل متن، عدد، یا حتی آبجکت‌های پیچیده‌تر را در خود نگه می‌دارد. همچنین، ترتیب اضافه‌کردن اطلاعات هم حفظ می‌شود و به هر کدام از اطلاعات به‌صورت جداگانه با یک شماره‌ (index) دسترسی خواهید داشت. در مثال زیر، نحوه‌ ایجاد و کار با یک ArrayList را می‌بینید:

 

import java.util.*;  
class TestJavaCollection1{  
public static void main(String args[]){  
ArrayList<String> list=new ArrayList<String>();//Creating arraylist  
list.add("Ravi");//Adding object in arraylist  
list.add("Vijay");  
list.add("Ravi");  
list.add("Ajay");  
//Traversing list through Iterator  
Iterator itr=list.iterator();  
while(itr.hasNext()){  
System.out.println(itr.next());  
}  
}  
}  

 

خروجی به‌صورت زیر خواهد بود:

 

Ravi
Vijay
Ravi
Ajay

 

LinkedList

اولین ویژگی کلیدی LinkedList، امکان ذخیره عناصر تکراری است. برخلاف Set که هر عنصر را فقط یک بار نگه می‌دارد، LinkedList با آغوش باز از تکرارها استقبال می‌کند. دومین ویژگی این عنصر Collection در جاوا حفظ ترتیب است. LinkedList به‌ترتیبی که عناصر را به آن اضافه می‌کنید، آن‌ها را به‌خاطر می‌سپارد و براساس همان ترتیب نمایش می‌دهد. سومین نکته قابل توجه، غیرهمزمان بودن (non-synchronized) بودن LinkedList است. یعنی چندین رشته (thread) نمی‌توانند به‌طور همزمان LinkedList را تغییر دهند. درصورت نیاز به چنین قابلیتی، باید سراغ گزینه‌های دیگر بروید. 

نگاهی به مثال زیر بیندازید:

 

import java.util.*;  
class TestJavaCollection1{  
public static void main(String args[]){  
ArrayList<String> list=new ArrayList<String>();//Creating arraylist  
list.add("Ravi");//Adding object in arraylist  
list.add("Vijay");  
list.add("Ravi");  
list.add("Ajay");  
//Traversing list through Iterator  
Iterator itr=list.iterator();  
while(itr.hasNext()){  
System.out.println(itr.next());  
}  
}  
}  

 

خروجی به‌صورت زیر است:

 

Ravi
Vijay
Ravi
Ajay

 

Vector

در دنیای Collection در جاوا، Vector ابزاری کارآمد برای ذخیره و سازماندهی اطلاعات به‌صورت گروهی است. وکتور از یک آرایه پویا برای ذخیره‌سازی عناصر داده استفاده می‌کند و شباهت‌ زیادی به “آرایه‌لیست” (ArrayList) دارد. البته وکتور یک ویژگی کلیدی را به‌همراه دارد که آن را از آرایه‌لیست متمایز می‌کند: «همگام‌سازی» (Synchronization). با این قابلیت وکتور از دسترسی همزمان چندین رشته (Thread) به داده‌ها به‌طور امن جلوگیری و از بروز خطاهای ناشی از تداخل در دسترسی به داده‌ها پیشگیری می‌کند.

علاوه‌براین، وکتور مجموعه‌ای از روش‌ها را ارائه می‌دهد که در «Collection Framework» جاوا موجود نیستند. این روش‌ها امکانات بیشتری را برای کار با داده‌ها در وکتور فراهم می‌کنند.

 

import java.util.*;  
public class TestJavaCollection3{  
public static void main(String args[]){  
Vector<String> v=new Vector<String>();  
v.add("Ayush");  
v.add("Amit");  
v.add("Ashish");  
v.add("Garima");  
Iterator<String> itr=v.iterator();  
while(itr.hasNext()){  
System.out.println(itr.next());  
}  
}  
}  

 

خروجی به‌صورت زیر است:

 

Ayush
Amit
Ashish
Garima

 

Stack

کلاس Stack در Collection جاوا ساختار داده‌ای استک را مدل‌سازی و پیاده‌سازی می‌کند. این کلاس براساس اصل «آخرین ورودی، اولین خروجی» (LIFO) عمل می‌کند. علاوه‌بر عملیات‌های اولیه (push) و (pop)، این کلاس سه عملکرد دیگر نیز ارائه می‌دهد: (empty)، (search) و (peek). همچنین می‌توان به کلاس استک به عنوان ساب‌کلاسی از کلاس Vector اشاره کرد. مثال نحوه استفاده از این نوع Collection در جاوا را می‌بینید:

 

// Java program to demonstrate the
// working of a stack
import java.util.*;
public class GFG {
    // Main Method
    public static void main(String args[])
    {
        Stack<String> stack = new Stack<String>();
        stack.push("Nikamooz");
        stack.push("For");
        stack.push("Nikamooz");
        stack.push("Nikamooz");
        // Iterator for the stack
        Iterator<String> itr = stack.iterator();
        // Printing the stack
        while (itr.hasNext()) {
            System.out.print(itr.next() + " ");
        }
        System.out.println();
        stack.pop();
        // Iterator for the stack
        itr = stack.iterator();
        // Printing the stack
        while (itr.hasNext()) {
            System.out.print(itr.next() + " ");
        }
    }
}

 

خروجی 

 

Nikamooz For Nikamooz Nikamooz 
Nikamooz For Nikamooz

 

Queue

همانطور که از نامش پیداست، رابط Queue ترتیب «اولین ورودی، اولین خروجی» (FIFO) را مشابه صف دنیای واقعی حفظ می‌کند. این رابط برای ذخیره عناصری طراحی شده است که در آن‌ها ترتیب اهمیت دارد. برای مثال، هر زمان که سعی می‌کنیم بلیط رزرو کنیم، بلیط‌ها به صورت «اول آمده، اول دریافت می‌شود» فروخته می‌شوند. بنابراین، فردی که درخواستش زودتر وارد صف می‌شود، بلیط را دریافت می‌کند. کلاس‌های مختلفی مانند Priority Queue و ArrayDeque وجود دارند که از این رابط ارث‌بری می‌برند (implement). از آنجایی که همه این زیرمجموعه‌ها، رابط Queue را پیاده‌سازی می‌کنند، یک آبجکت Queue را با هر یک از این کلاس‌ها ایجاد کنیم. به عنوان مثال:

 

 

Queue <T> pq = new PriorityQueue<> (); 
Queue <T> ad = new ArrayDeque<> (); 
که در آن T نوع آبجکت است.

 

صف اولویت‌ دار (PriorityQueue)

از PriorityQueue زمانی استفاده می‌شود که آبجکت‌های Collection در جاوا باید براساس اولویت پردازش شوند. گاهی اوقات نیاز است تا عناصر Queue براساس اولویت پردازش شوند؛ دراین‌موارد، از این کلاس استفاده می‌شود. PriorityQueue براساس priority heap عمل می‌کند. عناصر PriorityQueue براساس ترتیب طبیعی یا Comparator که در زمان ساخت Queue ارائه می‌شود، مرتب می‌شوند. PriorityQueue را با یک مثال بهتر متوجه خواهید شد:

 

// Java program to demonstrate the working of
// priority queue in Java
import java.util.*;
class GfG {
    // Main Method
    public static void main(String args[])
    {
        // Creating empty priority queue
        PriorityQueue<Integer> pQueue
            = new PriorityQueue<Integer>();
        // Adding items to the pQueue using add()
        pQueue.add(10);
        pQueue.add(20);
        pQueue.add(15);
        // Printing the top element of PriorityQueue
        System.out.println(pQueue.peek());
        // Printing the top element and removing it
        // from the PriorityQueue container
        System.out.println(pQueue.poll());
        // Printing the top element again
        System.out.println(pQueue.peek());
    }
}

 

خروجی:

 

۱۰
۱۰
۱۵

 

رابط Deque

Queue در جاوا ساختارهای مفیدی است، اما گاهی اوقات نیاز داریم انعطاف‌پذیری بیشتری داشته باشیم. رابط Deque که به عنوان «صف دوطرفه» نیز شناخته می‌شود، این انعطاف‌پذیری را برای ما فراهم می‌کند. برخلاف Queue معمولی که تنها امکان حذف و اضافه از یک انتها را می‌دهند، Deque به ما این امکان را می‌دهد که عناصر را از هر دو انتهای صف، یعنی هم از ابتدا و هم از انتها، اضافه یا حذف کنیم. این رابط، (Queue) را گسترش می‌دهد. کلاس ArrayDeque پیاده‌سازی رایج رابط Deque است. برای ایجاد یک آبجکت از نوع Deque، می‌توانیم از این کلاس استفاده کنیم.

مثال:

 

Deque<String> myTasks = new ArrayDeque<>();

 

در این مثال، myTasks یک صف دوطرفه از نوع String است.

کلاس ArrayDeque

کلاس ArrayDeque که در فریم‌ورک Collection در جاوا قرار گرفته است، روشی برای استفاده از آرایه‌های قابل ری‌سایز را به ما ارائه می‌دهد. این آرایه، نوع خاصی از آرایه است که قابلیت افزایش اندازه دارد و به کاربر اجازه می‌دهد تا عنصری را از هر دو طرف صف اضافه یا حذف کند. صف‌های آرایه‌ای هیچ محدودیتی در ظرفیت ندارند و درصورت نیاز برای پشتیبانی از استفاده، به‌طور خودکار رشد می‌کنند.

 

// Java program to demonstrate the

// ArrayDeque class in Java
import java.util.*;
public class ArrayDequeDemo {
    public static void main(String[] args)
    {
        // Initializing an deque
        ArrayDeque<Integer> de_que
            = new ArrayDeque<Integer>(10);
        // add() method to insert
        de_que.add(10);
        de_que.add(20);
        de_que.add(30);
        de_que.add(40);
        de_que.add(50);
        System.out.println(de_que);
        // clear() method
        de_que.clear();
        // addFirst() method to insert the
        // elements at the head
        de_que.addFirst(564);
        de_que.addFirst(291);
        // addLast() method to insert the
        // elements at the tail
        de_que.addLast(24);
        de_que.addLast(14);
        System.out.println(de_que);
    }
}

 

خروجی

 

[۱۰, ۲۰, ۳۰, ۴۰, ۵۰]
[۲۹۱, ۵۶۴, ۲۴, ۱۴]

 

رابط Set

فرض کنید قصد دارید مجموعه‌ای از کتاب‌های موردعلاقه خود را ایجاد کنید، اما نمی‌خواهید کتاب‌های تکراری در لیست شما وجود داشته باشد. دراین‌صورت، سراغ رابط Set در جاوا می‌رویم. رابط Set در فریم‌ورک Collection در جاوا مجموعه‌ای بدون ترتیب از آبجکت‌هایی است که در آن امکان ذخیره مقادیر تکراری وجود ندارد. این رابط برای موقعیت‌هایی کاربرد دارد که فقط می‌خواهید روی داده‌های منحصربه‌فرد تمرکز کرده و از تکرار آن‌ها جلوگیری کنید.

رابط Set توسط کلاس‌های مختلفی مانند HashSet، TreeSet و LinkedHashSet پیاده‌سازی می‌شود. از آنجایی که همه این زیرمجموعه‌ها، رابط Set را پیاده‌سازی می‌کنند، شما می‌توانید با هر یک از این کلاس‌ها، یک شیء Set ایجاد کنید.

برای مثال:

 

Set<T> hs = new HashSet<> (); 
Set<T> lhs = new LinkedHashSet<> (); 
Set<T> ts = new TreeSet<> (); 
.  

 

در اینجا T یک آبجکت است.

معرفی کلاس HashSet

در دنیای Collection در جاوا، کلاس HashSet یکی از اعضای کلیدی مجموعه Set بوده و پیاده‌سازی داخلی ساختار داده‌ جدول هش (hash table) را برعهده دارد. برخلاف برخی از Collectionها، HashSet ترتیب اضافه شدن عناصر را تضمین نمی‌کند. درعوض، عناصر براساس یک کد منحصربه‌فرد به نام “کد هش” (hashCode) در این مجموعه قرار می‌گیرند. نکته‌ جالب دیگر این است که HashSet به شما اجازه می‌دهد تا عنصر null را نیز در مجموعه خود جای دهید. با یک مثال، با نحوه‌ کار HashSet بیشتر آشنا خواهیم شد:

 

// Java program to demonstrate the
// working of a HashSet
import java.util.*;
public class HashSetDemo {
    // Main Method
    public static void main(String args[])
    {
        // Creating HashSet and
        // adding elements
        HashSet<String> hs = new HashSet<String>();
        hs.add("Nikamooz");
        hs.add("For");
        hs.add("Nikamooz");
        hs.add("Is");
        hs.add("Very helpful");
        // Traversing elements
        Iterator<String> itr = hs.iterator();
        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
    }
}

 

خروجی

 

Very helpful
Nikamooz
For
Is

 

LinkedHashSet

LinkedHashSet شباهت زیادی به HashSet دارد، با این تفاوت که برای ذخیره‌سازی داده‌ها از یک لیست دوطرفه پیوندی استفاده می‌کند و ترتیب عناصر را حفظ می‌کند.

 

// Java program to demonstrate the
// working of a LinkedHashSet
import java.util.*;
public class LinkedHashSetDemo {
    // Main Method
    public static void main(String args[])
    {
        // Creating LinkedHashSet and
        // adding elements
        LinkedHashSet<String> lhs
            = new LinkedHashSet<String>();
        lhs.add("Nikamooz");
        lhs.add("For");
        lhs.add("Nikamooz");
        lhs.add("Is");
        lhs.add("Very helpful");
        // Traversing elements
        Iterator<String> itr = lhs.iterator();
        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
    }
}

 

خروجی به‌صورت زیر خواهد بود:

 

Nikamooz
For
Is
Very helpful

 

 رابط SortedSet 

رابط SortedSet به رابط Set شبیه است. با این تفاوت که رابط SortedSet متدهای اضافی برای حفظ ترتیب عناصر ارائه می‌دهد. رابط SortedSet، زیرمجموعه رابط Set است و برای مدیریت داده‌هایی به‌کار می‌رود که نیاز به مرتب‌سازی دارند. فقط یک کلاس به نام TreeSet رابط SortedSet را پیاده‌سازی می‌کند. از آنجایی که TreeSet این رابط را پیاده‌سازی کرده است، با استفاده از این کلاس Collection در جاوا می‌توانیم یک آبجکت از نوع SortedSet بسازیم. برای مثال:

 

SortedSet<T> ts = new TreeSet<>();

 

در این مثال، T نشان‌دهنده نوع داده‌ای است که می‌توان در مجموعه قرار داد.

TreeSet

کلاس TreeSet در جاوا از یک ساختار درختی برای ذخیره عناصر استفاده می‌کند. مرتب‌سازی عناصر در این مجموعه براساس ترتیب طبیعی آن‌ها انجام می‌شود. منظور از ترتیب طبیعی، ترتیبی است که خود آبجکت تعریف می‌کند (مثلاً ترتیب حروف الفبا برای رشته‌ها یا ترتیب عددی برای اعداد). این ترتیب حتی درصورتی که از یک Comparator مشخص استفاده نشود، همچنان اعمال خواهد شد. البته ترتیب طبیعی باید با روش equals سازگار باشد تا پیاده‌سازی رابط Set به‌درستی انجام شود.

برای مثال:

 

// Java program to demonstrate the

// working of a TreeSet

import java.util.*;




public class TreeSetDemo {
    // Main Method
    public static void main(String args[])
    {
        // Creating TreeSet and
        // adding elements
        TreeSet<String> ts = new TreeSet<String>();
        ts.add("Nikamooz");
        ts.add("For");
        ts.add("Nikamooz");
        ts.add("Is");
        ts.add("Very helpful");
        // Traversing elements
        Iterator<String> itr = ts.iterator();
        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
    }
}

 

خروجی

 

For
Nikamooz
Is
Very helpful

 

رابط Map

در دنیای برنامه‌نویسی جاوا، برای سازماندهی و مدیریت داده‌ها، از رابط قدرتمندی به نام Map استفاده می‌شود. Map برخلاف دیگر انواع Collection در جاوا اطلاعات را به‌صورت زوج‌های کلید-مقدار ذخیره می‌کند. تصور کنید می‌خواهید دفتری از لغات انگلیسی با ترجمه فارسی آن‌ها داشته باشید. در این دفتر، هر کلمه انگلیسی یک کلید است و ترجمه فارسی آن، مقدار مرتبط با آن کلید است.

رابط Map این ویژگی کلیدی را ارائه می‌دهد و به شما امکان می‌دهد داده‌ها را بر اساس کلیدهایشان سازماندهی کنید. نکته مهم این است که هر کلید در یک Map باید منحصربه‌فرد باشد؛ یعنی نمی‌توانید چندین مقدار مختلف را به یک کلید اختصاص دهید. بااین‌حال، می‌توانید مقادیر تکراری را با کلیدهای مختلف داشته باشید.

رابط Map توسط کلاس‌های مختلفی مانند HashMap و TreeMap پیاده‌سازی می‌شود. از آنجایی که همه این زیرمجموعه‌ها، رابط Map را پیاده‌سازی می‌کنند، می‌توانید یک شیء Map را با هر یک از این کلاس‌ها ایجاد کنید.

به عنوان مثال:

 

Map<T> hm = new HashMap<> (); 
Map<T> tm = new TreeMap<> ();

 

در اینجا، T نشان‌دهنده نوع داده‌ای است که می‌توانید برای کلید و مقدار در Map خود استفاده کنید.

HashMap

HashMap یکی از پیاده‌سازی‌های بنیادی رابطه‌ Map در جاواست. این ساختار قدرتمند، داده‌ها را به‌صورت زوج‌های «کلید-مقدار» ذخیره می‌کند. برای دستیابی به یک «مقدار» خاص در HashMap، باید «کلید» مربوط به آن را بدانیم. HashMap از تکنیکی به نام «hashCode» استفاده می‌کند. Hash کردن، روشی است که رشته‌های طولانی را به رشته‌های کوتاه‌تری تبدیل می‌کند تا معرف همان رشته‌ی اصلی باشند. این کار باعث می‌شود جستجو و دسترسی به داده‌ها در HashMap بسیار سریع‌تر انجام شود. جالب است بدانید که HashSet نیز در بخش داخلی خود از HashMap بهره می‌برد. برای مثال:

 

// Java program to demonstrate the
// working of a HashMap
import java.util.*;
public class HashMapDemo {
    // Main Method
    public static void main(String args[])
    {
        // Creating HashMap and
        // adding elements
        HashMap<Integer, String> hm
            = new HashMap<Integer, String>();
        hm.put(1, "Nikamooz");
        hm.put(2, "For");
        hm.put(3, "Nikamooz");
        // Finding the value for a key
        System.out.println("Value for 1 is " + hm.get(1));
        // Traversing through the HashMap
        for (Map.Entry<Integer, String> e : hm.entrySet())
            System.out.println(e.getKey() + " "
                               + e.getValue());
    }
}

 

خروجی 

 

Value for 1 is Nikamooz
۱ Nikamooz
۲ For
۳ Nikamooz

 

ویژگی‌ ها و عملکرد Collection‌ ها

چالش بزرگ برنامه‌نویس‌ها این است که بتوانند اطلاعات را به‌شکل منظم و کارآمد مدیریت کنند. Collection‌ در جاوا، مثل یک جعبه ابزار جادویی، این چالش را به‌سادگی حل می‌کند و به شما امکان می‌دهد روی بخش‌های مهم برنامه‌ تمرکز کنید. این فریم ورک از قابلیت‌های ویژه‌ای زیر برخوردار است:

۱. پایان کار کد های پیچیده

فریم‌ورک Collection‌ در جاوا مجموعه‌ای از ساختارهای داده‌ای و الگوریتم‌های کاربردی دراختیارتان قرار می‌دهد. دیگر لازم نیست خودتان را درگیر نوشتن کدهای پیچیده برای مدیریت اطلاعات کنید. باخیال راحت از این ابزارهای آماده استفاده کرده و تمرکزتان را روی منطق اصلی برنامه‌ بگذارید.

۲. سرعت و کیفیت بی‌ نظیر

این فریم‌ورک، ساختارهای داده‌ای و الگوریتم‌هایی را ارائه می‌دهد که علاوه‌بر باکیفیت بودن، سرعت بالایی دارند. به این ترتیب، برنامه‌های شما به‌طور بهینه اجرا می‌شوند و باخیال راحت می‌توانید حجم بسیاری  از اطلاعات را مدیریت کنید.

۳. انعطاف‌ پذیری خارق‌ العاده

فرض کنید قصد دارید اطلاعات را بین بخش‌های مختلف برنامه‌ به‌اشتراک بذارید. Collection‌ در جاوا این کار را برای شما ساده می‌کند. با استفاده از این فریم‌ورک، دیگر نیازی نیست نگران سازگاری بخش‌های مختلف با هم باشید.

۴. یادگیری و استفاده آسان

با وجود قدرت و انعطاف‌پذیری بالا، Collection‌ در جاوا رابط‌های کاربری ساده‌ای دارد که یادگیری و استفاده از آن را برایتان راحت می‌کند. دیگر لازم نیست زمان زیادی را صرف یادگیری روش‌های پیچیده مدیریت اطلاعات کنید.

۵. صرفه‌جویی در زمان و انرژی

Collection‌ در جاوا ابزارهای آماده‌ای را دراختیارتان قرار می‌دهد که قبلا باید خودتان آن‌ها را می‌نوشتید. با استفاده از این ابزارها، در زمان و انرژی صرفه‌جویی و روی بخش‌های مهم‌تر برنامه‌نویسی تمرکز می‌کنید.

۶. کد های قابل‌ استفاده مجدد

Collection‌ در جاوا به شما این امکان را می‌دهد که کدهای قابل‌استفاده مجدد بنویسید. با استفاده از ساختارهای داده‌ای و الگوریتم‌های استاندارد، می‌توانید مطمئن شوید که کدها در بخش‌های مختلف برنامه قابل‌استفاده هستند.

بهینه سازی عملکرد Collection در جاوا

در این قسمت از مقاله، به بررسی رازهای بهینه‌سازی عملکرد Collection در جاوا می‌پردازیم و با زبانی ساده و کاربردی، نکات کلیدی برای افزایش سرعت و کارایی برنامه‌هایتان به شما ارائه می‌دهیم.

انتخاب Collection مناسب

اولین قدم در بهینه‌سازی Collection، انتخاب نوع Collection مناسب برای نیازهایتان است. هر نوع Collection در جاوا ویژگی‌ها و کاربردهای خاص خود را دارد.

  • Mapها: برای ذخیره‌سازی مجموعه‌ای از جفت‌های کلید-مقدار.
  • Setها: برای ذخیره‌سازی مجموعه‌ای از عناصر بدون ترتیب و بدون عنصر تکراری.
  • Listها: برای ذخیره‌سازی مجموعه‌ای مرتب از عناصر با قابلیت اضافه یا حذف کردن عنصر به‌طور پویا.
  • Queueها: برای ذخیره‌سازی مجموعه‌ای مرتب از عناصر براساس قاعده «اولین ورودی، اولین خروجی».

استفاده از الگوریتم‌ های کار آمد

Collection در جاوا، مجموعه‌ای از الگوریتم‌های مختلف را برای انجام عملیات مختلف روی داده‌ها ارائه می‌دهد. انتخاب الگوریتم مناسب برای هر عملیات، به‌طور قابل توجهی بر سرعت و کارایی برنامه شما تاثیر می‌گذارد. برای مثال، در مرتب‌سازی لیست‌های بزرگ، استفاده از الگوریتم مرتب‌سازی سریع (Quick Sort) به جای الگوریتم مرتب‌سازی حبابی (Bubble Sort) سرعت برنامه را به‌طور چشمگیری افزایش می‌دهد.

بهینه‌سازی حافظه

مصرف حافظه Collection در جاوا تاثیر مستقیمی بر برنامه شما دارد. برای بهینه‌سازی حافظه، می‌توانید از تکنیک‌های مختلفی مانند موارد زیر استفاده کنید:

  • استفاده از Collectionهای با اندازه ثابت: اگر تعداد عناصر Collection شما ثابت است، از Collectionهای با اندازه ثابت مانند ArrayList با ظرفیت مشخص استفاده کنید.
  • حذف عناصر غیرضروری: به طور مرتب عناصر غیرضروری را از Collectionها حذف کنید تا از اشغال حافظه اضافی جلوگیری شود.
  • استفاده از Collectionهای سبک: اگر به تمام قابلیت‌های Collection نیاز ندارید، از Collectionهای سبک‌تر مانند HashSet به جای HashMap استفاده کنید.

پرهیز از عملیات غیر ضروری: گامی اساسی

هر عملیاتی که روی Collection انجام می‌دهید، زمان می‌برد. بنابراین، سعی کنید تا حد امکان از انجام عملیات غیرضروری خودداری کنید. به عنوان مثال، به جای جستجوی عنصری در Collection و سپس حذف آن، می‌توانید از روش removeIf استفاده کنید که هر دو کار را به‌طور همزمان انجام می‌دهد.

خطا یابی Collection در جاوا

خوشبختانه، جاوا ابزارهای مختلفی را برای کمک به شما در خطایابی Collectionها ارائه می‌دهد. برخی از این ابزارها عبارت‌ است از:

  • متد toString(): این متد، محتوای Collection در جاوا را به‌صورت رشته‌ای چاپ می‌کند که به شما در درک مشکل کمک می‌کند.
  • متد debug(): این متد، اطلاعات مفصلی درمورد Collection در جاوا نمایش می‌دهد و برای عیب‌یابی پیچیده‌تر مفید است.
  • ابزارهای اشکال‌زدایی IDE: IDEهای برنامه‌نویسی جاوا، ابزارهای اشکال‌زدایی قدرتمندی را ارائه می‌دهند که به شما در گام‌به‌گام دنبال کردن کد و شناسایی منبع خطا کمک می‌کنند.

سخن پایانی: نقش پررنگ Collection در جاوا

Collection در جاوا برای برنامه‌نویس مثل ادویه غذا برای آشپز است. در این مقاله، سفری به دنیای Collectionها در جاوا داشتیم و با انواع مختلف آن‌ها، ویژگی‌ها و کاربردهایشان آشنا شدیم. به‌طور کلی:

  • هر نوع Collection ویژگی‌ها و کاربردهای خاص خود را دارد.
  • انواع مختلفی از Collection در جاوا وجود دارد، از جمله لیست‌ها، مجموعه‌ها و صف‌ها.
  • Collectionها برای افزایش کارایی، سازماندهی و انعطاف‌پذیری برنامه‌های شما مفید هستند.
  • Collectionها ساختارهای داده‌ای هستند که برای ذخیره و مدیریت گروه‌های داده استفاده می‌شوند.

با تسلط بر این ابزارهای ضروری می‌توانید برنامه‌های قدرتمند و کارآمدی بسازید که به نیازهای شما پاسخ دهند.

چه رتبه ای می‌دهید؟

میانگین ۱ / ۵. از مجموع ۱

اولین نفر باش

title sign
دانلود مقاله
Collection در جاوا؛ انواع، ویژگی و نحوه بهینه‌سازی 
فرمت PDF
صفحه
حجم مگابایت
دانلود مقاله
title sign
معرفی نویسنده
تیم فنی نیک آموز
مقالات
402 مقاله توسط این نویسنده
محصولات
0 دوره توسط این نویسنده
تیم فنی نیک آموز
title sign
دیدگاه کاربران