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