2013-02-22 10 views
9

Łańcuchy Java są niezmienne, a tworzenie instancji wielu łańcuchów o tych samych wartościach powoduje zwrócenie tego samego wskaźnika obiektu. (Czy jest to termin "pulowanie" wydaje się pasować, ale to już odnosi się do buforowania, aby zaoszczędzić czas, wykonując mniej instancji.)Czy Java optymalizuje niezmienne obiekty?

Czy Java też to robi (rzecz bez określenia) z innymi (zdefiniowane przez użytkownika) klasy, które są niezmienne? Czy Java może wykryć, że klasa jest niezmienna, czy jest to coś unikalnego dla klasy ciągów?

+0

+1 Interesujące pytanie. Wierzę, że Java może rozpoznać klasy posiadające tylko członków końcowych i traktować je jako niezmienne, ale nie mam dokładnych informacji na ten temat. Będę sprawdzać to pytanie. Dziękuję – gd1

+2

Nie, i rozważ, co by się stało, gdybyś tak czy inaczej zmienił niezmienny obiekt, z odbiciem. – harold

+0

Widzę, jestem trochę zaskoczony. Dzięki – gd1

Odpowiedz

7

Wrt. Ciągi, słowo, którego szukasz, to interning.

Java nie zrobi tego dla własnych niezmiennych obiektów. Mimo to ma buforowane wersje pudełkowych prymitywów. Aby uzyskać więcej informacji, zobacz ten artykuł na stronie wrapper class caching.

0

String Interning jest unikalny tylko dla klasy String. Przypuszczam, że JVM nie stosuje tych reguł dla klas zdefiniowanych przez użytkownika.

1

Termin, którym się przyglądasz, polega na sygnalizowaniu. Java optymalizuje łańcuchy "automatycznie" podczas kompilacji i daje programistom możliwość zrobienia tego w środowisku wykonawczym. (Szczegóły dotyczące optymalizacji zależą od wersji JVM).

W przypadku obiektów niezmiennych. Nie sądzę, że Java obsługuje żadnego rodzaju mechanizm, który rozwiąże to samo miejsce. Typ łańcucha nie jest wyjątkiem tej reguły.

Powód, dla którego konieczne jest użycie operatora new do utworzenia instancji. Jeśli użyjesz new do utworzenia instancji napisu, zawsze otrzymasz dwa różne obiekty.

Ta oferta jest dostępna tylko dla typu String. Ale koncepcja jest darmowa, możesz dodać do swojej niezmiennej klasy taką metodę i napisać metodę kompilowaną, która zrobi to samo.

2

Tak jak inni mówili, ten proces ze stringami jest znany jako interning.

Warto wspomnieć, że zachowanie struny te same wartości literalne jest ten sam przedmiot może lub nie może być prawdą w Javie 7. Od 7 roku:

W JDK 7, internowany struny nie są już przydzielane w stałym generowaniu sterty Java, ale są przydzielane w głównej części sterty Java (znanej jako młode i stare generacje) wraz z innymi obiektami tworzonymi przez aplikację. Ta zmiana spowoduje, że więcej danych będzie przechowywanych w głównej sterty Java, a mniej danych w generowaniu trwałym, a zatem może wymagać dostosowania wielkości sterty. Większość aplikacji zauważy tylko stosunkowo niewielkie różnice w wykorzystaniu sterty z powodu tej zmiany, ale większe aplikacje, które ładują wiele klas lub intensywnie korzystają z metody String.intern(), zobaczą większe różnice.

Aby uzyskać szczegółowe informacje na ten temat, należy zapoznać się z Java SE 7 RFE.

W odniesieniu do własnych niezmiennych obiektów Java nie robi z nimi nic specjalnego - nie wie, że są one niezmienne. To może być bardziej inline niż w inny sposób, jeśli może wykryć, że jest to warte/możliwe, ale jeśli chodzi o kompilator i JVM, to są po prostu kolejnym obiektem.

+2

Wow, odrzucono? Mogę odejść, ale dobrze byłoby wiedzieć dlaczego –

Powiązane problemy