آنچه در جاوا تنظیم شده است
اجازه دهید به طور خلاصه یادآوری کنیم که رابط Set یک مجموعه (مجموعه) را تعریف می کند. مجموعه را گسترش می دهد و رفتار مجموعه هایی را تعریف می کند که اجازه عناصر تکراری را نمی دهند. بنابراین، اگر سعی شود یک عنصر تکراری به مجموعه اضافه شود، متد add() false را برمی گرداند . اینترفیس هیچ روش اضافی از خود تعریف نمی کند. رابط Set از منحصر به فرد بودن اشیاء ذخیره شده مراقبت می کند، منحصر به فرد بودن با اجرای متد () quals تعیین می شود . بنابراین، اگر اشیاء کلاس ایجاد شده به Set اضافه شوند ، مطلوب است که متد () quals لغو شود .کلاس LinkedHashSet
قبل از اینکه در مورد کلاس LinkedHashSet صحبت کنیم ، لازم است به بستگان نزدیک آن یعنی کلاس HashSet اشاره کنیم . HashSet رابط Set را پیاده سازی می کند . مجموعه ای ایجاد می کند که عناصر را در یک جدول هش ذخیره می کند. عناصر جدول هش به صورت جفت کلید-مقدار ذخیره می شوند. کلید سلول (یا بخش) را برای ذخیره مقدار مشخص می کند. محتوای کلید برای تعیین یک مقدار منحصر به فرد به نام کد هش استفاده می شود. میتوانیم یک کد هش را به عنوان یک شناسه شی در نظر بگیریم، اگرچه لزومی ندارد که یکتا باشد. این کد هش همچنین به عنوان شاخصی عمل می کند که داده های مرتبط با کلید در آن ذخیره می شود. کلاس جاوا LinkedHashSet HashSet را بدون افزودن هیچ روش جدیدی گسترش می دهد. LinkedHashSet به شما اجازه می دهد تا به سرعت وجود یک ورودی را بررسی کنید، درست مانند HashSet ، اما حاوی یک لیست مرتب شده در داخل است. این بدان معنی است که ترتیب درج عناصر را ذخیره می کند. به عبارت دیگر، LinkedHashSet یک لیست پیوندی از عناصر مجموعه را به ترتیبی که درج شده اند حفظ می کند. این اجازه می دهد تا تکرار مرتب درج در یک مجموعه. اما این باعث می شود که کلاس LinkedHashSet عملیات طولانی تر از کلاس HashSet انجام دهد .ویژگی های مهم LinkedHashSet
-
ما می توانیم عناصر منحصر به فرد را فقط در یک LinkedHashSet ذخیره کنیم
-
LinketHashSet به ما اجازه می دهد تا عناصر را به همان ترتیبی که درج می کنیم استخراج کنیم
-
LinkedHashSet همگام نیست
-
LinkedHashSet امکان ذخیره عناصر تهی را فراهم می کند
-
LinkedHashSet از تکنیک هش برای ذخیره عناصر در یک شاخص مشخص بر اساس کد هش استفاده می کند.
روش های LinkedHashSet
HashSet علاوه بر متدهایی که از کلاسهای والد خود به ارث میبرد، متدهای زیر را تعریف میکند:-
boolean add(Object o) عنصر مشخص شده را در صورتی که از قبل موجود نباشد به این مجموعه اضافه می کند.
-
void clear() تمام عناصر را از این مجموعه حذف می کند.
-
Object clone () یک کپی کم عمق از این نمونه LinkedHashSet را برمی گرداند : خود عناصر شبیه سازی نشده اند.
-
اگر این مجموعه حاوی عنصر مشخص شده باشد، boolean contain(Object o) true را برمی گرداند.
-
اگر این مجموعه فاقد عنصر باشد، isEmpty() boolean true برمی گرداند .
-
Iterator iterator() یک تکرار کننده را روی عناصر این مجموعه برمی گرداند.
-
حذف boolean (Object o) عنصر مشخص شده را در صورت وجود از این مجموعه حذف می کند.
-
int size() تعداد عناصر این مجموعه (تعداد عناصر آن) را برمی گرداند.
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSetEx1 {
public static void main(String[] args) {
//LinkedHashSet() Init
Set<String> set = new LinkedHashSet<>();
//adding elements to LinkedHashSet
set.add("Re"); //first added element
set.add("Do");
set.add("Fa");
set.add("Sol");
set.add("La");
set.add("Ti");
set.add("Mi");//last added element
System.out.println(set);
}
}
خروجی این است:

مثال 2. افزودن یک نسخه تکراری به LinkedHashSet
بیایید 7 عنصر LinkedHashSet خود را با نام آهنگهای موسیقی دوباره قرار دهیم و یک عنصر جدید که مانند یکی از عناصر قبلی است قرار دهیم.import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSetEx2 {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<>();
set.add("Re");
set.add("Do");
set.add("Fa");
set.add("Sol");
set.add("La");
set.add("Ti");
set.add("Mi");
set.add("Sol");
System.out.println(set);
}
}
خروجی برنامه اینجاست:
مثال 3. حذف عناصر از LinkedHashSet
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSet3 {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<>();
set.add("Re");
set.add("Do");
set.add("Fa");
set.add("Sol");
set.add("La");
set.add("Ti");
set.add("Mi");
System.out.println(set);
set.remove("Fa");// removing an element from our set
set.remove("Score");//trying to remove element that isn't in set
System.out.println(set.remove("Score"));
System.out.println("Print our set without elements removed: ");
System.out.println(set);
set.clear();
System.out.println("Print out our set after clear command: ");
System.out.println(set);
}
}
خروجی برنامه اینجاست:
LinkedHashSet در مقابل HashSet
این دو طبقه از اقوام نزدیک هستند. اما در داخل HashSet از HashMap برای ذخیره اشیاء استفاده می کند در حالی که LinkedHashSet از LinkedHashMap استفاده می کند . اگر نیازی به حفظ ترتیب درج ندارید، اما نیاز به ذخیره اشیاء منحصر به فرد دارید، بهتر است از HashSet استفاده کنید . اگر نیاز به حفظ ترتیب درج عناصر دارید، LinkedHashSet انتخاب شماست. عملکرد LinkedHashSet کمی کندتر از HashSet است زیرا LinkedHashSet از LinkedList داخلی برای حفظ ترتیب درج عناصر استفاده می کند. بیایید مثالی بزنیم:import java.util.*;
public class LinkedHashSetExample1 {
public static void main(String[] args) {
// while regular hash set orders its elements according to its hashcode stamps
Set<Integer> regularHashSet = new HashSet<>();
regularHashSet.add(7);
regularHashSet.add(3);
regularHashSet.add(5);
regularHashSet.add(65536);
regularHashSet.add(9);
// few duplicates
regularHashSet.add(5);
regularHashSet.add(7);
// next will print:
// > regularHashSet = [65536, 3, 5, 7, 9]
System.out.println("regularHashSet = " + regularHashSet);
// linked hash set keeps order of adding unchanged
Set<Integer> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add(7);
linkedHashSet.add(3);
linkedHashSet.add(5);
linkedHashSet.add(65536);
linkedHashSet.add(9);
// few duplicates
linkedHashSet.add(5);
linkedHashSet.add(7);
// next will print:
// > linkedHashSet = [7, 3, 5, 65536, 9]
System.out.println("linkedHashSet = " + linkedHashSet);
}
}
خروجی برنامه این است:
استفاده از Java LinkedHashSet در برنامه های کاربردی دنیای واقعی
از آنجایی که LinkedHashSet به شما امکان می دهد تا به سرعت وجود یک ورودی را بررسی کنید و همچنین سفارش را ذخیره کنید، به نظر می رسد این مجموعه برای حذف موارد تکراری از یک لیست بسیار راحت است. یا مثلاً حل مشکلاتی مانند آخرین موردی که اخیراً در کیفم دیده شده است. یا چنین بازی Pokemon Go را به خاطر دارید؟ LinkedHashSet میتواند فهرستی از پوکمونهایی که با آنها برخورد کردهاید و ترتیبی که در مسیر شما با آنها برخورد کردهاند را ذخیره کند. در این صورت، پوکمون "تکرار شده" دیگر به لیست اضافه نخواهد شد. یا به عنوان مثال، لیستی از باس ها بر اساس سطح که قبلاً در هر بازی با سطوح ملاقات کرده اید. یا تاریخچه کشف اجسام کیهانی. LinkedHashSet به شما این امکان را می دهد که به سرعت بررسی کنید که آیا یک جسم فضایی از قبل در لیست وجود دارد یا خیر، و اگر در آنجا نیست، آن را به لیست اضافه کنید. بیایید مثالی از حذف موارد تکراری بزنیم.import java.util.*;
class LinkedHashSetExample2 {
public static void main(String[] args) {
List<String> listWithDuplicates = List.of("some","elements","with", "few", "duplicates", "were", "here", "duplicates", "duplicates");
Set<String> linkedHashSet = new LinkedHashSet<>(listWithDuplicates);
List<String> listWithoutDuplicates = new ArrayList<>(linkedHashSet);
// next will print:
// > listWithDuplicates = [some, elements, with, few, duplicates, here, duplicates, duplicates]
System.out.println("listWithDuplicates = " + listWithDuplicates);
// next will print:
// > listWithoutDuplicates = [some, elements, with, few, duplicates, here]
System.out.println("listWithoutDuplicates = " + listWithoutDuplicates);
// -------------------------------------------------------------------------
// while using regular Hash Set will generally produces some unexpected order
Set<String> regularHashSet = new HashSet<>(listWithDuplicates);
// next will print:
// > linkedHashSet = [some, elements, with, few, duplicates, were, here]
System.out.println("linkedHashSet = " + linkedHashSet);
// next will print:
// > regularHashSet = [here, some, with, duplicates, were, elements, few]
System.out.println("regularHashSet = " + regularHashSet);
}
}
خروجی برنامه اینجاست:
GO TO FULL VERSION