web-dev-qa-db-ja.com

さらに、文字列追加、連結、+

私は髪を分割しているかもしれませんが、私は次の場合に疑問に思いました:

String newString = a + b + c;  //case 1


String newString = a.concat(b).concat(c);   //case 2

StringBuilder newString = new StringBuilder(); //case 3
newString.append(a);
newString.append(b);    
newString.append(c);

どちらが最適ですか?

最高の意味はとにかくです。

これらについて読んで、他の投稿は、ケース3は賢明な最適なパフォーマンスではない、他のケースはケース1がケース3で終わるということなどです。

もう少し詳しく言うと。

たとえば、すべてを脇に置いて、彼のコードを維持する必要がある場合、別のプログラマからそれを見るのにどちらのスタイルがより適していますか?

それとも、プログラミングをより効率的にするためにどれを検討しますか?
または、あなたはより速いと思うでしょう.

他にこれを表現する方法がわかりません。

たとえば、ケース3の方が高速ですが、プログラマーの大多数はケース1を好みます。

27
Cratylus

ケース1は簡潔で、意図を明確に示しており、ケース3と同等です。

ケース2は効率が悪く、読みにくくなります。

ケース3はケース1とほぼ同じくらい効率的ですが、長く、読みにくくなります。

ケース3の使用は、ループで連結する必要がある場合にのみ使用する方が適切です。それ以外の場合、コンパイラーはケース1をケース3にコンパイルします(new StringBuilder(a)を使用してStringBuilderを構築する場合を除く)。これにより、ケース3よりもさらに効率的になります)。

22
JB Nizet

ケース3が最もパフォーマンスの高い形式ですが、JVMはケース1をケース3に変換します。

しかし、私はケース2が最悪で、ケース1ほど読みやすく、ケース3ほどパフォーマンスが悪いと思います。

ユースケース3だけでループ内の文字列を連結したい場合は、パフォーマンスの向上を簡単にテストできますが、ループ内にない場合(またはシーケンスに多数の文字列を追加しない場合)は、ほとんど同じです。

+演算子を使用しないケースは次のとおりです。

String a = "";
for (String x : theStrings) {
    a += x;
}

または

String a = b + c;
a = a + d;
a = a + e;
a = a + f;
7
Amir Pashazadeh

ケース3はほとんどの面で優れています。ケース3では、3つの文字列オブジェクトを作成することにはなりません。文字列は不変であるため、2には+(または)連結ごとに文字列オブジェクトを作成するオーバーヘッドがあります。

編集:ドキュメントを再度読み、ほとんどのコメントに同意します。ケース1はケース3です。

2
kosa

JDK 1.8でのパフォーマンス分析では、パフォーマンスの点でケース2が勝者であることがわかりました。

class Solution {
public static void main(String[] args) {
   String s ="ABC", s1 = "", s2 = "", s3 = "";
   long t1 = System.nanoTime();
   for(int i = 1; i < 11; i++) {
       s1 = s1 + s;
   }
   System.out.println(System.nanoTime() - t1);
   System.out.println(s1);

   long t2 = System.nanoTime();
   for(int i = 1; i < 11; i++) {
       s2 = s2.concat(s);
   }
   System.out.println(System.nanoTime() - t2);
   System.out.println(s2);

   long t3 = System.nanoTime();
   StringBuilder sb = new StringBuilder();
   for(int i = 1; i < 11; i++) {
       sb.append(s);
   }
   s3 = sb.toString();
   System.out.println(System.nanoTime() - t3);
   System.out.println(s3);
 }
}

結果 :

40615

ABCABCABCABCABCABCABCABCABCABC

9157

ABCABCABCABCABCABCABCABCABCABC

20243

ABCABCABCABCABCABCABCABCABCABC

0
kumarBaibhav

前述の追加として、JEP 280の下で文字列連結onlyのパフォーマンスが大幅に向上しました。

Plsは https://openjdk.Java.net/jeps/28 を参照し、説明 https://dzone.com/articles/jdk-9jep-280-string-concatenations-will -never-be-t

つまり、Java 9 "Hello " + "world"文字列の連結は、パフォーマンスを考慮した場合でも推奨される方法です。

0
fyrkov