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 其他主题

Java LinkedHashSet

在本教程中,我们将借助示例学习Java LinkedHashSet类及其方法。

Java集合框架的LinkedHashSet类提供了哈希表和链接列表数据结构的功能。

它实现Set接口

LinkedHashSet的元素存储在类似于HashSet的哈希表中。

但是,链表哈希集合在内部为其所有元素维护一个双链表。链表定义了在哈希表中插入元素的顺序。

创建一个LinkedHashSet

为了创建链表的哈希集,我们必须首先导入java.util.LinkedHashSet包。

导入包后,就可以在Java中创建链表的哈希集。

// 具有8个容量和0.75负载因子的LinkedHashSet
LinkedHashSet<Integer> numbers = new LinkedHashSet<>(8, 0.75);

在这里,我们创建了一个名为numbers的链表哈希集合。

注意,语句 new LinkedHashSet<>(8, 0.75)。在这里,第一个参数是容量,第二个参数是负载因子

  • capacity - 该哈希集的容量为8。意味着,它可以存储8个元素。

  • loadFactor- 此哈希集的负载因子为0.6。这意味着,只要我们的哈希表填充了60%,元素就会移动到新哈希表中,该哈希表的大小是原始哈希表的两倍。

默认容量和负载因子

可以在不定义其容量和负载因子的情况下创建链表的哈希集合。例如,

// 具有默认容量和负载因子的LinkedHashSet
LinkedHashSet<Integer> numbers1 = new LinkedHashSet<>();

默认,

  • 链接哈希集的容量将为16

  • 负载因子将为0.75

从其他集合创建LinkedHashSet

这是我们如何创建包含其他集合的所有元素的链接哈希集。

import java.util.LinkedHashSet;
import java.util.ArrayList;
class Main {
    public static void main(String[] args) {
        //创建偶数的arrayList
        ArrayList<Integer> evenNumbers = new ArrayList<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("ArrayList: " + evenNumbers);
        //从ArrayList创建LinkedHashSet
        LinkedHashSet<Integer> numbers = new LinkedHashSet<>(evenNumbers);
        System.out.println("LinkedHashSet: " + numbers);
    }
}

Результат вывода

ArrayList: [2, 4]
LinkedHashSet: [2, 4]

LinkedHashSet的方法

LinkedHashSet类提供了让我们对所链表的哈希集合执行各种操作方法。

将元素插入LinkedHashSet

  • add() - 将指定的元素插入链表的哈希集

  • addAll() - 将指定集合的所有元素插入链表的哈希集

Например,

import java.util.LinkedHashSet;
class Main {
    public static void main(String[] args) {
        LinkedHashSet<Integer> evenNumber = new LinkedHashSet<>();
        // 使用add()方法
        evenNumber.add(2);
        evenNumber.add(4);
        evenNumber.add(6);
        System.out.println("LinkedHashSet: " + evenNumber);
        LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
        
        //使用addAll()方法
        numbers.addAll(evenNumber);
        numbers.add(5);
        System.out.println("New LinkedHashSet: " + numbers);
    }
}

Результат вывода

LinkedHashSet: [2, 4, 6]
New LinkedHashSet: [2, 4, 6, 5]

访问LinkedHashSet元素

Чтобы访问链表的哈希集的元素,我们可以使用iterator()方法。为了使用此方法,我们必须导入java.util.Iterator包。例如,

import java.util.LinkedHashSet;
import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
        numbers.add(2);
        numbers.add(5);
        numbers.add(6);
        System.out.println("LinkedHashSet: " + numbers);
        //Вызов метода iterator()
        Iterator<Integer> iterate = numbers.iterator();
        System.out.print("Использование Iterator в LinkedHashSet: ");
        //Аccess element
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

Результат вывода

LinkedHashSet: [2, 5, 6]
Использование LinkedHashSet с Iterator: 2, 5, 6,

Внимание:

  • hasNext() возвращает true, если в хеш-списке существует следующий элемент

  • next() возвращает следующий элемент из хеш-списка

Удаляем элемент из HashSet

  • remove() - Удаляет указанный элемент из хеш-списка

  • removeAll() - Удаляет все элементы из хеш-списка

Например,

import java.util.LinkedHashSet;
class Main {
    public static void main(String[] args) {
        LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
        numbers.add(2);
        numbers.add(5);
        numbers.add(6);
        System.out.println("LinkedHashSet: " + numbers);
        //Использование метода remove()
        boolean value1 = numbers.remove(5);
        System.out.println("Удалили 5? " + value1);
        boolean value2 = numbers.removeAll(numbers);
        System.out.println("Удалили все элементы? " + value2);
    }
}

Результат вывода

LinkedHashSet: [2, 5, 6]
Удалили 5? true
Удалили все элементы? true

Методы операций LinkedHashSet

Методы класса LinkedHashSet также могут использоваться для выполнения различных операций над множеством.

Объединение

Чтобы выполнить объединение двух множеств, мы можем использовать метод addAll(). Например,

import java.util.LinkedHashSet;
class Main {
    public static void main(String[] args) {
        LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("LinkedHashSet1: " + evenNumbers);
        LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
        numbers.add(1);
        numbers.add(3);
        System.out.println("LinkedHashSet2: " + numbers);
        //Объединение множеств двух множеств
        numbers.addAll(evenNumbers);
        System.out.println("Объединение множеств: " + numbers);
    }
}

Результат вывода

LinkedHashSet1: [2, 4]
LinkedHashSet2: [1, 3]
Объединение множеств: [1, 3, 2, 4]

Объединение

Чтобы выполнить объединение двух множеств, мы можем использовать метод retainAll(). Например

import java.util.LinkedHashSet;
class Main {
    public static void main(String[] args) {
        LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
        primeNumbers.add(2);
        primeNumbers.add(3);
        System.out.println("LinkedHashSet1: " + primeNumbers);
        LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("LinkedHashSet2: " + evenNumbers);
        //Объединение множеств
        evenNumbers.retainAll(primeNumbers);
        System.out.println("Объединение множеств: " + evenNumbers);
    }
}

Результат вывода

LinkedHashSet1: [2, 3]
LinkedHashSet2: [2, 4]
Объединение множеств: [2]

Разность

Чтобы вычислить разность между двумя множествами, мы можем использовать метод removeAll(). Например,

import java.util.LinkedHashSet;
class Main {
    public static void main(String[] args) {
        LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
        primeNumbers.add(2);
        primeNumbers.add(3);
        primeNumbers.add(5);
        System.out.println("LinkedHashSet1: " + primeNumbers);
        LinkedHashSet<Integer> oddNumbers = new LinkedHashSet<>();
        oddNumbers.add(1);
        oddNumbers.add(3);
        oddNumbers.add(5);
        System.out.println("LinkedHashSet2: " + oddNumbers);
        //Разность множеств между LinkedHashSet1 и LinkedHashSet2
        primeNumbers.removeAll(oddNumbers);
        System.out.println("Разность множеств: " + primeNumbers);
    }
}

Результат вывода

LinkedHashSet1: [2, 3, 5]
LinkedHashSet2: [1, 3, 5]
Разность множеств: [2]

Подмножество

Чтобы проверить, является ли один набор подмножеством другого, мы можем использовать метод containsAll(). Например,

import java.util.LinkedHashSet;
class Main {
    public static void main(String[] args) {
        LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        System.out.println("LinkedHashSet1: " + numbers);
        LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
        primeNumbers.add(2);
        primeNumbers.add(3);
        System.out.println("LinkedHashSet2: " + primeNumbers);
        //Проверка, является ли primeNumbers подмножеством numbers
        boolean result = numbers.containsAll(primeNumbers);
        System.out.println("LinkedHashSet2 является подмножеством LinkedHashSet1? " + result);
    }
}

Результат вывода

LinkedHashSet1: [1, 2, 3, 4]
LinkedHashSet2: [2, 3]
Is LinkedHashSet2 подмножеством LinkedHashSet1? true

Другие методы LinkedHashSet

МетодОписание
clone()Создание дубликата LinkedHashSet
contains()Поиск указанного элемента в LinkedHashSet и возврат булевого результата
isEmpty()Проверка, пуст ли LinkedHashSet
size()Возврат размера LinkedHashSet
clear()Удаление всех элементов из LinkedHashSet

Различия между LinkedHashSet и HashSet

LinkedHashSet и HashSet оба реализуют интерфейс Set. Однако, между ними есть некоторые различия.

  • LinkedHashSet внутренне поддерживает цепочку. Таким образом, он поддерживает порядок вставки своих элементов.

  • LinkedHashSet требует больше места для хранения, чем HashSet. Это связано с тем, что LinkedHashSet внутренне поддерживает цепочку.

  • Производительность LinkedHashSet медленнее, чем HashSet. Это связано с наличием в LinkedHashSet цепочки.

Различия между LinkedHashSet и TreeSet

Ниже приведены основные различия между LinkedHashSet и TreeSet:

  • TreeSet класс реализует интерфейс SortedSet. Это означает, что элементы в наборе имеют упорядоченный вид. Однако, LinkedHashSet класс поддерживает только порядок вставки своих элементов.

  • TreeSet обычно медленнее, чем LinkedHashSet. Это связано с тем, что каждый раз, когда элемент добавляется в TreeSet, он должен выполнить операцию сортировки.

  • LinkedHashSet позволяет вставлять пустые значения. Однако, мы не можем вставлять пустые значения в TreeSet.