Long和Integer使用equals比较数值问题

今天查出数据时,然后想通过stream的filter过滤出数据,使用的条件是Long.equals(Integer),
然后发现一直是false,然后打印测试了一下

List<ContractExpensesEditVo.ContractExpensesDetail> basicList = contractExpensesDetail
    .stream().filter(obj ->{
            System.out.println("Long.equals(Integer):"+obj.getFirstSubjectId().equals(ContractApiCode.BASIC_FEE.getCode()));
            System.out.println("Integer.equals(Long):"+ContractApiCode.BASIC_FEE.getCode().equals(obj.getFirstSubjectId()));
            System.out.println(obj.getFirstSubjectId().longValue()==ContractApiCode.BASIC_FEE.getCode());
           return obj.getFirstSubjectId().longValue()==ContractApiCode.BASIC_FEE.getCode();
        } )
    .collect(Collectors.toList());

结果:

在这里插入图片描述

按理说equals比较的是值,应该是true的,但是打印出来的是false,
查了资料才发现Long和Integer的类都重写了equals方法如下:

//Long
public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}

//Integer
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

他们的equals方法都会先判断类型然后再比较,类型不同直接返回false

后来改了写法:

1.obj.getFirstSubjectId().longValue() == ContractApiCode.CUSTOMS_FEE.getCode()
2.ContractApiCode.BASIC_FEE.getCode().equals(obj.getFirstSubjectId().longValue())

1.这么写就变成了long==Integer,Integer会进行拆箱转为int类型,然后向上转型为long类型,也就是变为了long==long ,这样就可以比较了

Java中,`Integer` `Long` 是两种不同的整数包装类,分别对应基本数据类型 `int` `long`。它们都位于 `java.lang` 包中,提供了对基本类型的封装,并包含了一些实用的静态方法用于类型转换、数值解析等操作。 ### 数据范围与内存占用 - `Integer` 表示 32 位带符号的整数,其取值范围为 -2^31 到 2^31 - 1,即从 -2147483648 到 2147483647。它占用 4 个字节(32 位)的内存空间[^1]。 - `Long` 表示 64 位带符号的整数,其取值范围为 -2^63 到 2^63 - 1,即从 -9223372036854775808 到 9223372036854775807。它占用 8 个字节(64 位)的内存空间[^1]。 ### 自动装箱与拆箱 - 在 JDK 5 及以后版本中,Java 支持自动装箱拆箱功能。例如,将 `int` 类型赋值给 `Integer` 对象时,Java 会自动调用 `Integer.valueOf()` 方法进行装箱;将 `Integer` 对象赋值给 `int` 类型时,Java 会自动调用 `intValue()` 方法进行拆箱[^1]。 - 同理,`long` 类型与 `Long` 对象之间的转换也可以通过自动装箱拆箱完成,分别调用 `Long.valueOf()` `longValue()` 方法[^1]。 ### 常用方法 - `Integer` 提供了多种静态方法,如 `parseInt()` 用于将字符串转换为 `int` 类型,`toBinaryString()`、`toHexString()` `toOctalString()` 分别用于将整数转换为二进制、十六进制八进制字符串表示形式,以及 `MAX_VALUE` `MIN_VALUE` 静态常量表示最大值最小值。 - `Long` 也提供了类似的方法,如 `parseLong()` 用于将字符串转换为 `long` 类型,`toBinaryString()`、`toHexString()` `toOctalString()` 分别用于将长整数转换为二进制、十六进制八进制字符串表示形式,以及 `MAX_VALUE` `MIN_VALUE` 静态常量表示最大值最小值[^1]。 ### 比较方式 - 对于 `Integer` `Long` 等整型包装类对象之间的值比较,建议使用 `equals()` 方法而非 `==` 运算符。因为 `==` 运算符比较的是对象的引用地址,而 `equals()` 方法则比较的是对象的实际值[^2]。 ### 示例代码 ```java // 自动装箱 Integer integerObj = 100; Long longObj = 100L; // 自动拆箱 int intValue = integerObj; long longValue = longObj; // 字符串转换为数值 int parsedInt = Integer.parseInt("123"); long parsedLong = Long.parseLong("1234567890"); // 数值转换为字符串 String intStr = String.valueOf(100); String longStr = String.valueOf(100L); // 输出二进制、十六进制、八进制表示 System.out.println(Integer.toBinaryString(10)); // 输出1010 System.out.println(Integer.toHexString(16)); // 输出10 System.out.println(Integer.toOctalString(8)); // 输出10 System.out.println(Long.toBinaryString(10)); // 输出1010 System.out.println(Long.toHexString(16)); // 输出10 System.out.println(Long.toOctalString(8)); // 输出10 // 输出最大值最小值 System.out.println(Integer.MAX_VALUE); // 输出2147483647 System.out.println(Integer.MIN_VALUE); // 输出-2147483648 System.out.println(Long.MAX_VALUE); // 输出9223372036854775807 System.out.println(Long.MIN_VALUE); // 输出-9223372036854775808 ``` ### 总结 - `Integer` `Long` 分别对应 `int` `long` 基本类型,提供了封装功能。 - 它们支持自动装箱拆箱,简化了基本类型与对象之间的转换。 - 提供了丰富的静态方法用于数值解析格式转换。 - 在进行对象值比较时,应使用 `equals()` 方法以确保正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值