2011-11-21 21 views
9

Thread.javaの146行目で、私は著者がStringの代わりにchar[]を名前フィールドに使用していることに気付きました。私が気づいていないパフォーマンス上の理由はありますか? getName()は、文字を文字列にラップしてから名前を返します。 Stringを使用するほうがいいですか?Stringの代わりにchar []を使用する理由は?

+3

文字列の呼び出し{getChars、getBytes、toLowerCase、...}はすべて、元の文字列のコピーである新しいオブジェクトを返します。大きな文字列を使ったり、これらのメソッドを何度も呼び出したりする場合。不要な追加のガベージコレクションが発生する可能性があります。たとえば、あらゆる拍にOutputStream.write(epochTimeString.getBytes())という何らかの理由でHTTPハートビートがあるとします。モバイルJVMを使用する場合は、これらの詳細をもっと頻繁に心配する必要があります。 – eSniff

答えて

6

一般に、はい。私はchar[]がパフォーマンス上の理由からThreadで使用されたと考えています。そのようなJavaの場合はまともなパフォーマンスを得るためにあらゆる努力が必要でした。現代のJVMの登場により、このようなマイクロ最適化はそれ以来重要ではなくなってきましたが、そのままにしています。

古いJava 1.0の時代のソースには奇妙なコードがたくさんありますが、あまり注意を払っていません。

+0

私はこれも疑った。しかし、ThreadGorupで 'String name'を見た時、私は混乱しました。答えをありがとう。 –

+0

私は多くの人々が本当に良い理由はないと示唆したので、私はこの答えを受け入れるつもりです。 –

+0

文字列は不変なので、なぜそれを使用したのですか。効果的なJava 2end版では、「常に可能な限り文字列の代替を使用する」と書かれています。 –

2

難しいと言えます。おそらく彼らはいくつかの最適化を念頭に置いていました。おそらく、このコードを書いた人は、Cスタイルの文字列配列char*にもっと慣れていたでしょうし、あるいはこのコードが書かれた時には文字列が不変かどうかわかりませんでした。しかし、このコードでは、Thread.getName()が呼び出されるたびに新しいchar配列が作成されるので、このコードは文字列を使用するよりも実際にはGC上で重くなります。

+0

+1これはGCに関するものです。 –

1

セキュリティ保護が理由だったのでしょうか?文字列はリフレクションで変更することができるため、著者は読み書き時にコピーを望んでいます。それをやっているなら、char配列を使って素早くコピーすることもできます。

関連する問題