Java中Integer和int的使用及注意点

 更新时间:2025年01月03日 09:49:01   作者:心流时间  
文章主要介绍了Java中Integer和Long类的缓存机制以及它们的比较方式,Integer和Long类在-128到127之间的值会被缓存,因此在这个范围内的值比较时可以使用==运算符,而超出这个范围的值则需要使用equals()方法进行比较

1. Integer缓存了-128到127之间的值

不在这个范围,比较值时需要用equals()方法

  • 在这个范围内,Integer.value(int i) 将返回相同的对象实例。
  • 超出这个范围,每次调用都会创建新的Integer对象。
  • Long也是。
    public static void main(String[] args) {
        // Integer和Long都是缓存在-128~127之间,所以可以直接比较,不用equals
        Integer i1 = 127;
        Integer i2 = 127;
        System.out.println(i1 == i2);
        System.out.println(i1.equals(i2));
        System.out.println("=====");
        Integer i3 = 128;
        Integer i4 = 128;
        System.out.println(i3 == i4);
        System.out.println(i3.equals(i4));
        System.out.println("=====");

        Long ii1 = 127L;
        Long ii2 = 127L;
        Long ii3 = 128L;
        Long ii4 = 128L;
        System.out.println(ii1 == ii2);
        System.out.println(ii3 == ii4);
        System.out.println(ii1.equals(ii2));
        System.out.println(ii3.equals(ii4));
    }
  • 打印:

true
true
=====
false
true
=====
true
false
true
true

Integer的equals方法源码

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

结论:

  • 通过equals()源码可以看到它是比较的Integer中具体的值,
  • 所以我们如果是比较对象或者比较-128~127的值可以用==,
  • 而如果比较其他的值就需要用equals()了

2. 由于int类型是基本数据类型,Integer拆箱时不能为空

  • 例1:
    public static void main(String[] args) {
        // 由于int类型是基本数据类型,拆箱时不能为空
        // 例1
        Integer i5 = null;
        System.out.println(i5 == 3);
    }

报错:

  • 例2:
    public static void main(String[] args) {
        // 由于int类型是基本数据类型,拆箱时不能为空
        // 例2
        Integer i5 = null;
        test1(i5);
    }

    public static void test1(int i) {
        System.out.println(i);
    }

结论:

  • 除了缓存导致比对值可能出现问题之外,
  • 我们熟知的Integer是包装类,可以为null,int是基本数据类型,不可以为null,
  • 在这一点上别忘了包装类拆箱时不能为null的问题。
  • 所有包装类拆箱成基本数据类型时都存在此问题。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring MVC学习之DispatcherServlet请求处理详析

    Spring MVC学习之DispatcherServlet请求处理详析

    这篇文章主要给大家介绍了关于Spring MVC学习教程之DispatcherServlet请求处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2018-11-11
  • java+mysql模拟实现银行系统

    java+mysql模拟实现银行系统

    这篇文章主要为大家详细介绍了java+mysql模拟实现银行系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Java8如何使用Lambda表达式简化代码详解

    Java8如何使用Lambda表达式简化代码详解

    这篇文章主要给大家介绍了关于Java8如何使用Lambda表达式简化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • maven项目无法读取到resource文件夹的问题

    maven项目无法读取到resource文件夹的问题

    这篇文章主要介绍了maven项目无法读取到resource文件夹的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring MVC中@Controller和@RequestMapping注解使用

    Spring MVC中@Controller和@RequestMapping注解使用

    这篇文章主要介绍了Spring MVC中@Controller和@RequestMapping注解使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • java获取一个文本文件的编码(格式)信息

    java获取一个文本文件的编码(格式)信息

    这篇文章主要介绍了java获取一个文本文件的编码(格式)信息,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍

    Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍

    这篇文章主要介绍了Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍的相关资料,这里提供实例代码及说明具体如何实现,需要的朋友可以参考下
    2016-12-12
  • Java 精炼解读方法的定义与使用

    Java 精炼解读方法的定义与使用

    Java语言中的“方法”(Method)在其他语言当中也可能被称为“函数”(Function)。对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到“随时任意使用”,那么就可以将这些代码放在一个大括号“{}”当中,并且起一个名字。使用的时候,直接找到名字调用即可
    2022-03-03
  • Java设计模式之代理模式解析

    Java设计模式之代理模式解析

    这篇文章主要介绍了Java设计模式之代理模式解析,代理模式为一个对象提供一个替身,以控制对这个对象的访问,即通过代理对象访问目标对象,需要的朋友可以参考下
    2023-12-12
  • SpringBoot使用JavaMailSender实现发送邮件+Excel附件

    SpringBoot使用JavaMailSender实现发送邮件+Excel附件

    项目审批完毕后,需要发送邮件通知相关人员,并且要附带数据库表生成的Excel表格,这就要求不光是邮件发送功能,还要临时生成Excel表格做为附件,本文详细介绍了SpringBoot如何使用JavaMailSender实现发送邮件+Excel附件,需要的朋友可以参考下
    2023-10-10

最新评论