比较2个常用数字列表

Val*_*riy 2 java

晚上好,我有一个简单的任务,两个在两个列表中找到共同的数字.但我有一个疯狂的错误.我傻眼了,因为我无法想象什么可能是错的.

public class Test {

    public static List<Integer> same(List<Integer> a1, List<Integer> a2){

        List<Integer> lister = new ArrayList<>();

        for(int i = 0; i < a1.size() ; i++){
            for(int j = 0; j < a2.size(); j++){
                System.out.print(a1.get(i) + " vs " + a2.get(j));
                if(a1.get(i) == a2.get(j)){
                    System.out.print("equals");
                    lister.add(a2.get(j));
                }
                System.out.println();
            }
        }
        return lister;
    }


    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner in = new Scanner(System.in);

        int n = in.nextInt();

        List<Integer> list1 = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            list1.add(in.nextInt());
        }

        System.out.println();
        int m = in.nextInt();

        List<Integer> list2 = new ArrayList<>();

        for (int i = 0; i < m; i++) {
            list2.add(in.nextInt());
        }

        List<Integer> result = same(list1,list2);

        System.out.println(result.size());

        in.close();

    }

}
Run Code Online (Sandbox Code Playgroud)

输入:

5 13 20 22 43 146 4 13 22 43 146

输出:

13 vs 13equals
13 vs 22
13 vs 43
13 vs 146
20 vs 13
20 vs 22
20 vs 43
20 vs 146
22 vs 13
22 vs 22equals
22 vs 43
22 vs 146
43 vs 13
43 vs 22
43 vs 43equals
43 vs 146
146 vs 13
146 vs 22
146 vs 43
146 vs 146
3
Run Code Online (Sandbox Code Playgroud)

所以146!= 146.我的错误在哪里?

谢谢.

Kal*_*Kal 7

您正在存储Integer对象,但随后将它们进行比较==

由于它们是引用类型,因此==比较对象引用.

而是使用 if(a1.get(i).intValue() == a2.get(j).intVaue() ){

要么 if(a1.get(i).equals(a2.get(j))

编辑

@Templar很好地解释了为什么对象引用比较适用于128以下的数字.

为了清楚起见,这里是讨论它的实际JLS.

如果被装箱值p为真,假,字节,或在范围\ u0000的一个char到\ u007f,或int或-128和127(含)之间的短号码,然后让r1和r2是的结果p的任何两个拳击转换.始终是r1 == r2的情况.


Luk*_*ler 7

这是一个有趣的问题.如果Integer或Long等包装类的值介于-128和128之间,则它们将保存在池中.使用==运算符可以比较堆栈中两个变量的位置.如果它们在池内,则该位置相等.如果要比较高于128的值,则比较两个不同Integer对象的位置.这就是你需要使用equals方法的原因.