در این مقاله فرض میکنیم که شما اطلاعات حدودی از Java Collections دارید.
این سلسله مقالات که برای تکمیل مقاله Java Collections - Everything You MUST Know نوشته شده برای بهبود و درک بهتر collectionها و مواردی که به طور روزمره دارید استفاده میکنید نوشته شده لطفا تمام این دسته بندی رو برای درک بهتر مطالعه کنید .
StringBuilder vs StringBuffer vs String
توی این آموزش میخوایم راجب Collection ها در جاوا صحبت کنیم و تا جایی که میتونیم بررسیش کنیم و هرچی نکته بلدیم رو بیاریم .
چنتا سوال هم اون آخر میگم خیلی باحاله توی مصاحبه ها هم میاد.
همین اول کار بگم هرچی بلد بودم رو آوردم و اگر نکته جالبی میدونید بگید که اضافه کنم .
نگاه کلی :
مجموعهها در جاوا (Java Collections) ساختارهای دادهای هستند که برای ذخیره، سازماندهی و مدیریت گروهی از اشیاء استفاده میشوند. این مجموعهها به شما اجازه میدهند تا به جای کار با تک تک اشیاء، با کل مجموعه به عنوان یک واحد کار کنید.
مجموعهای مرتب از عناصر است که هر عنصر میتواند چندین بار تکرار شود.
ArrayList:پیادهسازی متداول List است که بر اساس آرایهها ساخته شده است.
LinkedList: پیادهسازی دیگری از List است که بر اساس نودها ساخته شده و برای عملیات درج و حذف در وسط لیست بهینه شده است.
مجموعهای از عناصر منحصر به فرد است. هر عنصر فقط یک بار میتواند در مجموعه وجود داشته باشد. HashSet: پیادهسازی متداول Set است که بر اساس جدول هش ساخته شده و برای جستجوی سریع عناصر بهینه شده است.
TreeSet: پیادهسازی دیگری از Set است که عناصر را به صورت مرتب شده ذخیره میکند.
مجموعهای از جفتهای کلید-مقدار است. هر کلید باید منحصر به فرد باشد. HashMap: پیادهسازی متداول Map است که بر اساس جدول هش ساخته شده است. TreeMap: پیادهسازی دیگری از Map است که کلیدها را به صورت مرتب شده ذخیره میکند.
یه مثال ساده :
import java.util.ArrayList; import java.util.List; public class Example { public static void main(String[] args) { List<String> fruits = new ArrayList<>(); fruits.add("apple"); fruits.add("banana"); fruits.add("orange"); System.out.println(fruits); // خروجی: [apple, banana, orange] } }
مجموعهها در جاوا از generic types پشتیبانی میکنند که به شما اجازه میدهد تا نوع عناصر ذخیره شده در مجموعه را مشخص کنید.
برای پیمایش عناصر یک مجموعه از iterators استفاده میشود.
مجموعههای جاوا بخشی از Collections framework هستند که شامل کلاسها و رابطهای مختلفی برای کار با مجموعهها است.
جاوا 8 با معرفی ویژگیهای جدیدی، کار با مجموعهها را بسیار قدرتمندتر و انعطافپذیرتر کرده است. برخی از مهمترین این ویژگیها عبارتند از:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); // قبل از جاوا 8 List<String> longNames = new ArrayList<>(); for (String name : names) { if (name.length() > 5) { longNames.add(name); } } // 8با استفاده از استریم و لامبدادر جاوا List<String> longNames = names.stream() .filter(name -> name.length() > 5) .collect(Collectors.toList());
همانطور که میبینید، کد جاوا 8 بسیار خواناتر و خلاصهتر است.
مزایای استفاده از این ویژگیها:
در کل، جاوا 8 با معرفی این ویژگیها، یک جهش بزرگ در زمینه برنامهنویسی تابعی و کار با مجموعهها ایجاد کرده است.
جاوا 10 تغییرات چشمگیری در زمینه کار با مجموعهها ایجاد نکرد. تمرکز اصلی این نسخه بر روی بهبود عملکرد، قابلیت اطمینان و برخی ویژگیهای زیرساختی بوده است.
با این حال، برخی از تغییرات غیر مستقیم میتوانند بر روی نحوه کار با مجموعهها تاثیر بگذارند:
جاوا 11، گرچه تغییرات بنیادینی در کار با مجموعهها ایجاد نکرد، اما با معرفی ویژگیهای جدید و بهبودهای عملکردی، بهینهسازیهایی را در این حوزه ارائه داده است.
مهمترین تغییراتی که در جاوا 11 در ارتباط با مجموعهها رخ داده است، به شرح زیر است:
List<String> immutableList = List.of("apple", "banana", "orange"); // immutableList.add("grape"); // این خط منجر به خطا میشود
toArray(IntFunction<T[]> generator)
یکی از تغییرات مهمی است که در جاوا 11 به رابط Collection
اضافه شده است. این متد به شما امکان میدهد تا آرایهای با نوع دلخواه و اندازه مناسب از عناصر یک مجموعه ایجاد کنید.چرا این متد مهم است؟
toArray()
تنها امکان ایجاد آرایهای از نوع مشخص شده در تعریف مجموعه را فراهم میکرد. اما متد جدید به شما اجازه میدهد تا نوع آرایه خروجی را به طور دلخواه مشخص کنید.toArray()
منجر به هشدارهای کامپایلر میشد. متد جدید این مشکل را برطرف کرده است.List<String> fruits = List.of("apple", "banana", "orange"); String[] fruitArray = fruits.toArray(String[]::new);
در مثال بالا، متد toArray()
یک آرایه از نوع String[]
با اندازه مناسب ایجاد میکند و عناصر مجموعه fruits
را در آن کپی میکند.
مزایای استفاده از این متد:
توجه:
IntFunction
به عنوان ورودی استفاده میکند که وظیفه ایجاد آرایه خالی با اندازه مشخص را بر عهده دارد.ArrayStoreException
رخ میدهد.در کل، متد toArray(IntFunction<T[]> generator)
یک ابزار قدرتمند برای کار با مجموعهها در جاوا 11 است و به شما امکان میدهد تا عملیات تبدیل مجموعه به آرایه را با انعطافپذیری بیشتری انجام دهید.
در کل، جاوا 11 با معرفی مجموعههای غیرقابل تغییر و بهبود عملکرد Garbage Collector، گامی مهم در جهت بهبود کارایی و امنیت برنامههای جاوا برداشته است.
در حالی که جاوا 11 تغییرات بنیادینی در نحوه کار با مجموعهها ایجاد نکرده است، اما با معرفی ویژگیهای جدید و بهبودهای عملکردی، بهینهسازیهایی را در این حوزه ارائه داده است. به ویژه، مجموعههای غیرقابل تغییر یک ابزار قدرتمند برای افزایش امنیت و قابلیت اطمینان برنامهها هستند.
هنوز وقت نکردم موارد مربوط به جاوا 14 و 17 و 21 رو بخونم اونها رو بهم وقتی خوندم قرار میدم .
یک ابزار قدرتمند در جاوا برای پیمایش عناصر یک مجموعه (مانند List، Set، Map) است. این ابزار به شما اجازه میدهد تا بدون دانستن ساختار داخلی مجموعه، روی عناصر آن به صورت ترتیبی حرکت کنید.
import java.util.ArrayList; import java.util.Iterator; public class IteratorExample { public static void main(String[] args) { ArrayList<String> fruits = new ArrayList<>(); fruits.add("Apple"); fruits.add("Orange"); Iterator<String> iterator = fruits.iterator(); while (iterator.hasNext()) { String fruit = iterator.next(); System.out.println(fruit); } } } //خروجی //Apple //Orange
import java.util.ArrayList; import java.util.Iterator; public class IteratorExample { public static void main(String[] args) { ArrayList<String> numbers = new ArrayList<>(); numbers.add("One"); numbers.add("Two"); numbers.add("Three"); Iterator<String> iterator = numbers.iterator(); while (iterator.hasNext()) { String number = iterator.next(); if (number.equals("Two")) { iterator.remove(); } } // چاپ عناصر باقی مانده for (String number : numbers) { System.out.println(number); } } }
نکته مهم: هنگام حذف عنصری در حین پیمایش با Iterator، باید بلافاصله بعد از فراخوانی next()
و قبل از فراخوانی next()
بعدی، از متد remove()
استفاده کنید. در غیر این صورت، یک IllegalStateException
رخ خواهد داد.
import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class IteratorExample { public static void main(String[] args) { Map<String, Integer> ages = new HashMap<>(); ages.put("Alice", 30); ages.put("Bob", 25); ages.put("Charlie", 35); // پیمایش کلیدها Iterator<String> keys = ages.keySet().iterator(); while (keys.hasNext()) { String key = keys.next(); System.out.println("Key: " + key + ", Value: " + ages.get(key)); } } }
مزایای استفاده از Iterator:
موارد استفاده از Iterator:
نکات مهم:
next()
, از hasNext()
استفاده کنید تا از خطای NoSuchElementException
جلوگیری شود.با استفاده از Iterator، میتوانید به صورت ایمن و انعطافپذیر بر روی عناصر مجموعههای مختلف در جاوا پیمایش کنید.
یکی از قدرتمندترین ویژگیهای جاوا 8 و نسخههای بعدی است که به شما اجازه میدهد روی مجموعه دادهها به صورت تابعی عمل کنید. با استفاده از Stream API میتوانید عملیات فیلتر کردن، نگاشت، کاهش، مرتبسازی و بسیاری دیگر را به صورت زنجیرهای و خوانا اجرا کنید.
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StreamExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); // فیلتر کردن اعداد زوج List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(evenNumbers); // خروجی: [2, 4, 6, 8] } }
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StreamExample { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); // تبدیل هر نام به طول آن List<Integer> lengths = names.stream() .map(String::length) .collect(Collectors.toList()); System.out.println(lengths); // خروجی: [5, 3, 7] } }
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StreamExample { public static void main(String[] args) { List<String> names = Arrays.asList("Ali", "Bahram", "Changiz"); // مرتبسازی بر اساس حروف الفبا List<String> sortedNames = names.stream() .sorted() .collect(Collectors.toList()); System.out.println(sortedNames); // خروجی: [Ali, Bahram, Changiz] } }
import java.util.List; import java.util.stream.Collectors; public class StreamExample { public static void main(String[] args) { List<String> words = Arrays.asList("apple", "orange", "kiwi"); // پیدا کردن طولانیترین کلمه String longestWord = words.stream() .max(Comparator.comparingInt(String::length)) .orElse("No words found"); System.out.println(longestWord); // خروجی: orange } }
مزایای استفاده از Stream API:
موارد استفاده رایج Stream API:
میخواستم راجب Queue بگم و یه چنتا مثال بزنم اما دیگه داره یکم طولانی میشه این موارد رو بعدا در یک مقاله دیگه میگم .
خوب بیایم یه چنتا سوال ساده ولی توی مصاحبه میاد بگیم :
سوال اول : فرض کنید هیچ کدوم از کالکشن های مربوط به map مثلا HashMap , Map , HashSet , TreeMap و امثال اینها رو نداشتیم
چطوری میتونیم خودمون یه Map یا HashMap بسازیم ؟ (راهنمایی مثلا بیایم با استفاده از list یا ArrayList و ... ایجادش کنیم )
سوال دوم : یه Itarator سفارشی ایجاد کنید
سوال سوم : چه زمانی استفاده از TreeMap نسبت به HashMap مناسب تر است؟
سوال چهارم : TreeMap چگونه عناصر را مرتب میکند؟ چه مقایسهکنندهای برای این کار استفاده میشود؟
سوال پنجم : چگونه میتوان یک HashMap را به یک TreeMap تبدیل کرد؟
سوال ششم : اگر تعداد زیادی از عناصر با همان هش کد را به HashMap اضافه کنیم چه اتفاقی میافتد؟ چگونه میتوان با این مشکل مقابله کرد؟
سوال هفتم : چه زمانی از HashMap استفاده میکنیم و چه زمانی از TreeMap؟
سوال هشتم : تفاوت بین intermediate operations و terminal operations در Stream API چیست؟
سوال نهم : تفاوت بین reduce
و collect
در Stream API چیست؟
سوال دهم : چگونه میتوان از ایجاد intermediate collection ها در Stream API جلوگیری کرد؟
سوال یازدهم : چگونه میتوان از ایجاد boxing و unboxing در Stream API جلوگیری کرد؟
سوال دوازدهم : functional interfaces چیست؟ و چه تاثیری توی Stream Api داره ؟
اینا سوالاتی بود که توی مصاحبه ازم پرسیده بودند و خیلی خوب و مفید و جالبه
منتظر نگاه های زیباتون هستم .
موفق و پیروز باشید.