2011-11-21 21 views
9

W linii Thread.java, linia 146, zauważyłem, że autor użył nazwy char[] zamiast String dla pola nazwy. Czy są jakieś przyczyny wydajności, o których nie wiem? getName() również zawija znak w łańcuchu przed zwróceniem nazwy. Czy nie lepiej po prostu użyć String?Dlaczego warto użyć char [] zamiast ciągu?

+3

Wywołania do ciągu. {GetChars, getBytes, toLowerCase, ...} all zwracają nowe obiekty będące kopiami oryginalnego łańcucha. Jeśli pracujesz z dużymi ciągami lub wywołując jedną z tych metod wiele razy. Możesz skończyć z niepotrzebnymi dodatkowymi garbage collections. Na przykład, wyobraź sobie bicie Serca HTTP, które z dowolnego powodu o nazwie OutputStream.write (epochTimeString.getBytes()) na każdym uderzeniu. Musisz martwić się o te szczegóły częściej, jeśli pracujesz z mobilnymi maszynami JVM. – eSniff

Odpowiedz

6

Ogólnie rzecz biorąc tak. Podejrzewam, że char[] został użyty w Thread ze względu na wydajność, w czasach, gdy takie rzeczy w Javie wymagały wszelkich starań, aby uzyskać przyzwoitą wydajność. Wraz z pojawieniem się nowoczesnych JVM, takie mikro-optymalizacje już dawno przestały być ważne, ale tak po prostu zostało.

W starym źródle Java 1.0 jest dużo dziwnych kodów, nie zwracałbym na to zbyt wiele uwagi.

+0

Podejrzewałem to również. Ale potem zobaczyłem "String name" w ThreadGorup byłem zdezorientowany. Dziękuję za odpowiedź. –

+0

Przyjmuję tę odpowiedź, ponieważ jak wiele osób sugerowało, nie było naprawdę dobrego powodu. –

+0

String jest niezmienny, dlatego właśnie go użył. Efektywna edycja java 2end mówi, że "Zawsze używaj alternatywnej struny, gdy jest to możliwe" Josha Blouch –

2

Trudno powiedzieć. Być może mieli na myśli jakieś optymalizacje, być może osoba, która napisała ten kod, była po prostu bardziej przyzwyczajona do tablic w stylu C, na tablicach w stylu C, albo może do czasu napisania tego kodu nie byli pewni, czy łańcuchy będą niezmienne czy nie. Ale za pomocą tego kodu, za każdym razem, gdy wywoływana jest nazwa Thread.getName(), tworzona jest nowa tablica znaków, więc kod ten jest w rzeczywistości cięższy w GC niż po prostu przy użyciu ciągu znaków.

+0

+1 Dotyczy to GC. –

1

Może powodem była ochrona bezpieczeństwa? Ciąg można zmienić za pomocą refleksji, więc autor chce skopiować podczas odczytu i zapisu. Jeśli to robisz, możesz równie dobrze użyć tablicy char do szybszego kopiowania.

Powiązane problemy