Java

形態素解析ライブラリSenのエラーと原因究明方法

Javaの形態素解析ライブラリSenを使ってプログラムを書いていたのですが、実行環境を変えると急に動かなくなってしまいました。メモ代わりに対処法を残しておきます。 エラーメッセージとその原因など 私の場合、発生したエラーメッセージは java.lang.Illeg…

HashMapの注意点

HashMapを使う上での注意点について説明します。 Map型変数を使う HashMapオブジェクトを格納するには、HashMap型変数ではなくMap型変数を使います。 // HashMapオブジェクトの生成 Map<String, String> map = new HashMap<String, String>(); HashMapはMapの実装の一つに過ぎません。HashMap</string,></string,>…

Javaで多重継承する方法

Javaでは言語仕様的に多重継承が許されていません。これは、メソッド名が重複した場合の処置など、多重継承が様々な問題を引き起こしやすいからです(C++でプログラムを書くとよくわかります)。とはいえ、どうしても多重継承をしたい場合というのもあります…

同期のためにVectorは使わない(VectorとCollections.synchronizedList)

よくJavaの解説には、VectorとArrayListの違いはスレッドセーフであるかないかだということが書かれている。そのような解説を読むと、スレッドセーフな可変長配列がほしい場合にはVectorを使えば良いと思ってしまいそうだが、私は同期を目的としてもVectorは…

任意の底を持つ対数を計算する方法

多くのプログラミング言語では、任意の底を持つ対数を計算するために一工夫が必要だ。 PHP PHPで任意の底の対数得るのは簡単だ。log関数を用いて次のように書く。第二引数を省略するとネイピア数(自然対数の底)eが底となる。 しかし、このように書ける言…

JavaのNaNがおかしい(というか、Doubleがおかしい)

doubleはNaN*1を値として取ることができる(その他にも、正の無限大、負の無限大をとることもできる)。これはIEEE 754で決められている。 NaNはNaNと比較しても等しくないという性質を持っている。つまり、 // aはNaNになる。 double a = 0.0 / 0.0; System…

ハッシュは二分木(ツリー)より速い(ハッシュとツリーの速度比較)

ハッシュは遅いという意見があるようだが、実装や使い方を誤らなければ、基本的にツリーよりハッシュの方が速い。(この記事は以前書いた「ハッシュは本当に遅いのか?いや、遅くない(反語)」を簡潔にまとめたものです) ハッシュとツリーの速度を比較した…

staticメソッドしか持たないクラス

PHPやJavaで、staticメソッドしか持たないクラスを作るとき(例えばJavaのMathクラスのようなクラス)には、そのクラスのインスタンスが生成できないようにする必要がある(staticメソッドにインスタンス経由でメソッドにアクセスするのは明らかに無駄だ。だ…

System.outの深淵

Javaでは、System.outを用いて標準出力を行う。このSystem.outはリファレンスを見るとPrintStream型の変数であることがわかる。PrintStreamは任意のOutputStreamをラッピングして、表示を簡単にするための機能(printlnとか)を提供する出力ストリームだ。つ…

Singleton 変則double-checked locking

問題の理解に誤りがあったので追記しました。(2008-07-27) Singletonパターンを用いるときに、次のような書き方をすることがある。 public class SingletonA { // ただ一つのインスタンスを保持するためのフィールド。 private static SingletonA instance =…

5分でわかるオブジェクト指向

プログラミングを勉強していて、オブジェクト指向でつまる人は多い。その理由は、実際のプログラミングでどのようにオブジェクト指向を使うかという、わかりやすい例が示されていないからだと思う。この記事では、必要最小限の実例でオブジェクト指向の使い…

ハッシュは本当に遅いのか?いや、遅くない(反語)

この記事を簡潔にまとめた記事「ハッシュは二分木(ツリー)より速い」を掲載しました。(2008-08-04) ハッシュと二分木(ツリー)*1では普通はハッシュの方が速いとされる(ハッシュは挿入、参照、削除の時間計算量がO(1)、二分木はO(log N))。しかし、ハ…

Javaの配列の初期化の謎

Javaの配列は↓のように初期化することができる。 int[] a={11, 2, 7, 3, 5}; このことはJava言語規定 - 10.6 配列初期化子にも書かれている(英語原文はこちら)。 でも、実は次のような書き方をすることもできる。 int[] a=new int[]{11, 2, 7, 3, 5}; {}だ…