2017-09-14 27 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有时可以通过创建一次来保存堆来优化创建相同的对象,因此通过引用进行比较有时可行,有时不会。

相关问题