studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones java null hashset

java - reales - Estos conjuntos permiten nulos. ¿Por qué no puedo agregar elementos nulos?



libro de android studio en español pdf (9)

1) ¿Estás seguro de que obtienes un error de tiempo de compilación ? No lo creo, creo que el código arroja NPE en tiempo de ejecución en

int i = it.next();

2) De hecho, la interfaz java.util.Set no prohíbe los elementos nulos, y algunas implementaciones de JCF Set también permiten elementos nulos:

Set API: A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element. A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element.

HashSet API: This class permits the null element .

API LinkedHashSet: This class provides all of the optional Set operations, and permits null elements

TreeSet.add API - throws NullPointerException - if the specified element is null and this set uses natural ordering, or its comparator does not permit null elements

Quiero saber por qué la implementación de HashSet, LinkedHashSet y TreeSet no permite elementos nulos. Cuando intento ejecutar el siguiente código, se produce una excepción de puntero nulo.

public static void main(String[] args) { HashSet<Integer> hashSet = new HashSet<Integer>(); hashSet.add(2); hashSet.add(5); hashSet.add(1); // hashSet.add(null); will throw null pointer hashSet.add(999); hashSet.add(10); hashSet.add(10); hashSet.add(11); hashSet.add(9); hashSet.add(10); hashSet.add(000); hashSet.add(999); hashSet.add(0); Iterator<Integer> it = hashSet.iterator(); while(it.hasNext()){ int i = it.next(); System.out.print(i+" "); } }

Por favor guíame.


Agregar nulo a las colecciones como HashSet Arraylist creará problemas solo cuando la colección se use para ordenar. Aparte de eso, el valor nulo funcionará para el iterador y el escenario normal para mostrar el contenido de la lista o conjunto.


El punto de la interfaz de Set es utilizar información sobre los elementos (ya sea hashcodes o comparaciones) para acelerar la implementación.

null no tiene esa información.


Establecer interfaz utiliza internamente la clase de implementación HashMap. Cada vez que usamos add (), nuestro valor proporcionado se almacena en Map como clave para el valor que crea un objeto vacío.

Por lo tanto, el mapa no permite duplicados.


No, Set Interface permite solo un valor nulo en su implementación, es decir, TreeSet no permite un valor nulo.

aunque no haya escrito el código de iteración y solo tenga oTreeSet.add(null) en su código, éste lo compila y en tiempo de ejecución lanza NullPointerException.

El método add() la clase TreeSet llama internamente al método put() de la clase TreeMap. null valor null no está permitido como el código siguiente en el método put ()

if (key == null) throw new NullPointerException();


Por eso no me gusta confiar en el boxeo automático. Las Colecciones Java no pueden almacenar primitivas (para eso necesitarás una API de terceros como Trove ). Entonces, realmente, cuando ejecutas código como este:

hashSet.add(2); hashSet.add(5);

Lo que realmente está sucediendo es:

hashSet.add(new Integer(2)); hashSet.add(new Integer(5));

Agregar un nulo al conjunto de hash no es el problema, esa parte funciona bien. Su NPE viene más tarde, cuando intenta desempaquetar sus valores en un int primitivo:

while(it.hasNext()){ int i = it.next(); System.out.print(i+" "); }

Cuando se encuentra el valor null , la JVM intenta desempaquetarlo en una primitiva int, lo que lleva a una NPE. Debes cambiar tu código para evitar esto:

while(it.hasNext()){ final Integer i = it.next(); System.out.print(i+" "); }


Set Interface no permite nulos porque en TreeSet, almacena el elemento en orden de clasificación, así que cada vez que agregamos un nuevo elemento, se compara el valor y luego se ordena. así que internamente, lo que sucede es que compara el nuevo valor nulo agregado con los valores existentes, por lo que lanzará NullPointerException.

String str=null; if(str.equals("abc")) { } //it will throw null pointer exception

Es por eso que no permite valores nulos.


Set permite agregar nulo para que no sea un problema. En segundo lugar, el programa Java debe compilarse primero para convertirlo en código de bytes y luego se ejecuta. NullPointerException es una excepción lanzada durante el tiempo de ejecución. El tiempo de compilación no debería ser un problema. Ahora analicemos como por qué obtienes NPE.

Aquí se supone que el Iterator el objeto de tipo Integer y deseamos almacenar el resultado en primitive type int variable primitive type int . Integer es una clase que puede tener las referencias de su tipo para hacer referencia a null, pero las primitivas no pueden contener valores nulos.

Iterator<Integer> it = hashSet.iterator(); // Iterator of Type Integer while(it.hasNext()){ int i = it.next(); // it.next outputs Integer, but result is tried to be held in a primitive type variable System.out.print(i+" "); }

Cuando int i = it.next(); se ejecuta y luego se invoca public int intValue() para convertir el Objeto de Integer en int primitivo. Cuando it.next() devuelve null, se null.intValue() lo que da como resultado la null.intValue() NullPointerException .

Si se usa Integer en lugar de int, no habrá excepción

Integer i = it.next();


public class JavaHashSetTest { public static void main(String[] args) { Set<Integer> hashset= new HashSet<Integer>(); hashset.add(null); hashset.add(22); hashset.add(222); hashset.add(null); hashset.add(11); hashset.add(233); // TreeSet<String> tset=hashset; Iterator<Integer> it = hashset.iterator(); while(it.hasNext()){ Integer i = it.next(); System.out.print(i+" "); } } }

Mi código está funcionando y por eso le dará Nullpointer. He intentado ordenar un hashset que contiene un valor nulo y, a continuación, le dará una excepción. De lo contrario, funcionará bien.