Je veux savoir pourquoi l'implémentation de HashSet, LinkedHashSet et TreeSet n'autorise pas les éléments NULL?.
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+" ");
}
}
Guidez-moi s'il-vous-plaît.
C'est pourquoi je n'aime pas utiliser la boxe automatique. Les collections Java ne peuvent pas stocker de primitives (pour cela, vous aurez besoin d'une API tierce telle que Trove ). Donc, vraiment, quand vous exécutez du code comme ceci:
hashSet.add(2);
hashSet.add(5);
Ce qui se passe réellement est:
hashSet.add(new Integer(2));
hashSet.add(new Integer(5));
Ajouter un null à l'ensemble de hachage est non le problème, cette partie fonctionne très bien. Votre NPE vient plus tard, lorsque vous essayez de décompresser vos valeurs dans une primitive int:
while(it.hasNext()){
int i = it.next();
System.out.print(i+" ");
}
Lorsque la valeur null
est rencontrée, la machine virtuelle Java tente de la décompresser dans une primitive int, ce qui conduit à un NPE. Vous devriez changer votre code pour éviter ceci:
while(it.hasNext()){
final Integer i = it.next();
System.out.print(i+" ");
}
Non, Set Interface autorise la valeur NULL seule sa mise en oeuvre, à savoir TreeSet
, n'autorise pas la valeur NULL.
même si vous n'avez pas écrit de code d'itération et que vous n'avez que oTreeSet.add(null)
dans votre code, celui-ci est compilé et à à l'exécution, il renvoie NullPointerException.
La méthode add()
de la classe TreeSet
appelle en interne la méthode put()
de la classe TreeMap .null
valeur n'est pas autorisée comme le code ci-dessous dans la méthode put ()
if (key == null)
throw new NullPointerException();
Set Interface n'autorise pas la valeur null, car dans TreeSet, l'élément est stocké dans l'ordre de tri afin que chaque fois que nous ajoutons un nouvel élément, il compare la valeur et le tri s'effectue. donc ce qui se passe en interne compare la nouvelle valeur Null ajoutée aux valeurs existantes, de sorte qu’elle lève NullPointerException.
String str=null;
if(str.equals("abc"))
{
}
//it will throw null pointer exception
C'est pourquoi il n'autorise pas les valeurs NULL.
Le point de l'interface Set
est d'utiliser des informations sur les éléments (codes de hachage ou comparaisons) pour accélérer la mise en œuvre.
null
n'a pas cette information.
Set permet d'ajouter null pour que ce ne soit pas un problème. Deuxièmement, le programme Java doit d'abord être compilé pour le convertir en code octet, puis il est exécuté. NullPointerException
est une exception levée pendant l'exécution. Le temps de compilation ne devrait pas être un problème. Voyons maintenant pourquoi vous obtenez NPE.
Iterator
ici est supposé générer l'objet de type Integer
et nous souhaitons stocker le résultat dans la variable primitive type int
. Integer est une classe qui peut avoir les références de son type pour référencer à null mais les primitives ne peuvent pas contenir de valeurs nulles.
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+" ");
}
Lorsqueint i = it.next();
est exécuté, alors public int intValue()
est appelé pour convertir l'objet of Integer en primitive int. Lorsque it.next()
renvoie la valeur null, lanull.intValue()
est exécutée, ce qui entraîne NullPointerException
.
si Integer est utilisé à la place de int, il n'y aura pas d'exception
Integer i = it.next();
Seulement TreeSet
aura le temps d'exécution Null pointer Exception
et HashSet
n'aura aucune erreur au moment de la compilation, et le temps d'exécution n'autorisera qu'une valeur null
. Si nous entrons plus que cela, cela passera dans HashSet
. Vois ici:
public class HasSetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//no error it will print only one null and 2,5,8
Set<Integer> s = new HashSet<Integer>();
s.add(2);
s.add(5);
s.add(8);
s.add(null);
s.add(null);//it will override and hashset will allow one null value
Iterator i=s.iterator();
while(i.hasNext()){
Object in=(Object)i.next();
System.out.println(" hi "+in);
}
}
}
hi null
hi 2
hi 5
hi 8
public class SetDemo {
public static void main(String[] args) {
// either its may be string or integer it will give NullPointerException in run time
Set<String> s2 = new TreeSet<>();
s2.add("ramana");
s2.add(null);
s2.add("4");
s2.add("5");
s2.add(null);
Iterator<String> i=s2.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
}
}
Exception in thread "main" Java.lang.NullPointerException
at Java.util.TreeMap.put(Unknown Source)
at Java.util.TreeSet.add(Unknown Source)
at com.sagili.set.SetDemo.main(SetDemo.Java:13)
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+" ");
}
}
}
Mon code fonctionne et pourquoi il vous donnera Nullpointer J'ai essayé de trier hashset qui contient la valeur Null, il vous donnera une exception, sinon cela fonctionnera bien.