当前位置: 首页 > 知识库问答 >
问题:

Java中的包装类和泛型说明[副本]

葛志国
2023-03-14

在下面的代码中,system.out.println(sumInteger(bigs)==sumInteger(bigs));行显示为false。但是当我们再次比较另一个整数包装类system.out.println(bc==ab);时,它返回true。为什么包装器类的比较在第一种情况下是false,而在第二种情况下是true?

import java.util.Arrays;
import java.util.List;

public class Arrays {

    public void array1() {

        List<Integer> bigs = Arrays.asList(100,200,300);
        System.out.println(sumInteger(bigs) == sum(bigs)); // 1. Output: true
        System.out.println(sumInteger(bigs) == sumInteger(bigs)); //2. Output: false

        Integer ab = 10;
        System.out.println(ab == 10); //3. Output: true
        Integer bc = 10;
        System.out.println(bc == ab); //4. Output: true
    }

    public static int sum (List<Integer> ints) {
        int s = 0;
        for (int n : ints) { s += n; }
        return s;
    }

    public static Integer sumInteger(List<Integer> ints) {
        Integer s = 0;
        for (Integer n : ints) { s += n; }
        return s;
    }

    public static void main(String[] args) {
        Array tm = new Array();
        tm.array1();
    }
}

共有1个答案

朱伯寅
2023-03-14
   System.out.println(sumInteger(bigs) == sum(bigs)); // 1. ***Output: true
   System.out.println(sumInteger(bigs) == sumInteger(bigs)); //2. ***Output: false

sumInteger()返回一个整数,而sum()返回一个int,因此您正在测试整数与int的相等性,这会导致整数自动解箱,因此您最终将int与int进行比较。两个int现在具有相同的值,因此为“true”。

sumInteger()返回一个整数,再次调用sumInteger()返回一个整数。这两个整数是单独创建的对象,但它们都持有相同的内部值。当您使用'==''比较它们时,它会比较引用,并且看到每个对象是如何独立创建的,引用是不相等的,因此是'false'。如果要测试值是否相等,就需要使用.equals()方法

 类似资料:
  • 首先,由于java有一个严格的类型系统,在编译时检查程序的类型正确性,在执行前将类加载到字节码验证器时检查程序的字节码。 虽然泛型的引入拓宽了Java类型系统的潜力,但由于Java有子类型,出现了许多问题,如上例所示: 在上面的例子中,我们使用String类是Object的子类。我的问题是,是什么原因导致编译器没有产生任何关于上述程序的警告。当我尝试运行它时(当然)抛出一个异常。还有上面的程序在j

  • 问题内容: 我是java泛型的新手,我的问题是: 在上面的语句中,当函数的返回类型为void时,为什么我们以前使用过?为什么此语法有效? 根据理论,方法本身可以是返回类型吗? 我的参考程序是 问题答案: 在这里没有什么做的返回类型; 这意味着这是一个通用函数,可以采用各种类型的数组。为了更容易理解,代码可能是这样的: 所以它告诉函数 “有一个通用类型,您接受的数组,因此,例如,如果我用您接受的通用

  • 问题内容: 我希望了解这个概念: object-通用,将被擦除为实际类型。 对象-将被擦除成什么? 目的; 之间有什么区别,和? 我可以很容易地理解#1,但是呢: 两者有什么区别?我读到我不能像其他变量一样显式地使用变量,它与对象而不是类型有关。 但是实际原因是什么?为什么不能只写一个对象()而不是通配符()?我不知道这两种情况下的对象类型。 另外,我想知道擦除的目的是什么? 问题答案: 我将列出

  • 我有以下简单的测试用例 结果是: 2 1 我不明白,为什么使一个大小的列表,元素是char[]。

  • 问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符

  • 如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个