Diferencia y similitudes entre HashSet, LinkedHashSet y TreeSet en Java

En este artículo, aprenderemos la diferencia entre HashSet vs LinkedHashSet y TreeSet y las similitudes entre LinkedHashSet y TreeSet. HashSet, LinkedHashSet y TreeSet implementan la interfaz Set. Así que hemos tratado de enumerar las diferencias y similitudes entre HashSet, LinkedHashSet y TreeSet en Java.

Diferencias entre HashSet, LinkedHashSet y TreeSet: 

Características

HashSet

LinkedHashSet

ÁrbolConjunto

Trabajo interno

HashSet usa internamente HashMap para almacenar objetos

LinkedHashSet usa LinkedHashMap internamente para almacenar objetos

TreeSet usa TreeMap internamente para almacenar objetos

Cuándo usar

Si no desea mantener el orden de inserción pero desea almacenar objetos únicos

Si desea mantener el orden de inserción de los elementos, puede usar LinkedHashSet

Si desea ordenar los elementos de acuerdo con algún comparador, use TreeSet

Ordenar

HashSet no mantiene el orden de inserción

LinkedHashSet mantiene el orden de inserción de los objetos

Mientras que TreeSet ordena los elementos según el Comparador proporcionado. De forma predeterminada, los objetos se colocarán según su orden ascendente natural.

Complejidad de las Operaciones

HashSet brinda complejidad O (1) para insertar, eliminar y recuperar objetos

LinkedHashSet proporciona el rendimiento de las operaciones de inserción, eliminación y recuperación en el orden O(1).

Mientras que TreeSet ofrece el rendimiento del orden O(log(n)) para las operaciones de inserción, eliminación y recuperación.

Actuación

El rendimiento de HashSet es mejor en comparación con LinkedHashSet y TreeSet.

El rendimiento de LinkedHashSet es más lento que el de TreeSet. Es casi similar a HashSet pero más lento porque LinkedHashSet mantiene internamente LinkedList para mantener el orden de inserción de los elementos.

El rendimiento de TreeSet es mejor que LinkedHashSet excepto para las operaciones de inserción y eliminación porque tiene que ordenar los elementos después de cada operación de inserción y eliminación.

Comparar

HashSet usa los métodos equals() y hashCode() para comparar los objetos

LinkedHashSet usa los métodos equals() y hashCode() para comparar sus objetos

TreeSet usa los métodos compare() y compareTo() para comparar los objetos

Elementos nulos

HashSet permite solo un valor nulo.

LinkedHashSet solo permite un valor nulo.

TreeSet no permite valores nulos. Si inserta un valor nulo en TreeSet, lanzará NullPointerException.

Sintaxis

HashSet obj = nuevo HashSet();

LinkedHashSet obj = nuevo LinkedHashSet();

TreeSet obj = new TreeSet();

Diferencias entre HashSet, LinkedHashSet y TreeSet según el orden de inserción y el tiempo empleado:
 

Java

// Java program to demonstrate difference between
// HashSet, LinkedHashSet and TreeSet according
// to insertion order and insertion time
 
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
 
class GFG1 {
    // Function show insertion order of
    // LinkedHashSet, TreeSet and HashSet
 
    private static void insertionOrder()
    {
        LinkedHashSet<String> geekLinkSet
            = new LinkedHashSet<>();
        TreeSet<String> geekTreeSet = new TreeSet<>();
        HashSet<String> geekHashSet = new HashSet<String>();
 
        // Add three object in
        // LinkedHashSet and TreeSet
        for (String str : Arrays.asList("Geek2", "Geek1",
                                        "Geek3", "Geek1")) {
 
            geekLinkSet.add(str);
            geekTreeSet.add(str);
            geekHashSet.add(str);
        }
 
        // should be sorted order HashSet
        // stores element in sorted order
        System.out.println("Insertion Order"
                           + " of objects in HashSet :"
                           + geekHashSet);
 
        // insertion order or elements LinkedHashSet
        // storeds elements as insertion
        System.out.println("Insertion Order of "
                           + "objects in LinkedHashSet :"
                           + geekLinkSet);
 
        // should be sorted order TreeSet
        // stores element in sorted order
        System.out.println("Insertion Order of"
                           + " objects in TreeSet :"
                           + geekTreeSet);
    }
 
    // Function calculate insertion time of
    // 1000 objects of LinkedHashSet,
    // TreeSet and HashSet
 
    private static void insertionTime()
    {
        // HashSet performance Test
        // inserting 1000 elements
        HashSet<Integer> numbersHS = new HashSet<>();
        long startTime = System.nanoTime();
        for (int i = 0; i < 1000; i++) {
            numbersHS.add(i);
        }
        long endTime = System.nanoTime();
        System.out.println("Total time to insert"
                           + " 1000 elements in"
                           + " HashSet in nanoseconds: "
                           + (endTime - startTime));
 
        // LinkedHashSet performance Test
        // inserting 1000 elements
        LinkedHashSet<Integer> numbersLLS
            = new LinkedHashSet<>();
 
        startTime = System.nanoTime();
        for (int i = 0; i < 1000; i++) {
            numbersLLS.add(i);
        }
        endTime = System.nanoTime();
        System.out.println("Total time to insert"
                           + " 1000 elements in"
                           + " LinkedHashSet nanoseconds: "
                           + (endTime - startTime));
 
        // TreeSet performance Test inserting 1000 objects
        TreeSet<Integer> numbersTS = new TreeSet<>();
 
        startTime = System.nanoTime();
        for (int i = 0; i < 1000; i++) {
            numbersTS.add(i);
        }
        endTime = System.nanoTime();
        System.out.println("Total time to insert"
                           + " 1000 elements in"
                           + " TreeSet in nanoseconds: "
                           + (endTime - startTime));
    }
 
    // Function calculate deletion time
    // of 1000 objects LinkedHashSet,
    // TreeSet and HashSet
    // Deletion time always vary
    private static void deletion()
    {
        // HashSet performance Test inserting
        // and deletion 1000 elements
        HashSet<Integer> deletionHS = new HashSet<>();
 
        for (int i = 0; i < 1000; i++) {
            deletionHS.add(i);
        }
 
        long startingTime = System.nanoTime();
        for (int i = 0; i < 1000; i++) {
            deletionHS.remove(i);
        }
 
        long endedTime = System.nanoTime();
        System.out.println(
            "Total time to Deletion "
            + "1000 elements in HashSet in nanoseconds: "
            + Math.abs(startingTime - endedTime));
 
        // LinkedHashSet  performance Test inserting
        // and deletion 1000 elements
        LinkedHashSet<Integer> deletionLLS
            = new LinkedHashSet<>();
 
        for (int i = 0; i < 1000; i++) {
            deletionLLS.add(i);
        }
        startingTime = System.nanoTime();
        for (int i = 0; i < 1000; i++) {
            deletionLLS.remove(i);
        }
 
        endedTime = System.nanoTime();
        System.out.println(
            "Total time to Deletion 1000"
            + " elements in LinkedHashSet in nanoseconds: "
            + Math.abs(startingTime - endedTime));
 
        // TreeSet performance Test inserting
        // and deletion 1000 elements
        TreeSet<Integer> deletionTS = new TreeSet<>();
 
        for (int i = 0; i < 1000; i++) {
            deletionTS.add(i);
        }
 
        startingTime = System.nanoTime();
        for (int i = 0; i < 1000; i++) {
            deletionTS.remove(i);
        }
 
        endedTime = System.nanoTime();
        System.out.println(
            "Total time to Deletion 1000"
            + " elements in TreeSet in nanoseconds: "
            + Math.abs(startingTime - endedTime));
    }
 
    public static void main(String args[])
    {
 
        insertionOrder();
        insertionTime();
        deletion();
    }
}
Producción

Insertion Order of objects in HashSet :[Geek3, Geek2, Geek1]
Insertion Order of objects in LinkedHashSet :[Geek2, Geek1, Geek3]
Insertion Order of objects in TreeSet :[Geek1, Geek2, Geek3]
Total time to insert 1000 elements in HashSet in nanoseconds: 791869
Total time to insert 1000 elements in LinkedHashSet nanoseconds: 882417
Total time to insert 1000 elements in TreeSet in nanoseconds: 11797657
Total time to Deletion 1000 elements in HashSet in nanoseconds: 834509
Total time to Deletion 1000 elements in LinkedHashSet in nanoseconds: 898922
Total time to Deletion 1000 elements in TreeSet in nanoseconds: 7437577

Similitudes entre HashSet, LinkedHashSet y TreeSet:

  • Duplicados: HashSet, LinkedHashSet y TreeSet son implementos de la interfaz Set, por lo que no se les permite almacenar objetos duplicados.
     
  • Seguro para subprocesos: si queremos usar HashSet, LinkedHashSet y TreeSet en un entorno de subprocesos múltiples, primero lo sincronizamos externamente porque tanto LinkedHashSet como TreeSet no son seguros para subprocesos. 
     
  • Los tres son clonables y serializables.

Cuándo usar HashSet, TreeSet y LinkedHashSet en Java: 

  1. HashSet: si no desea mantener el orden de inserción pero desea almacenar objetos únicos. 
  2. LinkedHashSet: si desea mantener el orden de inserción de los elementos, puede usar LinkedHashSet. 
  3. TreeSet: si desea ordenar los elementos de acuerdo con algún comparador, use TreeSet.

Entonces, como ve el resultado del programa anterior de acuerdo con eso y de acuerdo con sus requisitos, puede elegir cualquiera de HashSet, TreeSet y LinkedHashSet.

Publicación traducida automáticamente

Artículo escrito por Rajput-Ji y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *