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?
Odpowiedz
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.
Podejrzewałem to również. Ale potem zobaczyłem "String name" w ThreadGorup byłem zdezorientowany. Dziękuję za odpowiedź. –
Przyjmuję tę odpowiedź, ponieważ jak wiele osób sugerowało, nie było naprawdę dobrego powodu. –
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 –
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.
+1 Dotyczy to GC. –
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.
- 1. Dlaczego warto użyć SwingUtilities.invokeLater w głównej metodzie?
- 2. Dlaczego warto używać metody classmethod zamiast staticmethod?
- 3. Dlaczego warto używać var zamiast nazwy klasy?
- 4. Dlaczego warto używać Function.prototype.bind zamiast Function.prototype.call?
- 5. Dlaczego warto używać ROLAP zamiast zwykłego MySQL?
- 6. Dlaczego warto używać Celery zamiast RabbitMQ?
- 7. Dlaczego warto używać argparse zamiast optparse?
- 8. Dlaczego warto używać AsQueryable() zamiast List()?
- 9. Dlaczego warto używać spyOn zamiast jaśminu.createSpy?
- 10. Dlaczego warto używać Long.valueOf (...) zamiast długiego literału?
- 11. Dlaczego warto używać NSAutoreleasePool?
- 12. Dlaczego warto korzystać OkHttp zamiast Androida httpclient i AsyncTask
- 13. Dlaczego warto używać funkcji rbegin() zamiast końcówki() - 1?
- 14. Dlaczego zamiast rekurencji ogona należy użyć iteracji?
- 15. Dlaczego warto zacząć od std :: placeholders :: _ 1 zamiast _0?
- 16. Dlaczego warto stosować metody HTTP PUT i DELETE zamiast POST?
- 17. Dlaczego warto używać niestandardowych zdarzeń zamiast bezpośrednich wywołań metod?
- 18. Dlaczego warto przechowywać sesje na serwerze zamiast w pliku cookie?
- 19. Dlaczego warto używać TimeSpan.CompareTo() zamiast < > lub =
- 20. Dlaczego warto korzystać z Asprintf?
- 21. Dlaczego warto używać JIT UNITVERSIONING?
- 22. Dlaczego warto korzystać z @PostConstruct?
- 23. Dlaczego h_addr_list w struct hostent jest char ** zamiast struct in_addr **?
- 24. Instrukcja ALTER: Dlaczego VARCHAR2 (50 BYTE) zamiast VARCHAR2 (50 CHAR)?
- 25. bison YYSTYPE: Próbuję użyć char *
- 26. Dlaczego warto uruchomić "czysty grad"?
- 27. Dlaczego warto korzystać z dict.keys?
- 28. Dlaczego warto blokować wątki?
- 29. Dlaczego warto używać Gradle?
- 30. Dlaczego warto używać shm_open?
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