ArrayList值差异

时间:2014-04-02 03:25:18

标签: java arraylist

我让这个程序接收一个数字列表作为输入,它需要找到没有一对的数字,它可以很好地处理小输入,但是当我提供更大的输入(超过256)时真的很奇怪。检查每对数字的条件开始说两个相等的数字是不一样的:/我真的不知道为什么。有谁有想法吗?

import java.util.Scanner;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
public class HelpRequired{

public static void main(String[] args){

    Scanner s = new Scanner(System.in);
    PrintWriter pw = new PrintWriter(System.out);

    int singleton=0;
    int N;

    N = s.nextInt();

    ArrayList<Integer> list = new ArrayList<Integer>();

    for(int i = 0; i<N; i++){
        list.add(s.nextInt());
    }

    Collections.sort(list);


    for(int i = 0;i<list.size();i+=2){
        System.out.println("Comparing "+list.get(i)+" with "+list.get(i+1)+" "+(list.get(i)!=list.get(i+1)));
        if(list.get(i)!=list.get(i+1)){ /*This starts to say that, for example 128!=128 is true and I have no idea why*/
            singleton = list.get(i);
            break;
        }
    }
    pw.printf("%d\n",singleton);

    pw.flush();





}

}

这是输入文件的一个片段:

73
73
74
74
75
75
76
76
77
77
78
78
79
79
80
80

这是产生的输出片段:

Comparing 116 with 116 false
Comparing 117 with 117 false
Comparing 118 with 118 false
Comparing 119 with 119 false
Comparing 120 with 120 false
Comparing 121 with 121 false
Comparing 122 with 122 false
Comparing 123 with 123 false
Comparing 124 with 124 false
Comparing 125 with 125 false
Comparing 126 with 126 false
Comparing 127 with 127 false
Comparing 128 with 128 true

2 个答案:

答案 0 :(得分:2)

由于您无法在集合中使用原始值(例如int),因此Java会将它们包装在Integer对象中。这称为自动装箱:http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

当您比较使用==的两个数字时,您要比较对象标识而不是对象值。在您的示例中,128的两个值由不同的Integer对象表示,因此==为false。

Java具有以下功能:当表示-127到127范围内的值时,您可以保证为相同的值获取相同的Integer对象。这意味着引用相等性将在该范围内起作用,但它不一定在该范围之外工作。

来自language spec

  

如果被装箱的值是......在-128和127之间的一个int(包括),那么让r1和r2成为p的任意两次装箱转换的结果。始终是r1 == r2。

的情况

要解决您的问题,您应该使用list.get(i).intValue() = ...list.get(i).equals(...)代替。

答案 1 :(得分:0)

public class HelpRequired {

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        PrintWriter pw = new PrintWriter(System.out);

        int singleton = 0;
        int N;

        N = s.nextInt();

        ArrayList<Integer> list = new ArrayList<Integer>();

        for (int i = 0; i < N; i++) {
            list.add(s.nextInt());
        }

        Collections.sort(list);

        for (int i = 0; i < list.size(); i += 2) {
            System.out.println("Comparing " + list.get(i) + " with "
                    + list.get(i + 1) + " " +(list.get(i).equals( list.get(i + 1))));
            if (list.get(i).equals( list.get(i + 1))) { /*
                                                 * This starts to say that, for
                                                 * example 128!=128 is true and
                                                 * I have no idea why
                                                 */
                singleton = list.get(i);
                break;
            }
        }
        pw.printf("%d\n", singleton);

        pw.flush();

    }

}

尝试以上。错误是在比较中。您正在将输入值添加到列表中。这些号码正在自动提交给Integer。要比较包装类,你应该使用equals方法,就像上面的代码一样。