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

Tutoriales básicos de Java

Java 流程控制

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Manejo de excepciones en 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%,当元素移动到新哈希表中时,该哈希表的大小是原始哈希表的两倍。

Capacidad y factor de carga por defecto

Podemos crear una colección de hash enlazada sin definir su capacidad y factor de carga. Por ejemplo,

//LinkedHashSet con capacidad y factor de carga por defecto
LinkedHashSet<Integer> numbers1 = new LinkedHashSet<>();

Por defecto,

  • La capacidad de la colección de hash enlazada será16

  • El factor de carga será 0.75

Crear LinkedHashSet desde otras colecciones

Esta es la forma en que creamos una colección de hash enlazada que contiene todos los elementos de otras colecciones.

import java.util.LinkedHashSet;
import java.util.ArrayList;
class Main {
    public static void main(String[] args) {
        //Crear arrayList de números pares
        ArrayList<Integer> evenNumbers = new ArrayList<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("ArrayList:", + evenNumbers);
        //Crear LinkedHashSet desde ArrayList
        LinkedHashSet<Integer> numbers = new LinkedHashSet<>(evenNumbers);
        System.out.println("LinkedHashSet: "); + numbers);
    }
}

Resultados de salida

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

Métodos de LinkedHashSet

La clase LinkedHashSet proporciona métodos que nos permiten realizar varias operaciones en la colección de hash enlazada.

Insertar el elemento en LinkedHashSet

  • add() - Insertar el elemento especificado en la colección de hash de la lista

  • addAll() - Insertar todos los elementos de la colección especificada en la colección de hash de la lista

por ejemplo,

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

Resultados de salida

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

Acceder a los elementos de LinkedHashSet

Para acceder a los elementos de la colección de hash de la lista enlazada, podemos usar el método iterator(). Para usar este método, debemos importar el paquete java.util.Iterator. Por ejemplo,

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);
        //Llamar al método iterator()
        Iterator<Integer> iterate = numbers.iterator();
        System.out.print("usar Iterator de LinkedHashSet: ");
        //acceder a los elementos
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

Resultados de salida

LinkedHashSet: [2, 5, 6]
usar LinkedHashSet con Iterator: 2, 5, 6,

notas:

  • hasNext() devuelve true si hay otro elemento en el conjunto de hash del enlace

  • next() devuelve el siguiente elemento del conjunto de hash del enlace

eliminar el elemento del HashSet

  • remove() - eliminar el elemento especificado del conjunto de hash de la lista

  • removeAll() - eliminar todos los elementos del conjunto de hash de la lista

por ejemplo,

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);
        //usar el método remove()
        boolean value1 = numbers.remove(5);
        System.out.println("5¿Se eliminó? " + value1);
        boolean value2 = numbers.removeAll(numbers);
        System.out.println("¿Se eliminaron todos los elementos? "); + value2);
    }
}

Resultados de salida

LinkedHashSet: [2, 5, 6]
5¿Se eliminó? true
¿Se eliminaron todos los elementos? true

métodos de operación de LinkedHashSet

Los métodos de LinkedHashSet de esta clase también se pueden usar para ejecutar varias operaciones de conjunto.

unión

Para ejecutar la unión entre dos conjuntos, podemos usar el método addAll(). Por ejemplo,

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);
        //unión de dos conjuntos
        numbers.addAll(evenNumbers);
        System.out.println("unión: "); + numbers);
    }
}

Resultados de salida

LinkedHashSet1: [2, 4]
LinkedHashSet2: [1, 3]
unión: [1, 3, 2, 4]

intersección

Para ejecutar la intersección entre dos conjuntos, podemos usar el método retainAll(). Por ejemplo,

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);
        //intersección del conjunto
        evenNumbers.retainAll(primeNumbers);
        System.out.println("intersección del conjunto: "); + evenNumbers);
    }
}

Resultados de salida

LinkedHashSet1: [2, 3]
LinkedHashSet2: [2, 4]
intersección del conjunto: [2]

diferencia

Para calcular la diferencia entre dos conjuntos, podemos usar el método removeAll(). Por ejemplo,

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);
        //LinkedHashSet1y LinkedHashSet2La diferencia entre
        primeNumbers.removeAll(oddNumbers);
        System.out.println("Diferencia: ", + primeNumbers);
    }
}

Resultados de salida

LinkedHashSet1: [2, 3, 5]
LinkedHashSet2: [1, 3, 5]
Diferencia: [2]

Subconjunto

Para verificar si un conjunto es un subconjunto de otro, podemos usar el método containsAll(). Por ejemplo,

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);
        //Comprobar si primeNumbers es un subconjunto de numbers
        boolean result = numbers.containsAll(primeNumbers);
        System.out.println("LinkedHashSet2Es LinkedHashSet1¿Es un subconjunto? " + result);
    }
}

Resultados de salida

LinkedHashSet1: [1, 2, 3, 4]
LinkedHashSet2: [2, 3]
LinkedHashSet2Es LinkedHashSet1¿Es un subconjunto? true

Otros métodos de LinkedHashSet

MétodoDescripción
clone()Crear una copia de LinkedHashSet
contains()Buscar el elemento especificado en LinkedHashSet y devolver el resultado booleano
isEmpty()Comprobar si LinkedHashSet está vacío
size()Devolver el tamaño de LinkedHashSet
clear()Eliminar todos los elementos de LinkedHashSet

Diferencias entre LinkedHashSet y HashSet

LinkedHashSet y HashSet implementan la interfaz Set. Sin embargo, existen algunas diferencias entre ellos.

  • LinkedHashSet在内部维护一个链表。因此,它保持其元素的插入顺序。

  • LinkedHashSet类比HashSet需要更多的存储空间。这是因为LinkedHashSet在内部维护链表。

  • LinkedHashSet的性能比HashSet慢。这是因为LinkedHashSet中存在链表。

LinkedHashSet 与TreeSet的区别

以下是LinkedHashSet和TreeSet之间的主要区别:

  • TreeSet类实现了SortedSet接口。这就是为什么树集中的元素是有序的。但是,LinkedHashSet类只维护其元素的插入顺序。

  • TreeSet通常比LinkedHashSet慢。这是因为每当将元素添加到TreeSet时,它都必须执行排序操作。

  • LinkedHashSet允许插入空值。但是,我们不能向TreeSet插入空值。