poniedziałek, 27 września 2010

Mroczna strona Javy - czyli SCJP rok później

Dzisiaj krótki post - zasilacz w laptopie mi padł, więc miałem ograniczone możliwości w pisaniu, ale za tydzień to nadrobię. Przygotowując się w zeszłym roku do certyfikatu SCJP udało mi się poznać mroczną stronę Javy.

Najciekawsze ze swoich spostrzeżeń opublikowałem na ówczesnym blogu w formie zagadek. Niestety wraz z zakończeniem pracy w Sunie straciłem możliwość rozwijania ówczesnego bloga, dlatego nowe posty zaczynają pojawiać się tutaj, a nie tam. Zachęcam jednak do zapoznania się z postami na starym blogu:
http://blogs.sun.com/mateusz_herbut/category/SCJP

Przyznam się, że dzisiaj nie wiedziałem jaka jest odpowiedź na zagadkę #3, pomimo, że rok temu sam tą zagadkę układałem :P

Skoro mowa o SCJP, to warto wspomnieć, że certyfikat ten zmienił nazwę. Od kilku tygodni to nie SCJP, a OCPJP czyli Oracle Certified Professional Java Programmer. Zmiana nazwy dotyczy wszystkich certyfikatów Suna i jest spowodowana koniecznością ujednolicenia nazw certyfikatów względem tych oferowanych przez Oracle'a

8 komentarzy:

  1. Ja stawiam na C w zagadce #3 ;)

    OdpowiedzUsuń
  2. Ja wynika z komentarzy, ponad rok temu stawiałeś na B :)

    OdpowiedzUsuń
  3. Jak zrobicie "equals" będzie C

    if(((Double)k).equals(Double.NaN))
    System.out.print(k);
    System.out.print(k);
    :P
    Przecież "==" to porównuje czy 2 referencje odwołują się do tego samego obiektu. No sorry, dajcie coś trudniejszego :P :D

    OdpowiedzUsuń
  4. Na prośbę Javy - coś trudniejszego :D

    public class Main {
    public static void main(String[] args) {
    spr(127, 127);
    spr(128, 128);
    }
    static void spr(Integer i1, Integer i2) {
    if (i1 == i2){
    System.out.println("=");
    }
    if (i1.equals(i2)){
    System.out.println("eq");
    }
    }
    }

    Pytanie: Ile razy na ekranie wyświetli się "=" a ile razy "eq" i dlaczego?

    OdpowiedzUsuń
  5. Nie zaglądałam tu przez jakiś czas ;)
    =
    eq
    eq

    A dlaczego tak jest to do końca nie wiem, ale wiem, że jest zasada, że jeśli obiekty są utworzone przez boxing, tak jak te Integery tutaj, to jeśli odpowiedniki ich prymitywów są <= 127 to "==" działa jak dla prymitywów. Jeśli są >127 to są to 2 różne obiekty.

    OdpowiedzUsuń
  6. No, prawidłowa odpowiedź, widzę, że Cię nie zagnę :) a z tym boxingiem tylko dodam, że zmienne od -128 do 127 utworzone w ten sposób są przechowywane w specjalnym fragmencie pamięci (coś na styl puli Stringów)

    OdpowiedzUsuń
  7. Ten specjalny fragment pamięci to statyczna klasa (valueOfCache) ze statycznym polem (CACHE) będącym tablicą 256 obiektów klasy Integer

    OdpowiedzUsuń