Sep 25, 2009

Convert Calendar to Date

入力された年、月、日からDateクラスを生成する方法は
java.util.Date date = new Date(year, month, date);だった。
しかし↑の方法はもう推奨されてないため
Calendar cal = Calendar.getInstance();
cal.set(year, month, date);
java.sql.Date date = new java.sql.Date(cal.getTimeInMillis());
java.util.Date date = new java.util.Date(cal.getTimeInMillis());
これで変換できるはずだったが、
変な期間のデータをselectしたので(月がずれてしまう問題)
いろいろ調べた結果!

Calendarクラスのyearとdateは普通に1から始まるが、
monthは0が1月であることが分かった。

結局
cal.set(year, month - 1, date);
で解決したが、3時間の遅れが発生したのでこれは痛い。

今後2度も同じミスを犯さないようにメモしておく。


Jun 25, 2009

StringBuilder

現在JDK5.0で開発しているため文字列結合する時はStrinBuilderを使っています。研修中調べた結果StringBuilderがStringBufferより30%早かったからです。

そのソース


public class SpeedTest {

public static void main(String[] args) {

long start = System.currentTimeMillis();

StringBuilder sb = new StringBuilder(6*1000000);

for (int i = 0; i < 1000000; i++) {

sb.append(i);

}

long end = System.currentTimeMillis();

System.out.println("StringBuilder = " + (end - start));


start = System.currentTimeMillis();

StringBuffer sf = new StringBuffer(6*1000000);

for (int i = 0; i < 1000000; i++) {

sf.append(i);

}

end = System.currentTimeMillis();

System.out.println("StringBuffer = " + (end - start));


}

}


実行結果:

StringBuilder = 94

StringBuffer = 140

しかしStringBuilderがStringBufferより早い理由を知らずに使うには気がすまなかったのでソースを見た結果。。。 分析できませんでした。

それでGoogle先生に聞いた結果。。。 先生も知りませんでした。 (-.-);;;;

ちょっと方向を変えて本当にStringBuilderが早いか調べました。今回もGoogle先生にお世話になりました。

StringBufferからStringBuilderへ変えた後遅くなった事例がありました。(英語です)

http://www.velocityreviews.com/forums/t366388-stringbuilders-performance-lower-than-that-of-stringbuffer.html


しかし遅くなったソースは見れなかったので上のURLへ乗せられてある速度を計るソースを試してみた結果、

StrinBuilderがほとんどの場合早かったです。