原來使用 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 這個變數,但是不要造成記憶的負擔
感謝
您的問題正確來說應該是:Java 中的 StringBuffer 如何清空?
因為重複使用不代表要清空!
coding 時清楚需求、目的、意義是很重要的。不精確的用詞往往會造成團隊的負擔。
有三種方式
StringBuffer sb = new StringBuffer("Hello World!");
sb = new StringBuffer();
StringBuffer sb = new StringBuffer("Hello World!");
sb.setLength(0);
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
理論上物件的應用。
只要是new就為新應用。
對sql而言。本身就可以有多重命令存在。
理論上來說是可以疊加指令進去。
不過就你的問題來說。正常因該要有一個sql的ext或get運行動作才能獲得結果。
常理來說,在一般的db庫應用。一但運行過的sql。理當指令就會自動消失。
你可以再重覆使用原物件才對。
但就單看你用StringBuffer來說。正常這不是db使用的方式才對。
而是字串應用的東西。所以不會帶有db的特性。
所以...正常我會建議你用new。畢竟目前看不清楚delete掉後會不會有問題。
但new一定不有問題。
如果是要重覆使用 StringBuffer
答案是sql.delete(0, sql.length());
比起這幾十個 bytes
網路上比較有人在乎效率問題
可以用sql.setLength(0)