0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Java Gold 例題 比較演算

Posted at

問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);
  1. 2
  2. 1
  3. コンパイルエラー
  4. 実行時例外
  5. 実行時エラー
  6. 状況による
解答

正解: 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 が成立する。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?