HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

Java

java.util.Formatter クラス

なんか、どこかで見たような名前のクラスだが、それはたぶんjava.text.Formatクラス。 このクラスを直接使用することは今のところはあまりない。でもよく使っている。 どこで使っているかというと、例えば次のようなクラスのメソッド。 java.io.PrintStream …

java.lang.Thread.UncaughtExceptionHandler インタフェース

スレッドのエラーハンドリングためのインタフェース。 Interface for handlers invoked when a Thread abruptly terminates due to an uncaught exception.関連するThreadクラスのメソッド。 public static Thread.UncaughtExceptionHandler getDefaultUncau…

カテゴリー「Java 1.4 to 5.0」

Java 2 SE 1.4/Tomcat 4.1.x/WAS 5.1 ベースで開発された製品のサポートとメンテナンスをやっているが、一方で、Java 2 SE 5.0/Tomcat 5.5.x/WAS 6.1 ベースで開発された製品のサポートとメンテナンスもやらないといけなくなった。 (前者ではバリバリの開発…

java.lang.ProcessBuilder クラス

Java 2 SE 5.0のJavaDocを何気なく眺めていてふと気になった。「確かこんなクラスはなかったよなぁ‥」と。確認してみたら、確かに「Since: 1.5」と書いてある。 This class is used to create operating system processes. Each ProcessBuilder instance man…

java.lang.ThreadLocal クラス

Java 2 SE 5.0 から、ThreadLocalクラスにremove()メソッドが追加された。 Removes the value for this ThreadLocal. This may help reduce the storage requirements of ThreadLocals. If this ThreadLocal is accessed again, it will by default have its…

Log4Jの後始末

Log4Jを使ってWebアプリケーションのログをファイルに記録する場合、Webアプリケーションの終了時に後始末をする必要がある。でないと、ログファイルがロックされたままになるので、ログファイルを削除できない。 そんなときは、Servletのdestroy()メソッド…

Map系クラスのメモリ使用量の違い

唐突に、HashMap、LinkedHashMap、TreeMapのメモリ使用量の違いを測ってみようと思った。 ただ、メモリ使用量、というよりは、いくつのkey-valueを保持できるか、というところに力点を置いた結果の示し方をする。 検証用コードはこんな感じ。 import java.te…

Stringオブジェクトに関する罠に対する罠

Stringオブジェクトに関する罠 - HHeLiBeXの日記 正道編 書くのがだいぶ遅くなったけど‥ 同じ文字列を表す異なるStringオブジェクトに対してintern()メソッドを呼び出すと、同じStringオブジェクトが返される。のだが、ここに罠が潜んでいる。まぁ、よっぽど…

OutOfMemoryError発生時のエラーメッセージの変遷

なぜか唐突に(謎)。わざわざ準備するのは面倒なので、手元にあるものだけ確認。 まず、OutOfMemoryErrorを引き起こすためのコード。 import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.LinkedList; import java.util.List; …

無駄むだムダァー

超極小爆弾だけど(メモリに対する)‥ return new String("0"); ‥よっぽど特殊な事情がない限り、"0"っていう文字列を表す別のインスタンスなんて必要ないと思うんだけど。例えば、java.util.IdentityHashMapを使わなければいけないケースとか。 ちなみに、実…

シリアライズの罠 - java.lang.Boolean

つい最近まで、Booleanオブジェクトはデシリアライズされる際に新たなオブジェクトが生成されない(より厳密に言うと、生成された直後にGC可能オブジェクトになる)と思い込んでいた、という罠。 確認のためのコード。 import java.io.IOException; import jav…

Stringオブジェクトに関する罠

Stringオブジェクトに関しても、Booleanオブジェクトと同様に不変オブジェクトであるが、同一の文字列を表現する異なるStringオブジェクトを生成できてしまう。 生成されてもすぐに捨てられるのなら問題はあまりないのだが、セッションデータとして保持し続…

パラメータマーカーに指定する文字列が長すぎるとSQLエラー(続き)

パラメータマーカーに指定する文字列が長すぎるとSQLエラー - HHeLiBeXの日記 正道編 これを受けて、「じゃあどうするべきなのか」という話を書こうとしたんだけど、眠くて力尽きたというか(ごにょごにょ)。 DB2はPREPAREする時点でパラメーターマーカーの型…

パラメータマーカーに指定する文字列が長すぎるとSQLエラー

以下のような表を作成する。 CREATE TABLE HOGE(ID SMALLINT, NAME VARCHAR(10)) ポイントは「VARCHAR(10)」。 で、JDBCを使って以下のようなクエリを発行してみる。 SELECT ID, NAME FROM HOGE WHERE NAME = '0123456789a' INSERT INTO HOGE(ID, NAME) VALU…

詰めが甘いObject#equals()のオーバーライド

「もれなくダブりなく」とは、書籍「プログラマの数学」に書かれていることだが、そんな「条件がもれてしまった」という爆弾コード。 public class Xxx { public boolean equals(Object o) { if (!(o instanceof Xxx)) { return false; } Xxx that = (Xxx) o…

Collection#iterator() vs Collection#contains()

こんなコードを見かけることがある。 private boolean search(List<Xxx> list, Xxx target) { for (Xxx xxx : list) { if (xxx.equals(target)) { return true; } } return false; } こんなことをするなら、Object#equals()やObject#hashCode()を適切に実装して、</xxx>…

StringBuilder#appendとStringの連結(+演算子)の続き

前に書いたStringBuilder#appendとStringの連結(+演算子) - HHeLiBeXの日記 正道編の「test1()とtest2()の処理速度が約3倍」という記述に違和感を覚えた。test1()とtest2()の差は、一時的なStringBuilderが生成されるかされないかだけであるはずだから、appe…

Integer#decodeメソッド

整数値を表すラッパークラス(Byte、Short、Integer、Long)には、decode(String)なるメソッドがあることをいまさら知った。 JavaDocを見ると、JDK 1.2から存在している。こういう基本的なクラスって、コード補完に頼ったりJavaDocを見たりしないので、逆に気…

org.w3c.util.UUIDとjava.util.UUID

ユニークなIDを生成するための手段として、org.w3c.util.UUID、またJava 5からはjava.util.UUIDがある、というのはいまさらな話。 org.w3c.util.UUIDでは、以下のような文字列が生成される。 <(1)とあるObjectのhashCode(16進)>-<(2)現在時刻(ミリ秒)(16進)>-…

StringBuilder#appendとStringの連結(+演算子)

StringBuilderに対して複数のStringをappendする場合、その呼び出しパターンは以下のコードに示される4種類に整理できる。 public class Test { private String s1 = "a"; private String s2 = "b"; private final String S1 = "a"; private final String S2…

Mapに対するiteration

こんなコード: Map<String, Integer> map = new HashMap<String, Integer>(); ‥ for (String key : map.keySet()) { Integer value = map.get(key); ‥ } を見るとモヤモヤしてしまう(謎)今日この頃。 そもそも、java.util.Mapに対するiterationには3種類ある。 keyのみが必要である場合 - Map#</string,></string,>…

"値が入力されている"の判定

“値が入力されている”ということを調べるのに、 if (s != null && !s.equals("")) { ‥ } とか、 if (s != null && s.length() > 0) { ‥ } という判定条件を書くことはよくあると思う。 if (!"".equals(s)) { ‥ } というのもあるかな。 ここで“値が入力されて…

nullチェックをしたいんだかしたくないんだか‥

何をどうしたいのか意図が分からない、また、書いた本人はすでにいない、なんてことは日常茶飯事なのですが‥orz なんとも中途半端なこんなコード。 String urlStr = ‥ ‥ ‥ int index = 0; if (urlStr != null) { index = urlStr.indexOf("?"); } if (index >…

列挙型専用のSet - java.util.EnumSet

EnumMapと同じようなことを、EnumSetに対してもやってみた。 列挙型はEnumMapの場合と同じだが、再掲。 enum A { A_1, A_2, A_3; } 次にテスト用のクラス。ただ、EnumSetクラスにはpublicなコンストラクタがなく、代わりに要素なしのEnumSetオブジェクトを生…

列挙型専用のMap - java.util.EnumMap

Java 5から列挙型(enum)が導入されたのに合わせて、列挙型の値をキーとするEnumMapというクラスが提供されているのを知り、またメモリ効率がよいという記述をどこかで見たので、ちょっと実験。 まず列挙型。 enum A { A_1, A_2, A_3; } 次にテスト用のクラス…

列挙型に含まれる全要素の取得

EnumMapやEnumSetを見ていて、ふと疑問に思ったのが、これらのクラス内で列挙型に含まれる全要素の個数や値が必要になるはずだがどうやって取得しているのか、ということ。 通常、列挙型 enum A { A_1, A_2, A_3; } に対して、 A[] vals = A.values(); と書…

Java Generics and Collections

Java Generics And Collections作者: Maurice Naftalin,Philip Wadler出版社/メーカー: Oreilly & Associates Inc発売日: 2006/10/01メディア: ペーパーバック購入: 5人 クリック: 39回この商品を含むブログ (8件) を見るふとしたきっかけで存在を知り、早速…

"intでenum"の危険な罠

ずっとずっとずーっと前から言われていることで、Java 5からはenumも導入されたわけですが、そんな問題のあるコードに出くわしてしまいました‥orz コードのイメージはこんな感じ。 // とあるbeanクラス public class Xxx { public static final int YYY_AAA …

Jakarta Slideの問題

Jakarta Slide。WebDAVをフルサポートしたコンテンツリポジトリ。http://jakarta.apache.org/slide/もう、プロジェクト自体がリタイヤしてしまったので、時代遅れといわれればそのとおりなのだが、未だに使われている&置き換える気力が無い(ぉで、このSlide…

java.text.SimpleDateFormatはスレッドセーフではない

先日購入した「コーディングの掟」を読んでいて、java.text.SimpleDateFormatがスレッドセーフではないことに初めて気がついた。結構長くJavaプログラマやってるんだけどなぁ‥orz JavaのAPIドキュメントを見てみると、ちゃんと書いてある。 SynchronizationD…