Archive for the ‘Zagadki’ Category
Zagadka: hackujemy kalkulator
Dawno nie było zagadki! Dziś łamigłówka dla hackerów:)
Poniżej znajduje się klasa Calculator
implementująca metodę add
. Metoda działa poprawnie (o ile nie przekroczy się zakresu inta, ale to nie jest przedmiotem zagadki). Należy tak zhackować kalkulator, aby źle dodawał:)
Read the rest of this entry »
Zagadka z magicznymi Stringami
W związku ze sporym zainteresowaniem i wieloma prośbami, przygotowałem kolejną zagadkę. Tym razem należy napisać kawałek złośliwego kodu, aby „zaczarować” fragment inwokacji tak, by podczas jego wypisywania na ekran, pojawił się zupełnie inny napis.
Oto kod zagadki: Read the rest of this entry »
Zagadka z Java Memory
Ostatnia zagadka okazała się bardzo łatwa. Zatem dziś pora na nieco trudniejszą i ciekawszą.
Oto kod zagadki.
public class JVMPuzzle { private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6); public void go() { { byte[] bytes1 = new byte[dataSize]; } // for (int i = 0; i < 3; i++) { // System.out.println("Barista prosi: JVM zwolnij pamięć!"); // } byte[] bytes2 = new byte[dataSize]; } public static void main(String[] args) { new JVMPuzzle().go(); } }
Po skompilowaniu i uruchomieniu powyższego kodu otrzymujemy java.lang.OutOfMemoryError
:
<barista@javaczyherbata.pl> java JVMPuzzle Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at JVMPuzzle.go(JVMPuzzle.java:14) at JVMPuzzle.main(JVMPuzzle.java:18)
Natomiast jeśli odkomentujemy linie 10-12, skompilujemy i uruchomimy program ponownie, to błąd braku pamięci się nie pojawi.
Jak to jest, że JVM słucha się Baristy? 🙂
Zagadka ze Stringami
Stosunkowo prosta lecz ciekawa zagadka dotycząca klasy String
. Dlaczego po uruchomieniu poniższego kodu otrzymujemy:
<barista@javaczyherbata.pl> java StringPuzzle true false
Zagadka z Iteratorem
Ciekawa zagadka znaleziona w sieci. Należy tak poprawić poniższy kod, aby na ekranie wyświetlił się napis Hello World
. Oczywiście wyjątek ConcurrentModificationException
(ani żaden inny) nie może się pojawić. Pozostałe obostrzenia to:
- w żaden sposób nie wolno modyfikować kodu poza sekcją
FIXME
- nie wolno użyć refleksji
- cały poniższy kod musi się wykonać; nie można użyć
System.exit(0)
lubreturn
public class IteratorPuzzle { public static void main(String[] args) { final Listlist = new ArrayList () {{ add("Hello"); }}; final Iterator iterator = list.iterator(); System.out.print(iterator.next()); list.add("World"); // FIXME: tutaj dopisujemy kod System.out.println(" " + iterator.next()); } }
Powodzenia:)