Aktywne Wpisy
![ChickenDriver2](https://wykop.pl/cdn/c0834752/c5ff462d7c19e3d7697db81537a8898693fe9f7f63d4da78637ce0cb5fc7010f,q60.png)
#pracbaza
Klęska urodzaju.
Wygrałem rekrutację w firmie A. Dostałem ofertę. Przyjąłem ale na wypowiedzeniu (3 m-ce), krótko po jej przyjęciu dostałem zaproszenie w firmie B do rozmowy w sprawie pracy w fajniejszym zakresie, w większej firmie, z lepszymi opiniami na GW i w ogóle. Poszedłem pogadać, bo co mi szkodzi. Rzuciłem jeszcze większy hajs niż przyjąłem w A i tyle. No i po około miesiącu od przyjęcia oferty A, firma B złożyła
Klęska urodzaju.
Wygrałem rekrutację w firmie A. Dostałem ofertę. Przyjąłem ale na wypowiedzeniu (3 m-ce), krótko po jej przyjęciu dostałem zaproszenie w firmie B do rozmowy w sprawie pracy w fajniejszym zakresie, w większej firmie, z lepszymi opiniami na GW i w ogóle. Poszedłem pogadać, bo co mi szkodzi. Rzuciłem jeszcze większy hajs niż przyjąłem w A i tyle. No i po około miesiącu od przyjęcia oferty A, firma B złożyła
![Fennrir](https://wykop.pl/cdn/c3397992/Fennrir_cs8JlQF7mK,q60.jpg)
Fennrir +38
Niezła #patodeweloperka w #katowice przebijająca chyba nawet wrocławskie nadbudówki: trzykondygnacyjna nadbudowa stanowiąca połowę wysokości budynku. Kamienice są w ewidencji, ale konserwator najwyraźniej problemu nie widzi, co innego gdyby szaraczek chciał wymienić okna, wtedy już by była "ingerencja w wygląd zabytku". IMO powinien być bezwzględny zakaz nadbudowywania zabytkowych kamienic (z jedynymi dopuszczalnymi wyjątkami w celu odtworzenia oryginalnej wysokości czy wyrównania pierzei), bo to co się dzieje w ostatnich latach to jest kompletna patologia.
![Fennrir - Niezła #patodeweloperka w #katowice przebijająca chyba nawet wrocławskie na...](https://wykop.pl/cdn/c3201142/8e174cd6a987f0b628aa583f1cc493f23409734cdbaceecbf8576798bb86b9f3,w150.jpg)
źródło: dworcowa
Pobierz
Ale! Oprócz zabawnego zwracania wartości boolean, lub porównywania obiektów za pomocą == moze tam sie kryć takze coś ciekawego jesli ID jest typu java.lang.Integer (lub innym autoboxowanym typem). Spójrz na te 3 przykłady:
Integer a = 0;
Integer b = 0;
System.out.println(a == b);
Wyświetli:
Integer c = 100;
Integer d = 100;
System.out.println(c == d);
Wyświetli:
Integer e = 200;
Integer f = 200;
System.out.println(e == f);
Wyświetli:
Czemu tak się dzieje?
"Problemem" jest tutaj sposób w jaki java traktuje wartości prymitywne automatycznie spakowane jako obiekt (tzw. autoboxing). Zauważ, że w powyższym kodzie deklarujemy obiekt typu java.lang.Integer i przypisujemy do niego wartość typu int. Kluczem do zrozumienia powyższego dziwnego zachowania jest to w jaki sposób moze w ogóle takie przypisanie zajść. Otóż po skompilowaniu w miejsce "Integer a = 100;" automatycznie wstawiane jest "Integer a = Integer.valueOf(100);". Sprawdźmy to badając poniższy kod:
public class AutoboxingTest {
public static void main(String []args) {
Integer a = 3;
int b = a;
}
}
Po skompilowaniu i wygenerowaniu bytecode'u przez:
Otrzymujemy:
Compiled from "AutoboxingTest.java"
public class AutoboxingTest extends java.lang.Object{
public AutoboxingTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_3
1: invokestatic #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
4: astore_1
5: aload_1
6: invokevirtual #3; //Method java/lang/Integer.intValue:()I
9: istore_2
10: return
}
Gdzie jasno widzimy, że po kompilacji w/w magiczny autoboxing to po prostu wywołanie Integer.valueOf() podczas przypisania wartości int do Integer. Ale! To dalej nie tłumaczy dziwnego zachowania pokazanego na pierwszym przykładzie. Spójrzmy zatem co się kryje w kodzie źródłowym metody Integer.valueOf():
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
Kopiąc głębiej - kod IntegerCache:
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
Znaczy to tyle, że wartości Integer z zakresu -128 do 127 są utworzone podczas ładowania klasy IntegerCache do pamięci JVM i przetrzymane w postaci tablicy. Co za tym idzie - porównywanie obiektów Integer mieszczących się w tym zakresie będzie działać złudnie podobnie jak porównywanie prymitywnych typów int, ale to dalej jest wywoływanie == na obiekcie, co oznacza porównywanie referencji, a nie wartości obiektu co mamy w zamyśle. Wartość obiektu zawsze należy porównywać przez wywoływanie equals na danym obiecie.
PS: W Javie 1.6 i wyżej możemy z góry ustalić zakres cache'owanych zmiennych przez ustawienie zmiennej java.lang.Integer.IntegerCache.high
#programowanie #ciekawostkigrizwolda #naukaprogramowania #java