Java Hungry
nas principais perguntas da entrevista do java , é comum ser bombardeado com perguntas da estrutura de coleção . Fui entrevistado no Goldman Sachs, e lá eles fizeram uma pergunta onde fiquei estupefato . Entrevistador perguntou como você implementa Set em Java em outras palavras trabalho interno de Hashset ou como hashset funciona em java. Ou seja, como garantirá que cada elemento seja único sem usar interfaces ou Classes definidas que implementem a interface definida .
Leia também: como o mapa hash funciona em java
eu dei a resposta, embora qualificasse a rodada de entrevista também, mas a resposta está longe de ser satisfatória .
então eu voltei para casa e fazer alguma pesquisa . Então, finalmente eu tenho a resposta e compartilhá-lo com você .
Implementação do Conjunto Internamente em Java
Cada elemento do conjunto é único . Para que não haja nenhum elemento duplicado em set .
Assim, em java, se queremos adicionar elementos no conjunto, em seguida, escrevemos o código como este
public class JavaHungry { public static void main(String args) { // TODO Auto-generated method stub HashSet<Objeto> hashset = new HashSet<Objeto>(); hashset.adicionar (3); hashset.adicionar ("Java com fome"); hashset.adicionar ("Blogspot"); sistema.as.println ("conjunto é" + hashset); }}
ele imprimirá o resultado : O conjunto é
Agora vamos adicionar elemento duplicado no código acima
public class JavaHungry { public static void main(String args) { HashSet<Objeto> hashset = new HashSet<Objeto>(); hashset.adicionar (3); hashset.adicionar ("Java com fome"); hashset.adicionar ("Blogspot"); hashset.adicionar (3); // elementos duplicados hashset.adicionar ("Java com fome"); / / sistema de elementos duplicados.as.println ("conjunto é" + hashset); }}
ele imprimirá o resultado : Set é
agora, o que acontece internamente quando você passa elementos duplicados no método add () do objeto Set , ele retornará false e não adicionará ao HashSet , pois o elemento já está presente .até agora tão bom .
mas surge o principal problema de como ele retorna false . Então aqui está a resposta
Quando você abrir o HashSet implementação do método add() em Java Apis que é rt.jar , você vai encontrar o seguinte código
público de classe HashSet<E>estende-se AbstractSet<E>implementa Set<E>, Cloneable, java.io.Serializable {private transient HashMap< e,Object > map; // Dummy value para associar a um objeto no mapa de suporte private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap<>(); } // algum código, ou seja, outros métodos no Hash Set public boolean add ( E e) {return map.put (e, PRESENT) = = null;} / / algum código, ou seja, outros métodos no conjunto de Hash}
portanto, estamos alcançando exclusividade no Set, internamente em java por meio do HashMap . Sempre que você criar um objeto de HashSet, ele criará um objeto de HashMap, como você pode ver nas linhas itálicas no código acima .
já discutimos como o HashMap funciona internamente em java .
como sabemos no HashMap, cada chave é única . Então, o que fazemos no conjunto é que passamos o argumento no add(Elemene E) que é E como uma chave no HashMap . Agora precisamos associar algum valor à chave, então o que o desenvolvedor de apis Java fez é passar o valor fictício que é ( New Object () ) que é referido por Object reference PRESENT .
então, na verdade, quando você está adicionando uma linha em HashSet como hashset.adicione (3) o que o java faz internamente é que ele colocará esse elemento e aqui 3 como uma chave no HashMap(criado durante a criação do objeto HashSet) e algum valor fictício que é o objeto do objeto é passado como um valor para a chave .
agora, se você vir o código do método HashMap put (Key k, Value V), você encontrará algo assim
public V put (K key, V value) {
//algum código
}
o ponto principal a ser observado no código acima é que put (key,value) retornará
1. null, se a chave for única e adicionada ao mapa
2. Valor antigo da chave, se a chave for duplicada
portanto, no método HashSet add (), verificamos o valor de retorno do mapa.coloque o método(key,value) com valor nulo
ou seja,
public boolean add(E e) {
return map.put (e, presente) = = null;