...
Wiki Markup |
---|
This noncompliant code example prints {{100}} as the size of the {{HashSet}} while it is expected to print {{1}}. The combination of values of types {{short}} and {{int}} in the operation {{i-1}} leads to autoboxing of the result into an object of type {{Integer}}. (See [EXP08-J. Be aware of integer promotions in binary operators].) The {{HashSet}} contains values of only one type {{Short}} whereas the code attempts to remove objects of the (different) type {{Integer}}. As a result, the remove operation is equivalent to a _No Operation_ (NOP). The compiler enforces type checking so that only {{Short}} values are inserted, however, a programmer is free to remove an object of any type without triggering any exceptions because {{Collections<E>Collections<E>.remove()}} accepts an argument of type {{Object}} and not {{E}}. Such behavior can result in unintended object retention or memory leaks. \[[Techtalk 07|AA. Java References#Techtalk 07]\] |
Code Block |
---|
|
public class ShortSet {
public static void main(String[] args) {
HashSet<Short>HashSet<Short> s = new HashSet<Short>HashSet<Short>();
for(short i=0; i<i<100;100;i++) {
s.add(i);
s.remove(i - 1);
}
System.out.println(s.size());
}
}
|
...
Code Block |
---|
|
public class ShortSet {
public static void main(String[] args) {
HashSet<Short>HashSet<Short> s = new HashSet<Short>HashSet<Short>();
for(short i=0; i<i<100;100;i++) {
s.add(i);
s.remove((short)(i-1)); //cast to short
}
System.out.println(s.size());
}
}
|
...
Wiki Markup |
---|
\[[Core Java 04|AA. Java References#Core Java 04]\] Chapter 5
\[[JLS 05|AA. Java References#JLS 05]\] Section 5.1.7
\[[Techtalk 07|AA. Java References#Techtalk 07]\] ""The Joy of Sets"" |
...
EXP04-J. Be wary of invisible implicit casts when using compound assignment operators 04. Expressions (EXP) EXP06-J. Be aware of the short-circuit behavior of the conditional AND and OR operators