2017-09-14 4 views
-2

私は次のように二次元のArrayListを作るためにArrays.asListを使用している:Arrays.asListで作成したリストで値をunboxしないのはなぜですか?

ArrayList<List<Integer>> li = new ArrayList<List<Integer>>(); 
for(int i = 0; i < 100; i++){ 
    li.add(Arrays.asList(1, (int)(Math.random() * 100))); 
} 

私は次のように要素を並べ替えるしようとすると:

Collections.sort(li, new Comparator<List<Integer>>(){ 
    public int compare(List<Integer> l1, List<Integer> l2){ 
     if(l1.get(0) == l2.get(0)){ 
      return l1.get(1) - l2.get(1); 
     } 
     return l1.get(0) - l2.get(0); 
    } 
}); 

要素が第二で正しくソートされていませんインデックス。しかし

、私はArrays.asListを使用するが、そのような、新しいArrayListを作成しないでください:

ArrayList<List<Integer>> li = new ArrayList<List<Integer>>(); 
for(int i = 0; i < 100; i++){ 
    ArrayList<Integer> toAdd = new ArrayList<Integer>(); 
    toAdd.add(1); 
    toAdd.add((int)(Math.random() * 100)); 
    li.add(toAdd); 
} 
その後、

ソート作品を。

Arrays.asListは値をコピーせず、元の配列によって "バックアップ"されていることを理解しています。しかし、get(0)をcompare関数内で呼び出しても、値を自動的にunboxするべきではありませんか?

if(l1.get(0) == l2.get(0)) { 
} 

それは与えられたコードで常に1あるすべてのリストの最初のインデックスを比較しています。私は見つけることができ

+1

2番目のケースでは正常に動作していますか?結果にランダムな値が正しくソートされているように見えるため、正常に動作していないことは確かですか? – luk2302

+0

最初のケースではうまくいきませんか? –

+1

あなたは '=='を 'equals'でコンパレータ内に置き換えようとしましたか? – XtremeBaumer

答えて

0

唯一の問題は、以下のif文です。 ==演算子を使用すると、実際にはのオブジェクト参照を比較しています。それらの値の平等ではなく、2つの異なる変数がメモリ内の全く同じオブジェクトを指しているかどうか。

あなたがこの範囲内で-128から127までの値の間の整数を比較するとこれがあれば大丈夫ですは、したがってタイプIntegerの二つの異なる変数が同じオブジェクトを参照することができ、がキャッシュされます。

Integer a = 127; 
Integer b = 127; 
System.out.println(a == b); // prints true 

Integer c = 128; 
Integer d = 128; 
System.out.println(c == d); // prints false 

しかし、コードはキャッシュされた整数の範囲内にとどまるので、完全に正常に動作するはずです。

0

==を使用してObjectと比較すると、参照のみが比較されます。そのような場合にオートナンバーを使用する必要はありません。さらに、Javaではヒープを保存するために1回だけ作成することで同じオブジェクトを作成することを最適化することがあります。

関連する問題