2017-09-14 30 views
-2

我一直在使用Arrays.asList做一個二維的ArrayList如下:爲什麼不使用Arrays.asList創建的列表取消裝箱值?

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)不應該在比較函數內部自動調用unbox的值嗎?

+1

你確定它在第二種情況下工作 - 你確定它不似乎工作,因爲隨機值使結果似乎排序正確? – luk2302

+0

你確定它在第一種情況下不起作用嗎? –

+1

你有沒有嘗試用'equals'替換'=='在比較器中? – XtremeBaumer

回答

0

我能發現的唯一問題是下面的if語句:

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

這一切名單,這在給定的代碼始終是1的第一個指標進行比較。當您使用==運營商時,您實際上正在比較對象引用。不是它們的值相等,而是兩個不同的變量是否指向內存中完全相同的對象。

只要比較-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進行比較,那麼只比較參考值。在這種情況下,不需要使用autounboxing。此外,Java有時可以通過創建一次來保存堆來優化創建相同的對象,因此通過引用進行比較有時可行,有時不會。

相關問題