http://kohlerm.blogspot.co.uk/2009/01/is-javalangstringintern-really-evil.html
zapewnia, że String.equals()używa wcześniej "=="do porównywania Stringobiektów, zgodnie z
http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html
porównuje długości ciągów, a następnie zawartość.
(Nawiasem mówiąc, ciągi kodu produktu w katalogu sprzedaży mogą mieć tę samą długość - BIC0417 to kask bezpieczeństwa rowerzysty, TIG0003 to żywy dorosły tygrys męski - prawdopodobnie potrzebujesz różnych licencji, aby zamówić jeden z nich. I może lepiej zamówić kask ochronny w tym samym czasie.)
Brzmi więc to tak, jakbyś zyskał na zamianie ciągów na ich intern()wersję, ale zyskujesz bezpieczeństwo - oraz czytelność i zgodność z normami - bez użycia „==” do equals()programowania. I większość tego, co powiem, zależy od tego, czy to prawda, jeśli to prawda.
Ale czy String.equals()test, czy przed użyciem przekazałeś mu String, a nie jakiś inny obiekt "=="? Nie jestem uprawniony do powiedzenia, ale zgaduję, że nie, ponieważ w przeważającej większości większość takich equals()operacji będzie przetwarzanych na ciąg znaków, dzięki czemu test prawie zawsze jest zaliczany. Rzeczywiście, nadanie priorytetu wewnątrz „==” String.equals()implikuje pewność, że często porównujesz Łańcuch z tym samym rzeczywistym obiektem.
Mam nadzieję, że nikt nie jest zaskoczony, że następujące wiersze dają wynik „fałszu”:
Integer i = 1;
System.out.println("1".equals(i));
Ale jeśli zmienisz ina i.toString()w drugiej linii, oczywiście, że tak true.
Miejsca, w których możesz spodziewać się korzyści z internowania, to Seti Mapoczywiście. Mam nadzieję, że internowane łańcuchy mają buforowane kody hash ... Myślę, że to byłby wymóg. I mam nadzieję, że nie zdradziłem tylko pomysłu, który mógłby zarobić milion dolarów. :-)
Jeśli chodzi o pamięć, oczywiste jest również, że jest to ważny limit, jeśli wolumen napisów jest duży lub jeśli chcesz, aby pamięć używana przez kod programu była bardzo mała. Jeśli twoja objętość -różniących-Ciągów jest bardzo duża, być może nadszedł czas, aby rozważyć użycie dedykowanego kodu programu bazy danych do zarządzania nimi oraz osobnego serwera bazy danych. Podobnie, jeśli możesz ulepszyć mały program (który musi działać jednocześnie w 10000 instancjach), nie zapisując w ogóle swoich ciągów.
Tworzenie nowego ciągu znaków, a następnie odrzucanie go jako intern()substytutu, wydaje się marnotrawstwem , ale nie ma wyraźnej alternatywy, z wyjątkiem zachowania duplikatu ciągu. Tak naprawdę koszt wykonania polega na wyszukaniu łańcucha w puli wewnętrznej, a następnie umożliwieniu śmieciarzowi usunięcia oryginału. A jeśli jest to dosłowny ciąg, to i tak jest już internowany.
Zastanawiam się, czy intern()złośliwy kod programu może nadużyć, aby wykryć, czy niektóre ciągi i ich odwołania do obiektów już istnieją w intern()puli, a zatem istnieją gdzie indziej w sesji Java, kiedy nie powinno to być znane. Ale byłoby to możliwe tylko wtedy, gdy kod programu jest już używany w zaufany sposób. Nadal warto wziąć pod uwagę biblioteki innych firm, które dołączasz do swojego programu, aby przechowywać i zapamiętywać numery PIN do bankomatów!