English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在本教程中,我们将借助示例学习Java LinkedHashMap类及其操作。
Java集合框架的LinkedHashMap类提供了Map接口的哈希表和链表实现。
LinkedHashMap继承了HashMap类,以将其条目存储在哈希表中。它在内部在所有条目之间维护一个双链列表,以对条目进行排序。
为了创建双向链表,我们必须先导入java.util.LinkedHashMap包。导入程序包后,可以使用以下方法在Java中创建双向链表。
//LinkedHashMap的初始容量为8,负载因子为0.6 LinkedHashMap<Key, Value> numbers = new LinkedHashMap<>(8, 0.6f);
在上面的代码中,我们创建了一个名为numbers的LinkedHashMap。
这里,
Key - 用于关联map中每个元素(值)的唯一标识符
Value - map中的键所关联的元素
注意 new LinkedHashMap<>(8,0.6) 这一部分。这里,第一个参数是capacity,第二个参数是loadFactor。
capacity - 该双向链表的容量为8。意味着,它可以存储8个条目。
loadFactor- 这个双向链表的负载因子为0.6。这意味着,每当哈希映射被填满60%时,条目就会被移动到一个新哈希表,其大小是原始哈希表的两倍。
默认容量和负载因子
无需定义其容量和负载因子就可以创建双向链表。例如,
//LinkedHashMap具有默认容量和负载因子 LinkedHashMap<Key, Value> numbers1 = new LinkedHashMap<>();
افتراضي،
سعة القائمة المرتبطة الثنائية ستكون 16
معدل الحمل سيكون 0.75
ملاحظةLinkedHashMap类 يسمح أيضًا بتحديد ترتيب المدخلات. على سبيل المثال
// LinkedHashMap with specified order LinkedHashMap<Key, Value> numbers2 = new LinkedHashMap<>(capacity, loadFactor, accessOrder);
هنا accessOrder هو قيمة بولية. القيمة الافتراضية هي false. في هذه الحالة، سيُترتيب المدخلات في القائمة المرتبطة الثنائية بناءً على الترتيب الذي تم إدراجه به
لكن إذا كان قيمة accessOrder هي true، فإن المدخلات في القائمة المرتبطة الثنائية ستُترتيب بناءً على الترتيب من الأحدث إلى الأقدم
إليك كيفية إنشاء قائمة مرتبطة تحتوي على جميع العناصر في المفتاح الأخر
import java.util.LinkedHashMap; class Main { public static void main(String[] args) { // Creating LinkedHashMap of even numbers LinkedHashMap<String, Integer> evenNumbers = new LinkedHashMap<>(); evenNumbers.put("Two", 2); evenNumbers.put("Four", 4); System.out.println("LinkedHashMap1: " + evenNumbers); // من LinkedHashMap آخر LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>(evenNumbers); numbers.put("Three", 3); System.out.println("LinkedHashMap2: " + numbers); } }
النتيجة الإخراجية
LinkedHashMap1: {Two=2, Four=4} LinkedHashMap2: {Two=2, Four=4, Three=3}
يقدم هذا الكائن LinkedHashMap إمكانية تنفيذ العديد من العمليات على المفتاح
put() - سيتم إدراج تعيين المفتاح/القيمة في المفتاح
putAll() - سيتم إدراج جميع المدخلات في المفتاح المحدد في هذا المفتاح
putIfAbsent() - إذا لم يكن المفتاح المحدد موجودًا في المفتاح، فسيتم إدراج تعيين المفتاح/القيمة في المفتاح
على سبيل المثال،
import java.util.LinkedHashMap; class Main { public static void main(String[] args) { // Creating LinkedHashMap of even numbers LinkedHashMap<String, Integer> evenNumbers = new LinkedHashMap<>(); // استخدام put() evenNumbers.put("Two", 2); evenNumbers.put("Four", 4); System.out.println("LinkedHashMap الأصلي: " + evenNumbers); // استخدام putIfAbsent() evenNumbers.putIfAbsent("Six", 6); System.out.println("LinkedHashMap المعدل(): " + evenNumbers); // إنشاء LinkedHashMap من numbers LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>(); numbers.put("One", 1); // استخدام putAll() numbers.putAll(evenNumbers); System.out.println("LinkedHashMap جديد: " + numbers); } }
النتيجة الإخراجية
LinkedHashMap الأصلي: {Two=2, Four=4} LinkedHashMap المعدل: {Two=2, Four=4, Six=6} LinkedHashMap جديد: {One=1, Two=2, Four=4, Six=6}
1. استخدام entrySet()،keySet() وvalues()
entrySet() - عودة مجموعة جميع تطابقات المفاتيح/القيم
keySet() - عودة مجموعة المفاتيح لكل مفتاح في المفردات
values() - عودة مجموعة القيم لكل قيمة في المفردات
على سبيل المثال،
import java.util.LinkedHashMap; class Main { public static void main(String[] args) { LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("LinkedHashMap: " + numbers); // استخدام entrySet() System.out.println("مطابقة المفاتيح/القيم (Key/Value): " + numbers.entrySet()); // استخدام keySet() System.out.println("المفاتيح (Keys): " + numbers.keySet()); // استخدام values() System.out.println("القيم (Values): " + numbers.values()); } }
النتيجة الإخراجية
LinkedHashMap: {One=1, Two=2, Three=3} مطابقة المفاتيح/القيم (Key/Value): [One=1, Two=2, Three=3] المفاتيح (Keys): [One, Two, Three] القيم (Values): [1, 2, 3]
استخدام get() و getOrDefault()
get() - يعود القيمة المرتبطة بالمفتاح المحدد. إذا لم يتم العثور على المفتاح، فإنه يعود null.
getOrDefault() - يعود القيمة المرتبطة بالمفتاح المحدد. إذا لم يتم العثور على المفتاح، فإنه يعود القيمة المحددة افتراضياً.
على سبيل المثال،
import java.util.LinkedHashMap; class Main { public static void main(String[] args) { LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("LinkedHashMap: " + numbers); //استخدام get() int value1 = numbers.get("Three"); System.out.println("يعود الرقم: " + value1); //استخدام getOrDefault() int value2 = numbers.getOrDefault("Five", 5); System.out.println("يعود الرقم: " + value2); } }
النتيجة الإخراجية
LinkedHashMap: {One=1, Two=2, Three=3} يعود الرقم: 3 يعود الرقم: 5
remove(key) - يعود ويحذف العنصر المرتبط بالمفتاح المحدد.
remove(key, value) - يتم حذف العنصر من الم映射 فقط إذا كان المفتاح المحدد يساوي القيمة المحددة ويعود القيمة البولية.
على سبيل المثال،
import java.util.LinkedHashMap; class Main { public static void main(String[] args) { LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("LinkedHashMap: " + numbers); //طريقة الحذف بوجود متغير واحد int value = numbers.remove("Two"); System.out.println("القيمة المزالة: " + value); //طريقة الحذف بوجود متغيرين boolean result = numbers.remove("Three", 3); System.out.println("هل تم حذف العنصر 3؟ " + result); System.out.println("LinkedHashMap المعدل: " + numbers); } }
النتيجة الإخراجية
LinkedHashMap: {One=1, Two=2, Three=3} حذف القيمة: 2 هل تم حذف المدخل 3؟ True LinkedHashMap بعد التحديث: {One=1}
طريقة | وصف |
---|---|
clear() | حذف جميع المدخلات من map |
containsKey() | تحقق من أن map يحتوي على المفتاح المحدد وإرجاع قيمة بولية |
containsValue() | تحقق من أن map يحتوي على القيمة المحددة وإرجاع قيمة بولية |
size() | إرجاع حجم map |
isEmpty() | تحقق من أن map فارغ، وإرجاع قيمة بولية |
تقوم LinkedHashMap وHashMap بتنفيذ واجهة Map. ولكن، هناك بعض الاختلافات بينهما.
تقوم LinkedHashMap بحفظ قائمة مرتبطة داخليًا. لذلك، فإنها تحافظ على ترتيب عناصرها.
تتطلب LinkedHashMap مساحة تخزين أكبر من HashMap. هذا لأن LinkedHashMap يحافظ على قائمة مرتبطة داخليًا.
أداء LinkedHashMap أبطأ من HashMap.