Proszę spojrzeć na poniższe zdjęcie. Kiedy tworzymy obiekt w java za pomocą new
słowa kluczowego, otrzymujemy adres pamięci z systemu operacyjnego.
Kiedy piszemy out.println(objName)
, na wyjściu widzimy „specjalny” ciąg. Moje pytania to:
- Co to za wynik?
Jeśli jest to adres pamięci podany przez system operacyjny:
a) Jak mogę zamienić ten ciąg na binarny?
b) Jak mogę uzyskać jeden adres zmiennych całkowitych?
Odpowiedzi:
To jest nazwa klasy i System.identityHashCode () oddzielone znakiem „@”. To, co reprezentuje kod skrótu tożsamości, jest specyficzne dla implementacji. Często jest to początkowy adres pamięci obiektu, ale obiekt może z czasem zostać przeniesiony do pamięci przez maszynę wirtualną. Więc (krótko) nie możesz polegać na tym, że to cokolwiek.
Pobieranie adresów pamięci zmiennych jest bez znaczenia w Javie, ponieważ JVM może implementować obiekty i przenosić je tak, jak wydaje się to odpowiednie (Twoje obiekty mogą / będą się poruszać podczas czyszczenia pamięci itp.)
Integer.toBinaryString () zwróci liczbę całkowitą w postaci binarnej.
źródło
identityHashcode
nie jest bez znaczenia, po prostu nie jest niezawodny. :)Jest to możliwe, używając
sun.misc.Unsafe
: zobacz tę świetną odpowiedź od @Peter Lawrey -> Czy jest sposób na uzyskanie adresu referencyjnego?Używanie jego kodu do printAddresses ():
Ustawiłem ten test:
Oto wynik:
Wniosek:
źródło
To jest wynik implementacji metody „toString ()” Object. Jeśli twoja klasa przesłania metodę toString (), wypisze coś zupełnie innego.
źródło
To nie jest adres pamięci. To jest nazwa klasy @ hashcode
gdzie
nazwa klasy = pełna nazwa kwalifikowana lub nazwa bezwzględna (tj. nazwa pakietu, po której następuje nazwa klasy)
hashcode = format szesnastkowy (System.identityHashCode (obj) lub obj.hashCode () poda hashcode w formacie dziesiętnym)
źródło
Jak powiedział Sunil, to nie jest adres pamięci, to tylko hashcode
Aby uzyskać tę samą @ content, możesz:
Jeśli hashCode nie jest zastępowany w tej klasie:
Jeśli hashCode zostanie zastąpiony, otrzymasz oryginalną wartość z:
Jest to często mylone z adresem pamięci, ponieważ jeśli nie nadpisujesz hashCode (), adres pamięci jest używany do obliczania skrótu.
źródło
To, co otrzymujesz, jest wynikiem działania metody toString () klasy Object lub, dokładniej, identyfikacjiHashCode (), jak wskazał uzay95.
„Kiedy tworzymy obiekt w Javie z nowym słowem kluczowym, otrzymujemy adres pamięci z systemu operacyjnego”.
Ważne jest, aby zdać sobie sprawę, że wszystko, co robisz w Javie, jest obsługiwane przez wirtualną maszynę Java. To JVM przekazuje te informacje. To, co faktycznie dzieje się w pamięci RAM systemu operacyjnego hosta, zależy całkowicie od implementacji środowiska JRE.
źródło
warto wiedzieć o hashcode w java:
http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/
źródło
W Javie, kiedy tworzysz obiekt z takiej klasy
Person p = new Person();
, wp
rzeczywistości jest to adres lokalizacji pamięci, która wskazuje na typPerson
.Kiedy używasz statystyk do drukowania
p
, zobaczysz adres.new
Kluczowym słowem czyni nową lokalizację pamięci zawierającą wszystkie zmienne instancji i metod, które są zawarte wclass Person
ip
jest zmienną odniesienia wskazując tym miejscu pamięci.źródło