[解決済み] 文字列の連結:concat()と "+"演算子の比較
質問
文字列a,bとする。
a += b
a = a.concat(b)
裏を返せば、同じものなのでしょうか?
参考までにconcatをデコンパイルしたものがこちらです。を逆コンパイルできるようにしたいです。
+
演算子が何をするのかを見てみましょう。
public String concat(String s) {
int i = s.length();
if (i == 0) {
return this;
}
else {
char ac[] = new char[count + i];
getChars(0, count, ac, 0);
s.getChars(0, i, ac, count);
return new String(0, count + i, ac);
}
}
解決方法は?
いいえ、そうでもありません。
まず、意味づけが少し違います。もし
a
は
null
であれば
a.concat(b)
を投げます。
NullPointerException
しかし
a+=b
の元の値を扱います。
a
であるかのように
null
. さらに
concat()
メソッドは
String
の値であるのに対し
+
演算子は、黙って引数を String に変換します (
toString()
メソッドでオブジェクトを扱います)。そのため
concat()
メソッドは、受け入れるものがより厳密です。
フードの下を覗くには、簡単なクラスを作って
a += b;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
で分解してみましょう。
javap -c
(Sun JDKに含まれる)。を含むリストが表示されるはずです。
java.lang.String cat(java.lang.String, java.lang.String);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: aload_1
8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_2
12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/ String;
18: astore_1
19: aload_1
20: areturn
だから
a += b
は、次のものと同等です。
a = new StringBuilder()
.append(a)
.append(b)
.toString();
は
concat
メソッドの方が速いはずです。しかし、文字列が多くなると
StringBuilder
メソッドが、少なくとも性能の面では勝っています。
のソースコードは
String
と
StringBuilder
(およびそのパッケージ非公開の基本クラス)は、Sun JDK の src.zip で入手できます。char 配列を構築し(必要に応じてサイズを変更し)、最後の
String
. 実際には、メモリの確保は驚くほど高速に行われます。
更新してください。
Pawel Adamskiが指摘するように、最近のHotSpotではパフォーマンスが変化しているようです。
javac
は全く同じコードを生成しますが、バイトコードコンパイラが不正を行います。単純なテストは、コード本体全体が捨てられてしまうので、完全に失敗する。まとめ
System.identityHashCode
(ただし
String.hashCode
を表示します。
StringBuffer
のコードが若干有利です。次のアップデートがリリースされたとき、または別のJVMを使用したときに変更される可能性があります。より
ルカシーダー
,
HotSpot JVM intrinsics の一覧です。
.
関連
-
をインスタンス化することができません。
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java Exceptionが発生しました エラー解決
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
Methodのinvokeメソッド実装のJavaリフレクション
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
org.glassfish.jersey.servlet.ServletContainer
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策