Generic Set in Java
Jakob Jenkov |
Java's Set
interface (java.util.Set
) can be generified. In other words,
instances of Set
can be given a type, so only instances of that type can
be inserted and read from that Set
. Here is an example:
Set<String> set = new HashSet<String>();
This set is now targeted at only String
instances, meaning only
String
instances can be put into this set. If you try to put
something else into this Set
, the compiler will complain.
The generic type checks only exists at compile time. At runtime it is possible to tweak your code so that a String Set has other objects that String's inserted. This is a bad idea, though.
Adding Elements to a Generic Set
Adding elements to a generic Set
is done using the add()
method, just like you have always done:
Set<String> set = new HashSet<String>(); String string1 = "a string"; set.add(string1);
So what is the big difference? Well, if you try to add an element that is not a
String
instance, to the Set
in the example above,
the compiler will complain. That's a pretty nice extra type check to have.
Iterating a Generic Set
You can iterate a generic Set
using an iterator, like this:
Set<String> set = new HashSet<String>(); Iterator<String> iterator = set.iterator(); while(iterator.hasNext()){ String aString = iterator.next(); }
Notice how it is not necessary to cast the object returned from the
iterator.next()
next call. Because the Set
is generified (has a type), the compiler knows that it contains String
instances. Therefore it is not necessary to cast the objects obtained from
it, even if it comes from its Iterator
.
You can also use the new for-loop, like this:
Set<String> set = new HashSet<String>(); for(String aString : set) { System.out.println(aString); }
Notice how a String
variable is declared inside the parantheses of
the for-loop. For each iteration (each element in the Set
) this
variable contains the current element (current String).
Tweet | |
Jakob Jenkov |