iT邦幫忙

1

StringBuffer 重覆使用

  • 分享至 

  • xImage

原來使用 StringBuffer 是為了避免 String + String 造成的宣告的問題

但是,如果有需要重覆使用到 StringBuffer 的話,要如何做才比較好

例如:
我宣告一個 StringBufer 為 sql 是用來存放要執行 SQL 的語法

sql = new StringBuffer();
sql.append("select * from abc where id = '").append(xxx).append("' ");
取得結果後,要這個結果在下另外一個語法

這時候應該要用
sql = new StringBuffer();

還是要用
sql.delete(0, sql.length());

還是有其他的方法,可以重覆使用 sql 這個變數,但是不要造成記憶的負擔

感謝

這樣為什麼不用 format 去產生 SQL
wrxue iT邦好手 1 級 ‧ 2020-11-06 11:51:02 檢舉
直接new一個就好了,java有CG
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
鬼王很慘
iT邦新手 2 級 ‧ 2020-11-10 14:26:43
最佳解答

您的問題正確來說應該是:Java 中的 StringBuffer 如何清空?
因為重複使用不代表要清空!
coding 時清楚需求、目的、意義是很重要的。不精確的用詞往往會造成團隊的負擔。

有三種方式

  1. new StringBuffer();
StringBuffer sb = new StringBuffer("Hello World!");
sb = new StringBuffer();
  1. setLength();
StringBuffer sb = new StringBuffer("Hello World!");
sb.setLength(0);
  1. delete();
StringBuffer sb = new StringBuffer("Hello World!");
sb.delete(0, sb.length());

演示:

StringBuffer sb1 = new StringBuffer("new StringBuffer()");
System.out.println("before: " + sb1.toString());
sb1 = new StringBuffer();
System.out.println("after: " + sb1.toString());

StringBuffer sb2 = new StringBuffer("setLength()");
System.out.println("before: " + sb2.toString());
sb2.setLength(0);
System.out.println("after: " + sb2.toString());

StringBuffer sb3 = new StringBuffer("delete()");
System.out.println("before: " + sb3.toString());
sb3.delete(0, sb3.length());
System.out.println("after: " + sb3.toString());

另外效能差異現在的你應該不需關注,不過也附給你。

public void compareTime() {
    long start;
    long end;
    StringBuffer sb1 = new StringBuffer("Hello World!");
    StringBuffer sb2 = new StringBuffer("Hello World!");
    StringBuffer sb3 = new StringBuffer("Hello World!");

    start = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        sb1 = new StringBuffer();
    }
    end = System.currentTimeMillis();
    System.out.println("new: " + (end - start));

    start = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        sb2.setLength(0);
    }
    end = System.currentTimeMillis();
    System.out.println("setLength: " + (end - start));

    start = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        sb3.delete(0, sb3.length());
    }
    end = System.currentTimeMillis();
    System.out.println("delete: " + (end - start));
}

環境為 JDK13
結果:
new: 28
setLength: 20
delete: 11

經過幾次測試都差不多,耗時 new > setLength > delete

1

理論上物件的應用。
只要是new就為新應用。

對sql而言。本身就可以有多重命令存在。
理論上來說是可以疊加指令進去。

不過就你的問題來說。正常因該要有一個sql的ext或get運行動作才能獲得結果。
常理來說,在一般的db庫應用。一但運行過的sql。理當指令就會自動消失。
你可以再重覆使用原物件才對。

但就單看你用StringBuffer來說。正常這不是db使用的方式才對。
而是字串應用的東西。所以不會帶有db的特性。

所以...正常我會建議你用new。畢竟目前看不清楚delete掉後會不會有問題。
但new一定不有問題。

0
海綿寶寶
iT邦大神 1 級 ‧ 2020-11-06 11:12:59

如果是要重覆使用 StringBuffer
答案是sql.delete(0, sql.length());

比起這幾十個 bytes
網路上比較有人在乎效率問題
可以用sql.setLength(0)

我要發表回答

立即登入回答