Java LinkedHashSet

LinkedHashSet类是Java集合框架的一部分,它提供了哈希表链表数据结构的功能。

它实现了Set接口

Java LinkedHastSet class implements the Set interface.

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

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


创建LinkedHashSet

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

导入包后,我们可以这样在Java中创建链式哈希集。

// LinkedHashSet with 8 capacity and 0.75 load factor
LinkedHashSet<Integer> numbers = new LinkedHashSet<>(8, 0.75);

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

请注意,new LinkedHashSet<>(8, 0.75)部分。这里的第一个参数是容量,第二个参数是加载因子

  • 容量 - 此哈希集的容量为8。表示它可以存储8个元素。
  • 加载因子 - 此哈希表的加载因子为0.6。这意味着,当我们的哈希表被填满60%时,元素将被移动到一个大小是原始哈希表两倍的新哈希表中。

默认容量和加载因子

可以创建不定义容量和加载因子的链式哈希集。例如,

// LinkedHashSet with default capacity and load factor
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) {
        // Creating an arrayList of even numbers
        ArrayList<Integer> evenNumbers = new ArrayList<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("ArrayList: " + evenNumbers);

        // Creating a LinkedHashSet from an ArrayList
        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<>();

        // Using add() method
        evenNumber.add(2);
        evenNumber.add(4);
        evenNumber.add(6);
        System.out.println("LinkedHashSet: " + evenNumber);

        LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
        
        // Using addAll() method
        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);

        // Calling the iterator() method
        Iterator<Integer> iterate = numbers.iterator();

        System.out.print("LinkedHashSet using Iterator: ");

        // Accessing elements
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

输出

LinkedHashSet: [2, 5, 6]
LinkedHashSet using 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);

        // Using the remove() method
        boolean value1 = numbers.remove(5);
        System.out.println("Is 5 removed? " + value1);

        boolean value2 = numbers.removeAll(numbers);
        System.out.println("Are all elements removed? " + value2);
    }
}

输出

LinkedHashSet: [2, 5, 6]
Is 5 removed? true
Are all elements removed? true

集合运算

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);

        // Union of two set
        numbers.addAll(evenNumbers);
        System.out.println("Union is: " + numbers);
    }
}

输出

LinkedHashSet1: [2, 4]
LinkedHashSet2: [1, 3]
Union is: [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);

        // Intersection of two sets
        evenNumbers.retainAll(primeNumbers);
        System.out.println("Intersection is: " + evenNumbers);
    }
}

输出

LinkedHashSet1: [2, 3]
LinkedHashSet2: [2, 4]
Intersection is: [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);

        // Difference between LinkedHashSet1 and LinkedHashSet2
        primeNumbers.removeAll(oddNumbers);
        System.out.println("Difference : " + primeNumbers);
    }
}

输出

LinkedHashSet1: [2, 3, 5]
LinkedHashSet2: [1, 3, 5]
Difference: [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);

        // Check if primeNumbers is a subset of numbers
        boolean result = numbers.containsAll(primeNumbers);
        System.out.println("Is LinkedHashSet2 is subset of LinkedHashSet1? " + result);
    }
}

输出

LinkedHashSet1: [1, 2, 3, 4]
LinkedHashSet2: [2, 3]
Is LinkedHashSet2 is a subset of LinkedHashSet1? true

LinkedHashSet的其他方法

方法 描述
clone() 创建LinkedHashSet的副本
contains() LinkedHashSet中搜索指定元素并返回布尔结果
isEmpty() 检查LinkedHashSet是否为空
size() 返回LinkedHashSet的大小
clear() LinkedHashSet中删除所有元素

要了解更多关于LinkedHashSet方法的信息,请访问Java LinkedHashSet(官方Java文档)


LinkedHashSet 与 HashSet 对比

LinkedHashSetHashSet都实现了Set接口。但是,它们之间存在一些差异。

  • LinkedHashSet在内部维护一个链表。因此,它保持其元素的插入顺序。
  • LinkedHashSet类比HashSet需要更多的存储空间。这是因为LinkedHashSet在内部维护链表。
  • LinkedHashSet的性能比HashSet慢。这是因为LinkedHashSet中存在链表。


LinkedHashSet 与 TreeSet 对比

以下是LinkedHashSetTreeSet之间的主要区别

  • TreeSet类实现了SortedSet接口。因此,树集中的元素是排序的。但是,LinkedHashSet类仅维护其元素的插入顺序。
  • TreeSet通常比LinkedHashSet慢。这是因为每当向TreeSet添加元素时,它都必须执行排序操作。
  • LinkedHashSet允许插入null值。但是,我们不能向TreeSet插入null值。
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战