红茶的个人站点

  • 首页
  • 专栏
  • 开发工具
  • 其它
  • 隐私政策
Awalon
Talk is cheap,show me the code.
  1. 首页
  2. 专栏
  3. Java编程笔记
  4. 正文

Java编程笔记32:包装类与==

2023年8月25日 948点热度 0人点赞 0条评论

1.基本类型之间

先看不同类型的基本类型之间的比较:

private static void test2(){
    int a = 100;
    long b = 100L;
    boolean result = b == a;
    System.out.println(result ? "相等" : "不相等");
}

结果是:

相等

这里实际上进行了隐式类型转换,编译器将 int 类型“提升”为 long 类型后进行比较,相当于:

boolean result = b == (long)a;

2.包装类与基本类型

再看包装类与基本类型:

private static void test1() {
    Integer a = Integer.valueOf(100);
    long b = 100L;
    boolean result = b == a;
    System.out.println(result ? "相等" : "不相等");
}

输出:

相等

当包装类与基本类型进行比较时,编译器会将包装类先解包为基本类型,然后再进行隐式类型转换(如果类型不同的话)后比较。

相当于:

boolean result = b == (long)a.valueOf();

3.包装类之间

最后看不同类型的包装类之间的比较:

private static void test3() {
    Integer a = Integer.valueOf(100);
    Long b = Long.valueOf(100L);
    // boolean result = b == a;
    // System.out.println(result ? "相等" : "不相等");
}

被注释部分代码报错,无法通过编译。因为 == 操作符两边的类型必须相同,或者是编译器进行隐式类型转换后相同的类型。

这里两个包装类类型不相同,且编译器也不会同时将这两个包装类解包并进行类型转换后比较,因为解包操作只会发生在包装类和基本类型的比较时。这样做是有意义的,如果两个对象比较也会存在解包,可能会导致代码执行结果与你的预期不符。

你可能期望使用 equals 方法进行比较:

private static void test5() {
    Integer a = Integer.valueOf(100);
    Long b = Long.valueOf(100L);
    boolean result = b.equals(a);
    System.out.println(result ? "相等" : "不相等");
}

输出:

不相等

遗憾的是包装类的 equals 方法并不是很“智能”,它们只能用于比较同类,并不能用于比较类型不同的数值类型的包装类。

3.1.方式一

如果要比较两个不同类型的包装类,最简单的方式是将其中一个包装类转换为基本类型后进行比较:

private static void test4() {
    Integer a = Integer.valueOf(100);
    Long b = Long.valueOf(100L);
    boolean result = (long)b == a;
    System.out.println(result ? "相等" : "不相等");
}

输出:

相等

此时另一个包装类型会被自动解包,并且编译器会进行合适的隐式类型转换。

3.2.方式二

或者你也可以选择更麻烦一些的方式——将另一个包装类对象“转换”为类型相同的包装类对象后用 equals 方法进行比较:

private static void test6() {
    Integer a = Integer.valueOf(100);
    Long b = Long.valueOf(100L);
    boolean result = b.equals(Long.valueOf((long)a));
    System.out.println(result ? "相等" : "不相等");
}

输出:

相等

实际上这里的显式类型转换(long)a可以省略:

boolean result = b.equals(Long.valueOf(a));

因为Long.valueOf接收的是long类型参数,这里 a 会自动解包为 int 类型,然后通过隐式类型转换变为 long 类型。

当然,相比之下这样做太过繁琐,更推荐使用类型转换和==操作符的方式。

The End,谢谢阅读。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: == 包装类
最后更新:2023年8月25日

魔芋红茶

加一点PHP,加一点Go,加一点Python......

点赞
< 上一篇

文章评论

取消回复

*

code

COPYRIGHT © 2021 icexmoon.cn. ALL RIGHTS RESERVED.
本网站由提供CDN加速/云存储服务

Theme Kratos Made By Seaton Jiang

宁ICP备2021001508号

宁公网安备64040202000141号