web-dev-qa-db-ja.com

Javaで整数配列の場合にnull要素をチェックする方法は?

私はJavaにまったく慣れておらず、整数配列のnull要素のチェックに問題があります。エディターにEclipseを使用していますが、null要素をチェックする行にエラーが表示されます。

不平を言う行:

if(a[i] != null) {

Eclipseからのエラーメッセージ:

The operator != is undefined for the argument type(s) int, null

PHPでは、これは問題なく機能しますが、Javaでは、行が文句を言わないように、配列型を整数からオブジェクトに変更する必要があるようです(以下のように)

Object[] a = new Object[3];

だから私の質問は、整数配列として宣言し、nullをチェックしたい場合、その構文は何ですか?

コード:

public void test() {
        int[] a = new int[3];
        for(int i=0; i<a.length; i++) {
            if(a[i] != null) { //this line complains...
                System.out.println('null!');
            }
        }
    }
14
Meow

Javaでは、intはプリミティブ型であり、nullにすることはできません。ただし、オブジェクトは参照として保存されるため、オブジェクト参照を宣言してもnewオブジェクトを作成しない場合、参照はnullになります。

Integersは、intsのオブジェクトラッパーです。つまり、nullにすることができます。

public void test() {
        Integer[] a = new Integer[3];
        for(int i=0; i<a.length; i++) {
            if(a[i] != null) { //should now compile
                System.out.println('null!');
            }
        }
    }
22
Justin Ardini

プリミティブ型と参照型について

intはプリミティブ型であり、参照型とは異なります。値nullを持つことができるのは参照型のみです。

参考文献

関連する質問


Integerintの比較

Java.lang.Integer は実際には参照型であり、プリミティブ型intの指定された「ボックス」型です。したがって、Integer変数は値nullを持つことができます。

Javaでのオートボクシングの導入により、intからIntegerへの変換、およびその逆の変換を暗黙的に行うことができます。ただし、これらは非常に異なるタイプであり、実際にはnullをボックス化解除しようとするとNullPointerExceptionがスローされることに注意してください。

参考文献

関連する質問


Integerが参照型である結果について

1つの結果はすでに述べられています:Integer変数はnull値を持つことができます。もう1つは、2つのInteger==演算子が参照IDの比較であり、数値の同等性ではないことです。

System.out.println(new Integer(0) == new Integer(0)); // prints "false"

可能な限り、ボックス型よりもプリミティブ型を優先する必要があります。 Effective Java 2nd Edition、Item 49:ボックス化されたプリミティブよりもプリミティブ型を優先する(作成者による強調))からの引用です。

要約すると、選択できる場合は常に、ボックス化されたプリミティブよりもプリミティブを使用します。プリミティブ型はより単純で高速です。ボックス化されたプリミティブを使用する必要がある場合は、注意してください。 オートボクシングは、ボックス化されたプリミティブを使用することの冗長性を減らしますが、危険性は減らしません。プログラムが2つのボックス化されたプリミティブを==演算子と比較すると、ID比較が実行されます。これは、ほぼ確実に必要なものではありません。プログラムがボックス化されたプリミティブとボックス化されていないプリミティブを含む混合型の計算を行う場合、ボックス化解除を行い、プログラムがボックス化解除を行う場合、NullPointerException。最後に、プログラムがプリミティブ値をボックス化すると、コストがかかり、不要なオブジェクトが作成される可能性があります。

関連する質問

  • Javaで新しいInteger(i iが保証されていますか?)==
    • ==Integerおよびintオペランドに対してどのように動作するかについて詳しく説明します

Integerを使用する必要がある場合

Integerintよりも使用する必要がある明白な例外が1つあります:ジェネリック。 Javaジェネリックスは参照型である必要があります。したがって、Javaでは List<int> を使用できません。代わりにList<Integer>を使用する必要があります。 。

関連する質問

も参照してください


適切なデータ構造の使用について

mustnull値を許可するint[]が必要な場合、簡単な答えはInteger[]を使用することです。これで参照型の配列ができたので、一部の要素はnullにすることができます。参照型を使用した場合のすべての結果に注意してください。そうしないと、驚きに遭遇する可能性があります。

ただし、この時点で、代わりにList<Integer>を使用することを真剣に検討します(Effective Java 2nd Edition:Prefer list than array)。リストは配列よりもはるかに機能が豊富で、より大きなJavaコレクションフレームワークとうまく相互運用します。

APIリファレンス

7

'int'をnullにすることはできません。整数(オブジェクト)はできます。したがって、@ Justinが言ったように、Integer []を使用するとnullをテストできますが、int []が機能している場合は、nullをテストする必要はありません。これは、発生しないためです。

3
dty

intはJavaのプリミティブ型であり、nullにすることはできません。 nullにできるのはオブジェクトだけです。

1
Greg