問1
次の配列を比較する式insert code
に適切なコードを書いてください。
ただし、配列の要素が同じ場合、true
を返してください。
int[] numA = {1, 2, 3};
int[] numB = {1, 2, 3};
boolean isSameArrays = /* insert code */
解答
例Arrays.equals(numA, numB);
配列同士の比較で==
またはnumA.equals(numB)
の使用は、配列の中身ではなく参照の比較となり、false
を返します。
予期せぬ結果を招く可能性があるので、あえて参照の等価性を比較する場合を除き、使うべきではありません。
問2
出力を答えてください。
Studentクラス
class Student{
private String name;
private Integer num;
Student(String name, Integer num){
this.name = name;
this.num = num;
}
String getName() {return name;}
Integer getNum(){return num;}
public String toString() {return name;}
}
Main
クラス
Comparator<Student> myComparator = new Comparator<>() {
@Override
public int compare(Student studentA, Student studentB) {
Integer a = studentA.getNum();
Integer b = studentB.getNum();
return b < a ? 1 : (a == b ? 0 : -1);
}
};
List<Student> students = new ArrayList<>();
students.add(new Student("AIOI", 1000));
students.add(new Student("INOUE", 1000));
students.add(new Student("URABE", 1000));
students.stream().sorted(myComparator).forEach(System.out::println);
解答
URABE
INOUE
AIOI
Integer型での比較演算子が問題です。
a == b
ではInteger
型の比較をしていますが、参照の等価を返すのでfalse
を返します。
三項演算子により、-1
を返すので、students
の順番が入れ替わります。
より詳細な注意点について、問3の解答も確認することを推奨します
問3
次のコードの出力について正しい選択肢を選んでください。
List<Integer> list = new ArrayList<>(Arrays.asList(100, 200));
List<Integer> list2 = new ArrayList<>(Arrays.asList(100, 200));
int count = 0;
for(int i = 0; i < 2; i++) {
if(list.get(i) == list2.get(i)) count++;
}
System.out.println(count);
- 2
- 1
- コンパイルエラー
- 実行時例外
- 実行時エラー
- 状況による
解答
正解: 6 状況による
Integer
クラスについての問題です。プリミティブ型のint
では==
での比較は正常に行われます。
しかし、ラッパークラスであるInteger
では、JVMの実装によっては等価演算子による比較で、等価にならない可能性があります。
Integerクラスでは-128 ~ 127の範囲の整数について、キャッシュされることが保証されています。
その条件でのコードの出力結果は1になります。
よって選択肢2の出力「1」も状況にもよりますが、正解になります。
ボクシング変換の対象となる値 p が true, false, byte, \u0000 から \u007f までの範囲にある char, あるいは -128 から 127 までの数値となる int や short である場合, 任意の p に対する2つのボクシング変換結果を r1 と r2 とする。この場合, 常に r1 == r2 が成立する。