Thread.javaの146行目で、私は著者がString
の代わりにchar[]
を名前フィールドに使用していることに気付きました。私が気づいていないパフォーマンス上の理由はありますか? getName()
は、文字を文字列にラップしてから名前を返します。 String
を使用するほうがいいですか?Stringの代わりにchar []を使用する理由は?
答えて
一般に、はい。私はchar[]
がパフォーマンス上の理由からThread
で使用されたと考えています。そのようなJavaの場合はまともなパフォーマンスを得るためにあらゆる努力が必要でした。現代のJVMの登場により、このようなマイクロ最適化はそれ以来重要ではなくなってきましたが、そのままにしています。
古いJava 1.0の時代のソースには奇妙なコードがたくさんありますが、あまり注意を払っていません。
私はこれも疑った。しかし、ThreadGorupで 'String name'を見た時、私は混乱しました。答えをありがとう。 –
私は多くの人々が本当に良い理由はないと示唆したので、私はこの答えを受け入れるつもりです。 –
文字列は不変なので、なぜそれを使用したのですか。効果的なJava 2end版では、「常に可能な限り文字列の代替を使用する」と書かれています。 –
難しいと言えます。おそらく彼らはいくつかの最適化を念頭に置いていました。おそらく、このコードを書いた人は、Cスタイルの文字列配列char*
にもっと慣れていたでしょうし、あるいはこのコードが書かれた時には文字列が不変かどうかわかりませんでした。しかし、このコードでは、Thread.getName()
が呼び出されるたびに新しいchar配列が作成されるので、このコードは文字列を使用するよりも実際にはGC上で重くなります。
+1これはGCに関するものです。 –
セキュリティ保護が理由だったのでしょうか?文字列はリフレクションで変更することができるため、著者は読み書き時にコピーを望んでいます。それをやっているなら、char配列を使って素早くコピーすることもできます。
- 1. SpriteKitの代わりにCoreGraphicsを使用する理由は?
- 2. Date []の代わりにlong []を使用する理由
- 3. guava:コンストラクタの代わりにメソッドcreate()を使用する理由
- 4. QAの代わりにmochaを使用する理由
- 5. queue.First()/ Last()の代わりにqueue.Peek()を使用する理由
- 6. アサートの代わりにQ_ASSERTを使用する理由
- 7. シェルスクリプト - エコーの代わりにbin/echoを使用する理由?
- 8. IO()の代わりに[Char]を取得するString
- 9. XMLの代わりにSGMLを使用する理由はありますか?
- 10. trueの代わりに!0を使用する理由はありますか?
- 11. Sugar ORMのcount()メソッドがStringの代わりにString []パラメータを取る理由はありますか?
- 12. [x]の代わりにoperator.itemgetter(x)を使用する理由は何ですか?
- 13. ラムダ式の代わりにcompose()を使用する理由は何ですか?
- 14. C++でリファレンスの代わりにシャローコピーを使用する理由は?
- 15. Singeltonパターンの代わりにZend_Registryを使う理由は?
- 16. コンストラクタの代わりにJavaでsetterを使う理由は?
- 17. データセット。代わりにクエリアダプタまたはテーブルアダプタを使用する理由
- 18. 実際の制限はchar配列の代わりにstd :: stringとstd :: vector/listをC++の配列の代わりに使用するだけですか?
- 19. AndroidのKotlinコルーチン:async()の代わりにAnkoのbg()を使用する理由
- 20. grpcサーバの例でtls.Listenの代わりにnet.Listenを使用する理由
- 21. LocalDate、LocalTime、Streamオブジェクトがコンストラクタの代わりに()のファクトリメソッドを使用する理由
- 22. asp.netがbigintの代わりにGUID列を使用する理由
- 23. ダイレクトメソッド呼び出しの代わりにカスタムイベントを使用する理由
- 24. CSSプロパティテーブルの代わりに浮動小数点数を使用する理由
- 25. jmeterでJDBCサンプラーの代わりにJDBC postproecssorを使用する理由
- 26. なぜVaadinでPasswordFieldがchar []の代わりにStringを使用するのですか?
- 27. flatMap()関数は代わりにRDD [Char]を返します。RDD [String]
- 28. IISの代わりにWaWebHostでWebRoleを実行する理由
- 29. IOErrorEvent.IO_ERRORの代わりにEvent.OPENをディスパッチする理由
- 30. TFilenameの代わりにStringを使用する必要がありますか?
文字列の呼び出し{getChars、getBytes、toLowerCase、...}はすべて、元の文字列のコピーである新しいオブジェクトを返します。大きな文字列を使ったり、これらのメソッドを何度も呼び出したりする場合。不要な追加のガベージコレクションが発生する可能性があります。たとえば、あらゆる拍にOutputStream.write(epochTimeString.getBytes())という何らかの理由でHTTPハートビートがあるとします。モバイルJVMを使用する場合は、これらの詳細をもっと頻繁に心配する必要があります。 – eSniff