English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليمية Java الأساسية

Java 流程控制

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

معالجة الاستثناءات في Java

Java 列表(List)

Java Queue(队列)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Java 其他主题

LinkedHashMap في Java

在本教程中,我们将借助示例学习Java LinkedHashMap类及其操作。

Java集合框架的LinkedHashMap类提供了Map接口的哈希表和链表实现。

LinkedHashMap继承了HashMap类,以将其条目存储在哈希表中。它在内部在所有条目之间维护一个双链列表,以对条目进行排序。

创建一个LinkedHashMap

为了创建双向链表,我们必须先导入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

يقدم هذا الكائن LinkedHashMap إمكانية تنفيذ العديد من العمليات على المفتاح

إدراج العنصر في 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}

زيارة عناصر LinkedHashMap

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

حذف عناصر LinkedHashMap

  • 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}

طرق أخرى لLinkedHashMap

طريقةوصف
clear()حذف جميع المدخلات من map
containsKey()تحقق من أن map يحتوي على المفتاح المحدد وإرجاع قيمة بولية
containsValue()تحقق من أن map يحتوي على القيمة المحددة وإرجاع قيمة بولية
size()إرجاع حجم map
isEmpty()تحقق من أن map فارغ، وإرجاع قيمة بولية

الفرق بين LinkedHashMap وHashMap

تقوم LinkedHashMap وHashMap بتنفيذ واجهة Map. ولكن، هناك بعض الاختلافات بينهما.

  • تقوم LinkedHashMap بحفظ قائمة مرتبطة داخليًا. لذلك، فإنها تحافظ على ترتيب عناصرها.

  • تتطلب LinkedHashMap مساحة تخزين أكبر من HashMap. هذا لأن LinkedHashMap يحافظ على قائمة مرتبطة داخليًا.

  • أداء LinkedHashMap أبطأ من HashMap.