Java 一覧

Java:nullをアンボクシングしようとしたときの挙動

ふとした思い付きで、Integer を返すメソッドが null を返したとき、プリミティブな int 型にアンボクシングさせるようなコードを書くとどうなるか疑問に思ったので試してみました。

public static void main(String[] args){
  int i = getNullInteger();
  System.out.println("i:"+i);
}
	
private static Integer getNullInteger(){
  return null;
}

例えばこんな感じ。

で、実行してみると、NullPointerException が返ってきました。
勝手に NullPointerException を返してプログラムが止まってしまうと困る場合は多いと思うので、メソッドの呼出し元で null チェックをするか、メソッドで null を返すのではなくて、キャッチされる例外をスローするようにしたいところですね。

移植イディオム:strchr

  • 更新日:
  • C言語, Java

ここ最近、C言語からJavaへの移植ばかりやってます。けっこう頻繁に出てくるわりに忘れたりするので、ここにメモしておきます。

今回紹介するのは、C言語の string.h にある strchr を Java に移植する場合です。関数 strchr は、第1引数の文字列の中に、第2引数の文字を検索して、そこへのポインタを返すというものです。詳しくは以下のページを参照してください。

[web] strchr - 初心者のためのポイント学習C言語

C言語版

char *string = "123-4567";
string = strchr( string, '-' );

これをJavaに変換すると、だいたいこんな感じになります。

String s = "123-4567";
s = s.substring(s.indexOf("-"));

Javaで特殊関数を利用するには

  • 更新日:
  • Java

Javaの魅力のひとつとして、豊富な標準ライブラリが提供されていることが挙げられます。他の言語だと自作しないといけない機能が、こうも簡単に利用できるのは開発者にとっては本当に助かります。

ですが、もしプログラムの中にベータ関数やガンマ関数などのような特殊関数を用いらなければならないときはどうすればいいのでしょうか。標準ライブラリのMathクラスでは、そのような特殊関数は提供されていません。つまり、別の方法で特殊関数を使えるようにしないといけないわけです。


幸いにして、これを簡単に解決してくれるライブラリが存在します。Jakarta CommonsのMathパッケージでは、このような様々な関数が実装されています。これを用いることで、すぐに特殊関数を利用できるようになります。特殊関数を提供しているパッケージ名は、「org.apache.commons.math.special」になります。


[web] Jakarta Commons
[web] Overview Math 1.1 API

javaでstaticなメソッドにジェネリクスを用いる場合の宣言

  • 更新日:
  • Java

Javaで、スタティックメソッドでジェネリクスを使いたい時の関数宣言を忘れてしまうことがあったので、ちょっとメモを残しておきます。

public static <T> T GetInstance(Class<T> clazz)
  throws InstantiationException, IllegalAccessException {
    return (T)clazz.newInstance();
}

Java SE 6がリリース

  • 更新日:
  • Java

12月11日にJava SE 6がリリースされていたようです。さっそくインストールしてみました。
[web] Java SE Download : Sun Microsystems

私自身がこのリリースで追加された新機能を利用する機会は少ないと思いますが、メモリのオーバーフローが起こった時になにが原因かを追跡できるようになった点は役に立ちそうです。

double[][] vs. double[] wrapped Class

  • 更新日:
  • Java

doubleの配列の配列と、doubleの配列をクラスで包んだクラスではどちらが速いかを試してみました。
つまり、配列の配列を仮に2次元配列とみて、クラスで同様に実装した場合はどうなるかを検討しました。

比較的単純な実装の元でやってみた結果は以下の通り。
- 配列の配列(4000*1000) : 46ms
- 実装された配列(4000*1000) : 109ms

これを見る限りでは、配列の配列の方が速いことがわかります。配列の構成を変えてもう一度。
- 配列の配列(40000*100) : 31ms
- 実装された配列(40000*100) : 109ms

やはり、クラスでラッパーされているため、関数呼び出しのためのオーバーヘッドが大きいのでしょうか。
テストケースは下記の通りです。

double[][] array = new double[40000][100];
long time = System.currentTimeMillis();
int length0 = array.length;
int length1 = array[0].length;
for(int i=0;i<length0;i++){
	for(int j=0;j<length1;j++){
		array[i][j] = i*length1+j;
	}
}
	
for(int i=0;i<length0;i++){
	for(int j=0;j<length1;j++){
		double val = array[i][j];
	}
}
time = System.currentTimeMillis() - time;
System.out.println(time);

javaで剰余を求める

  • 更新日:
  • Java

CやJavaを使ったことがある方ならきっと知っていることだと思われますが、剰余(=割り算の余り)を簡単に求めることができます。演算子は「%」で、2項演算子です。

使い方も通常の算術演算子と同様です。

int reminder = obj1 % obj2;

これでreminderに剰余が代入されます。

ちなみに、通常の割り算と同じで右側のオペランドに0を指定すると、ArithmeticExceptionがスローされます。ただし、double型やfloat型の場合はNaNが返ります。

Builderパターン

  • 更新日:
  • Java

たとえば、こんな経験はないでしょうか?「引数の多いコンストラクタに間違えて代入してしまって、その後の処理が見当違いのものになってしまった」とか、「毎回同じ順序でメソッドを呼び出してほしいのに、間違えて呼び出された場合の処理が面倒くさい」とか。これらは、確かにプログラマが気をつければいいことでもあるんですが、もう少し安全にクラスを扱うこともできます。こんなときにBuilderパターンが役に立ちます。

まず、Interfaceとして「Builder」インターフェースを準備します。このBuilderインターフェースには、パラメータを設定するための「#setXXX(Object args)」が複数宣言されています。メソッドでObjectクラスを書いていますが、ここはどんなクラスでもかまいません。また、パラメータが設定し終わった後に、生成されたインスタンスを取得するメソッドも宣言します。例えば「#getResult()」といった感じです。

このインターフェースを実装して、具象Builderクラスを作ります。基本的には、生成したいインスタンスにパラメータを設定するだけなんですが、また別に処理を加えてもかまいません。

最後に、この具象Builderクラスを使ってインスタンスを生成すれば大丈夫です。

javaコマンドの基本

  • 更新日:
  • Java

コマンドラインからjavaを実行したい場合があるとします。windows上だと、総合開発環境で単純に実行してくれますが、そういうような状態でないとき(例えばXが入ってないlinuxとか)では、コマンドで実行することになります。

すでにコンパイルされているクラスファイルがあるなら以下のとおりにすれば実行できます。

$ java package.MainClass

もし、実行したいmainメソッドで外部ライブラリなどを使用している場合は、クラスパスを指定して実行します。

$ java -cp .:path/file package.MainClass

続きを読む

修飾子 transient

  • 更新日:
  • Java

transientという修飾子は、フィールドに対して付加される修飾子です。普段は特に気をつけなければならないわけではありませんが、直列化が必要な場合はこの修飾子についても検討する必要があります。

この修飾子が付加されると、直列化の対象からはずされます。そのため、transient修飾子のついたフィールドを復元するためにはprivate void writeObject( ObjectOutputStream ) throws IOExceptionと、private void readObject( ObjectInputStream ) throws IOException, ClassNotFoundExceptionを実装する必要があります。

このページの上部へ

About

tetsuの日記・雑記です。
日々経験したことを記録していきます。

広告

サイト内検索

最近のピクチャ

  • リアディレーラ

月別アーカイブ

最近のコメント