S-JIS[2008-08-23/2012-05-04] 変更履歴

Java一意関連メモ

Java一意(ユニーク)な値を取得する方法について。

一意とは、それひとつだけしかない、他に同じ値が無い、重複しない、という意味。
「一意に定まる」とは、「必ず1つだけに決まる」こと。


UID

ユニークなIDを採番する為のクラス。

java.rmi.server.UID ホスト上で一意となるID  
java.rmi.dgc.VMID 全てのJavaVMを通して一意となるID  
java.util.UUID ユニバーサル固有識別(UUID) JDK1.5
java.rmi.server.ObjID RMIのリモートオブジェクトを識別するID  
java.rmi.activation.ActivationGroupID    

自分のプログラム内で一意となるIDを振りたいなら、使えるのはUIDやVMIDだろうか。他のは よー分からん(爆)

	System.out.println(new UID());
	System.out.println(new VMID());

File#createTempFile()

例えばUIDVMIDを使って重複しない一時ファイル名を生成するという使い道も考えられる。
ただしUID#toString()は「1b32f29a:11beb5202b3:-8000」の様にコロン「:」を含むため、Windowsではそのままではファイル名には使えない。String#replace(':', '_')とかで変換してやる必要がある。(VMIDも同様)

でも、一時ファイルを生成するにはFile#createTempFile()を使うのが一番素直でしょう。


Thread#getId()

Thread#getId()は、スレッドを識別する為のIDを取得する。(Thread#getId()はJDK1.5で導入されたメソッド)

もしスレッドIDをキーにしてMapに値を保持したいと思うなら、ThreadLocal#set()を使う方が便利かも。
(ThreadLocalは、スレッドIDをキーにするMapのようなもの。スレッドが終了したら、自動的にそのMapから該当キー・値が削除される)

//サーブレットはマルチスレッドで呼ばれる
public class SampleServlet extends HttpServlet {

	/** スレッドが呼ばれた時刻をスレッド毎に保持 */
	private final ThreadLocal<String> local = new ThreadLocal<String>();

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

		String time = local.get();
		if (time == null) {
			time = "今回が初めて";
		}

		PrintWriter out = res.getWriter();
		〜
		out.print("スレッドが前回呼ばれた時刻:")
		out.println(time);
		〜

		local.set(new Date().toString());
	}
}

String#intern()

「"abc"」と「new String("abc")」は、同じ文字列(内容は同じ)だが、別インスタンス。
String#intern()を使うと、JavaVM上で一意の文字列インスタンスが返る。

	String a = "abc";
	String b = new String("abc");
	if (a.equals(b)) System.out.println("内容は一致");
	if (a != b) System.out.println("インスタンスは不一致");

	String ai = a.intern();
	String bi = b.intern();
	if (ai == bi) System.out.println("intern()は一致");

Object#hashCode()

hashCode()は、オブジェクトのハッシュ値を取得するもの。

hashCode()メソッド自体は各クラスでオーバーライドできるので、プログラミング次第では信用できる値は返ってこないかもしれない。
が、Systen#identityHashCode()で デフォルトの(オブジェクト本来の)ハッシュ値を計算することも出来る。

ただしいずれにしても、“ハッシュ値”という性質上、必ず一意になるとは限らない。
生きているインスタンス(参照が残っていてGCに回収されていないオブジェクト)であれば、ハッシュ値(identityHashCode())は たぶんメモリー上のアドレスじゃないかと思うので、異なるインスタンスで一致することは無いと思うが…
やはりハッシュ値はかぶる可能性があるらしい→chiheisenさんのjava.lang.Object#hashCode()の性質 [2012-05-04]


Java目次へ戻る / 新機能へ戻る / 技術メモへ戻る
メールの送信先:ひしだま