Qual é a principal diferença entre Hashset, Treeset e Linkedhashset, Hashmap e como funciona em Java?

Eu só entendo que o LinkedHashSet não permite elementos duplicados quando está inserindo. Mas, eu não entendo como o Hashset funciona em java? Eu sei um pouco que o Hashtable é usado no Hashset, portanto, a hashtable usada para armazenar os elementos e aqui também não permite os elementos duplicados. Então, o Treeset também é semelhante ao Hashset, também não permite entradas duplicadas, para que elementos únicos sejam vistos e siga a ordem crescente.

Tenho mais uma dúvida sobre o HashMap - o Hashmap não mantém a ordem. Pode ter uma chave nula e vários valores nulos. Eu simplesmente não entendo isso e o que isso significa realmente? Algum exemplo prático para isso?

Eu sei um pouco, o Hashmap costumava trabalhar com base nisso - Chave e valores usados para colocar em baldes também têm números únicos. Para que possa identificar e obter a chave e o valor dos baldes. Quando coloco o par de chave / valor no intervalo cujo identificador é o código de hash da chave. Por exemplo: o código hash da chave é 101, portanto, ele é armazenado no intervalo 101. Um intervalo pode armazenar mais do que pares de chave e valor. Suponha um exemplo, já que o Objeto1 é "A", o Objeto2 é "A" e o Objeto3 é "B"; em seguida, ele possui o mesmo código Hash. Portanto, ele armazena os diferentes objetos compartilhando o mesmo Hashcode no mesmo bucket. A minha dúvida é que objetos com o mesmo código hash devem ser iguais e objetos diferentes devem ter códigos hash diferentes?

Eu sou iniciante, por favor, esclareça minhas dúvidas e me desculpe por essas dúvidas meio bobas!

,

Este é o programa usando o HashSet,

    import java.util.*;
    public class Simple{
    public static void main(String[] args){
    HashSet hh=new HashSet();
    hh.add("D");
    hh.add("A");
    hh.add("B");
    hh.add("C");
    hh.add("a");        
    System.out.println("Checking the size is:"+hh.size()+"");
    System.out.println(hh);

    Iterator i=hh.iterator();
    while(i.hasNext()){
    System.out.println(i.next());
    }      
    }
    }

A saída é,

Checking the size is:5
[D, A, B, a, C]
D
A
B
a
C

Minha dúvida é: por que "a" está sendo inserido entre "B" e "C".

Agora, estou usando o LinkedHashSet, então,

public class Simple{
public static void main(String[] args){
    LinkedHashSet hh=new LinkedHashSet();
            hh.add("D");
            hh.add("A");
    hh.add("B");
    hh.add("C");
            hh.add("a");  

        System.out.println("Checking the size is:"+hh.size()+"");
    System.out.println(hh);

    Iterator i=hh.iterator();
    while(i.hasNext()){
        System.out.println(i.next());
    }      
}
}

Eu só entendo isso, segue a ordem de inserção e evita elementos duplicados. Então a saída é,

Checking the size is:5
[D, A, B, C, a]
D
A
B
C
a

Agora, usando o Treeset: -

import java.util.*;
public class Simple{
public static void main(String[] args){
    TreeSet hh=new TreeSet();
            hh.add("1");
            hh.add("5");
            hh.add("3");
            hh.add("5");
            hh.add("2");
            hh.add("7");  

System.out.println("Checking the size is:"+hh.size()+"");
System.out.println(hh);

    Iterator i=hh.iterator();
    while(i.hasNext()){
        System.out.println(i.next());
    }      
}
}

Aqui, eu apenas entendo isso - Treeset segue a ordem crescente.

The output is,
Checking the size is:5
[1, 2, 3, 5, 7]
1
2
3
5
7

Então, minha dúvida é: como o Hashset funciona em Java? E eu sei que, o LinkedHashset segue uma lista duplamente vinculada. Se ele usa lista duplamente vinculada, como ele armazena os elementos? O que significa lista duplamente vinculada e como funciona? Então, onde todos esses três Hashset, Treeset, Linkedhashset seriam usados em Java e qual deles teria melhor desempenho em java?

questionAnswers(5)

yourAnswerToTheQuestion