El marco de recopilación en Java proporciona una variedad de estructuras de datos para almacenar y manipular datos. LinkedHashSet
Es un tipo especial que combina las características de las tablas hash y las listas vinculadas, y es adecuado para situaciones en las que es necesario mantener el orden de inserción de los elementos y garantizar la unicidad. Este blog lo presentará en detalle LinkedHashSet
, incluidos sus conceptos, características, uso y código de muestra, con el objetivo de ayudar a los principiantes a comprender y aplicar mejor este tipo de colección.
1. ¿Qué es LinkedHashSet?
LinkedHashSet
Es una clase en el marco de colección de Java. Hereda de HashSet
, por lo que tiene el rendimiento de búsqueda de una tabla hash, mientras usa una lista vinculada para mantener el orden de inserción de los elementos. Esto significa LinkedHashSet
tener las siguientes dos propiedades principales:
- Orden :
LinkedHashSet
Se mantiene el orden de inserción de los elementos, es decir, el orden en que se agregan los elementos a la colección es el orden en que están en la colección. - Unicidad : Igual
HashSet
que,LinkedHashSet
asegurando la unicidad de los elementos y no permitiendo elementos duplicados.
Por lo tanto, LinkedHashSet
es una opción ideal para escenarios donde es necesario almacenar elementos únicos en orden de inserción.
2. Creación e inicialización de LinkedHashSet
Para crear un LinkedHashSet
objeto, necesitas inicializarlo usando un constructor. Aquí hay varios métodos de inicialización:
2.1 Constructor predeterminado
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
Esto creará un LinkedHashSet
objeto vacío con una capacidad inicial de 16 y un factor de carga de 0,75. Puede ajustar estos parámetros según sea necesario.
2.2 Especificación de capacidad y factores de carga
int initialCapacity = 20;
float loadFactor = 0.5f;
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(initialCapacity, loadFactor);
Al especificar la capacidad inicial y el factor de carga, puede tener un control más detallado LinkedHashSet
sobre el rendimiento y el uso de memoria de .
2.3 Crear a partir de una colección existente
También puede crear una a partir de una colección existente, como List
o para convertir entre diferentes tipos de colecciones:Set
LinkedHashSet
Set<String> existingSet = new HashSet<>(Arrays.asList("A", "B", "C"));
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(existingSet);
Esto inicializará el nuevo utilizando elementos de la colección existente LinkedHashSet
.
3. Operaciones básicas: agregar, eliminar y consultar elementos.
LinkedHashSet
Se proporcionan operaciones de recopilación comunes, que incluyen agregar, eliminar y consultar elementos. A continuación se muestran algunos ejemplos de operaciones básicas:
3.1 Agregar elementos
Utilice add
el método para LinkedHashSet
agregar elementos a:
linkedHashSet.add("D");
linkedHashSet.add("E");
3.2 Eliminar elementos
Utilice remove
el método para eliminar elementos LinkedHashSet
de :
linkedHashSet.remove("B");
3.3 Consultar si existe un elemento
Utilice contains
el método para comprobar si existe un elemento en LinkedHashSet
:
boolean containsC = linkedHashSet.contains("C");
4. Atravesar LinkedHashSet
La iteración LinkedHashSet
sobre los elementos generalmente utiliza un iterador o un bucle for mejorado. A continuación se muestran ejemplos de dos métodos transversales:
4.1 Atravesar usando iteradores
Iterator<String> iterator = linkedHashSet.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
4.2 Uso mejorado para recorrido de bucle
for (String element : linkedHashSet) {
System.out.println(element);
}
Independientemente del método transversal, LinkedHashSet
los elementos se devolverán en el orden en que fueron insertados, manteniendo así el orden.
5. Consideraciones de rendimiento para LinkedHashSet
LinkedHashSet
El rendimiento es HashSet
similar a , y la complejidad temporal de encontrar elementos es O (1), que se logra mediante una tabla hash. Pero a diferencia de HashSet
, LinkedHashSet
también necesita mantener la estructura de la lista vinculada, por lo que agregar y eliminar elementos puede ser HashSet
un poco más lento que . Pero normalmente esta pérdida de rendimiento es insignificante.
Es importante tener en cuenta que LinkedHashSet
la configuración inicial de capacidad y factor de carga afectará el rendimiento. Si la capacidad inicial es demasiado pequeña, puede dar lugar a operaciones frecuentes de expansión de capacidad y reducir el rendimiento. Una selección razonable de capacidad y factor de carga puede mejorar el rendimiento y reducir el uso de memoria.
6. Precauciones de uso
LinkedHashSet
Hay algunas cosas a considerar al usar :
LinkedHashSet
No es seguro para subprocesos. Si se usa en un entorno de subprocesos múltiples, se deben considerar los problemas de sincronización de subprocesos o las clases de colección seguras para subprocesosConcurrentLinkedHashSet
.LinkedHashSet
Está permitido almacenar unnull
elemento, pero generalmente se recomienda evitarnull
almacenarlo como elemento válido para evitar confusiones y errores.- Cuando utilice un objeto personalizado como
LinkedHashSet
elemento, debe implementarhashCode()
los métodos yequals()
correctamente para garantizar la unicidad y corrección del objeto en la colección. LinkedHashSet
El rendimiento suele ser muy alto, pero al procesar grandes cantidades de datos, se debe prestar atención a la configuración del factor de carga para evitar operaciones de expansión frecuentes.
7. Ejemplo de LinkedHashSet
Demostremos el escenario de uso con un código de muestra LinkedHashSet
:
7.1 Almacenamiento de la lista de estudiantes
Supongamos que queremos almacenar una lista de estudiantes y asegurarnos de que el nombre de cada estudiante sea único y esté en el orden en que fueron agregados. Podemos LinkedHashSet
hacer esto usando:
LinkedHashSet<String> studentNames = new LinkedHashSet<>();
studentNames.add("Alice");
studentNames.add("Bob");
studentNames.add("Charlie");
studentNames.add("Alice"); // 这个重复的元素将被忽略
for (String name : studentNames) {
System.out.println(name);
}
Producción:
Alice
Bob
Charlie
7.2 Registrar el historial de visitas al sitio web
Supongamos que queremos registrar el historial de visitas de los usuarios al sitio web y mantener el orden de las visitas. Podemos utilizar LinkedHashSet
para almacenar estos registros:
LinkedHashSet<String> visitHistory = new LinkedHashSet<>();
visitHistory.add("Homepage");
visitHistory.add("About Us");
visitHistory.add("Products");
visitHistory.add("Contact Us");
for (String page : visitHistory) {
System.out.println("Visited: " + page);
}
Producción:
Visited: Homepage
Visited: About Us
Visited: Products
Visited: Contact Us
8. Más usos de LinkedHashSet
Al utilizar LinkedHashSet
, además de las operaciones básicas, existen algunos métodos y técnicas de uso más, a continuación se muestran algunos de ellos:
8.1 Obtener el tamaño de LinkedHashSet
Puede utilizar size()
el método para obtener LinkedHashSet
la cantidad de elementos en:
int size = linkedHashSet.size();
Esto puede ayudarle a comprender el tamaño de su colección para que pueda tomar el control y la optimización adecuados al procesar sus datos.
8.2 Determinar si LinkedHashSet está vacío
Utilice isEmpty()
el método para comprobar LinkedHashSet
si está vacío; devolverá si no hay elementos en la colección; true
de lo contrario, devolverá false
:
boolean isEmpty = linkedHashSet.isEmpty();
Esto es útil al escribir lógica condicional para realizar diferentes acciones en función de si una colección está vacía.
8.3 Borrar LinkedHashSet
Si necesita borrar LinkedHashSet
todos los elementos en , puede utilizar clear()
el método:
linkedHashSet.clear();
Esto hará que la colección esté vacía y se eliminarán todos los elementos.
8.4 Copiar LinkedHashSet
Si necesita crear una LinkedHashSet
copia, puede utilizar el constructor o clone()
método:
LinkedHashSet<String> copySet = new LinkedHashSet<>(linkedHashSet);
// 或者
LinkedHashSet<String> copySet = (LinkedHashSet<String>) linkedHashSet.clone();
Esto clonará la colección original, lo que le permitirá trabajar en ella sin afectar la colección original.
8.5 Convertir a matriz
Puede LinkedHashSet
convertir los elementos en una matriz para obtener más flexibilidad con sus datos:
String[] array = linkedHashSet.toArray(new String[0]);
Esto devolverá una matriz que contiene los elementos de la colección. También puede elegir el tipo y tamaño de la matriz según sus necesidades.
8.6 Comparación de LinkedHashSets
Para comparar dos LinkedHashSet
por igualdad, puedes usar equals()
el método. Dos LinkedHashSet
se consideran iguales cuando tienen los mismos elementos y están dispuestos en el mismo orden.
LinkedHashSet<String> set1 = new LinkedHashSet<>(Arrays.asList("苹果", "香蕉", "橙子"));
LinkedHashSet<String> set2 = new LinkedHashSet<>(Arrays.asList("苹果", "香蕉", "橙子"));
boolean isEqual = set1.equals(set2); // 返回 true
8.7 Eliminación de elementos mediante iteradores
Como se mencionó anteriormente, el uso de iteradores puede eliminar elementos de forma segura y evitar ConcurrentModificationException
excepciones.
Iterator<String> iterator = linkedHashSet.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if (element.equals("B")) {
iterator.remove(); // 安全删除元素
}
}
Estos métodos y técnicas de uso adicionales pueden ayudarlo a procesar datos de manera más flexible LinkedHashSet
y satisfacer diferentes necesidades de programación. Ya sea para obtener el tamaño de una colección, borrar una colección o crear una copia de una colección, Java LinkedHashSet
proporciona una gran cantidad de funciones para satisfacer una variedad de necesidades.
9. Resumen
LinkedHashSet
Es una estructura de datos de almacenamiento de elementos única y ordenada en el marco de recopilación de Java. Hereda de HashSet
, por lo que tiene las propiedades de búsqueda rápida de una tabla hash y utiliza una lista vinculada para mantener el orden de inserción de los elementos. Esto lo hace útil en situaciones en las que necesita mantener los elementos ordenados y únicos.
Al utilizar LinkedHashSet
, puede controlar la capacidad y los factores de carga según sea necesario para equilibrar el rendimiento y el uso de memoria. Además, asegúrese de implementar sus métodos hashCode()
y objetos personalizados equals()
para que la unicidad del elemento se maneje correctamente.
Ya sea que necesite almacenar listas de estudiantes, registrar el historial de visitas al sitio web u otros elementos únicos organizados, LinkedHashSet
es una opción confiable que puede ayudarlo a resolver estos problemas fácilmente. Espero que este blog pueda ayudar a los principiantes a comprenderlo y aplicarlo mejor LinkedHashSet
y mejorar sus habilidades de programación Java.