私は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!');
}
}
}
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!');
}
}
}
int
はプリミティブ型であり、参照型とは異なります。値null
を持つことができるのは参照型のみです。
Integer
とint
の比較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
。最後に、プログラムがプリミティブ値をボックス化すると、コストがかかり、不要なオブジェクトが作成される可能性があります。
==
がInteger
およびint
オペランドに対してどのように動作するかについて詳しく説明しますInteger
を使用する必要がある場合Integer
をint
よりも使用する必要がある明白な例外が1つあります:ジェネリック。 Javaジェネリックスは参照型である必要があります。したがって、Javaでは List<int>
を使用できません。代わりにList<Integer>
を使用する必要があります。 。
mustにnull
値を許可するint[]
が必要な場合、簡単な答えはInteger[]
を使用することです。これで参照型の配列ができたので、一部の要素はnull
にすることができます。参照型を使用した場合のすべての結果に注意してください。そうしないと、驚きに遭遇する可能性があります。
ただし、この時点で、代わりにList<Integer>
を使用することを真剣に検討します(Effective Java 2nd Edition:Prefer list than array)。リストは配列よりもはるかに機能が豊富で、より大きなJavaコレクションフレームワークとうまく相互運用します。
'int'をnullにすることはできません。整数(オブジェクト)はできます。したがって、@ Justinが言ったように、Integer []を使用するとnullをテストできますが、int []が機能している場合は、nullをテストする必要はありません。これは、発生しないためです。
intはJavaのプリミティブ型であり、nullにすることはできません。 nullにできるのはオブジェクトだけです。