java - 为什么用String替换StringBuilder
黄舟
黄舟 2017-04-18 10:25:48
0
4
680

今天在用android studio 2.0的时候碰到个奇怪问题:
我用StringBuilder生成一个字符串,但是用studio自带的代码检测程序优化代码时,缺把StringBuilder改成了String型“+”连接。
这是什么原因呢?不是StringBuilder应该比“+”性能更好吗?
这是自动替换后的

String sb = "CREATE TABLE IF NOT EXISTS " +
                appContext.getString(R.string.tbl_name) +
                "(_id INTEGER PRIMARY KEY AUTOINCREMENT" +
                ",account VARCHAR" +
                ",psw VARCHAR" +
                ",memo TEXT)";

这是我之前写的

StringBuilder sb = new Stringbuilder();
sb.append(xxxx)
.
.
.
db.execSql(sb.toString());
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全員に返信(4)
PHPzhong

すべて定数であるスプライシングコンパイラは、置き換え後のコンパイルされたクラスファイルのバイトコードを確認できます

考えてみてください、scort が言ったことは意味があるはずです。コンパイラはコンパイル段階で文字列定数の + 接続を最適化する必要があるため、StringBuilder は必要ありません。

いいねを押す +0
阿神

コンパイラーは内部でコネクタを最適化します。それが定数の場合、定数プールを通じて直接接続されます

非定数の場合、ほとんどの場合、このように内部的に最適化され、 new StringBuilder().append() が実行され、最後に toString() が呼び出されます。少なくとも jdk1.7 ではこれが当てはまります

いいねを押す +0
刘奇

StringBuilder オブジェクトの内容は変更可能であり、メモリ使用量の点で String クラスよりも優れています。
String オブジェクトは、実際には 2 つのオブジェクトが生成されると変更できません。

そのため、実際の使用において、文字列の挿入や削除などの変更が頻繁に必要な場合は、StringBuilderを使用する方が適しています。

さらに、エディターのチェッカーは単なる仕様であり、必ずしも最適であるとは限りません。

いいねを押す +0
Peter_Zhu

これはコンパイラの最適化です。複数の行、つまり接続として複数の「;」がある場合、最適化されません。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート