The Joy of Sets
W związku z niespodziewaną popularnością i bardzo gorącym przyjęciem nowego serwisu, postanowiłem – wyjątkowo – dodać kolejnego Puzzle’a, zanim poprzedni zostanie rozwiązany.
- Co pojawi się na ekranie po uruchomieniu poniższego kodu?
import java.util.HashSet;
import java.util.Set;
public class ShortSet {
public static void main(String[] args) {
Set<Short> s = new HashSet<Short>();
for (short i = 0; i < 100; i++) {
s.add(i);
s.remove(i - 1);
}
System.out.println(s.size());
}
}
Odpowiedzi:
(a) 1
(b) 100
(c) zostanie rzucony wyjątek
(d) żadne z powyższych
- Odpowiedź uzasadnij i wyjaśnij dlaczego tak to działa
- Jak poprawić powyższy kod, aby zachowywał się zgodnie z intuicją
Autorami zagadki są Joshua Bloch i William Pugh
Odpowiedź (b) 100
Uzasadnienie:
– wszelkie operacje arytmetyczne w Javie są wykonywane na int
– operacja i – 1 w wyniku da int, mimo że zmienna i to short
– kolekcje w Javie operują na obiektach, więc do metody remove() zostanie przekazany obiekt Integer, a nie Short (autoboxing). Do kolekcji będą dodawane obiekty Short (o wartości od 1 do 100) a usuwane będą obiekty Integer (od -1 do 99), których kolekcja nie posiada.
Aby kod zachowywał się intuicyjnie należy zrzutować wynik operacji i – 1 na typ short
public class ShortSet { public static void main(String[] args) { Set<Short> s = new HashSet<Short>(); for (short i = 0; i < 100; i++) { s.add(i); s.remove((short) (i - 1)); } System.out.println(s.size()); } }