• Integer和int


    1.定义

    int是Java中的一种基本数据类型,用于表示整数。它是Java语言中最常用的数据类型之一,可以直接进行数值运算,无需通过封装类进行转换。

    Integer是Java中的一个封装类,用于表示整数。它是int的封装类,可以将int类型的数据转换为Integer类型的数据。Integer类提供了许多操作整数的方法,使得整数的操作更加方便和灵活。

    2. 区别

    2.1 数据类型

    int是Java中的基本数据类型,而Integer是int的封装类。int类型的数据直接存储在内存中的栈中,而Integer类型的数据则存储在堆中的对象中。

    2.2 可空性

    2.2.1 int的可空性

    int是Java的基本数据类型之一,它是一种原始类型,因此它不具有可空性。int类型的变量不能为null。如果将一个int变量赋值为null,编译器将会报错

    int i = null; // 编译错误:不兼容的类型:无法转换为int
    
    • 1

    2.2.2 Integer的可空性

    Integer是一种包装类型,它可以为null。可以将一个Integer类型的变量赋值为null。

    Integer i = null;
    
    • 1

    使用一个可能为null的Integer类型的变量时,你需要小心。如果在一个为null的Integer类型的变量上调用方法,程序将会抛出NullPointerException异常。

    Integer i = null;
    int j = i.intValue(); // 抛出NullPointerException
    
    • 1
    • 2

    为了避免这种情况,可以使用Java 8中引入的Optional类。Optional类是一个容器对象,它可能包含null或非null的值。通过使用Optional类,可以安全地使用可能为null的Integer类型的变量。

    Optional optionalInteger = Optional.ofNullable(i);
    int j = optionalInteger.orElse(0);
    
    • 1
    • 2

    使用Optional.ofNullable()方法将可能为null的Integer类型的变量包装成一个Optional对象。然后,使用orElse()方法指定了当optionalInteger对象的值为null时应该返回的默认值。

    int是一种原始类型,它不具有可空性,而Integer是一种包装类型,它可以为null。当使用可能为null的Integer类型的变量时,可以使用Optional类来避免NullPointerException异常的抛出。

    2.3 效率和性能

    int的效率和性能比Integer要高。因为int类型的数据直接存储在栈中,不需要进行堆内存的分配和垃圾回收。而Integer类型的数据需要进行堆内存的分配和垃圾回收,效率和性能相对较低。

    2.4 自动装箱和拆箱

    Java中的自动装箱和拆箱是指在需要Integer类型的对象时,系统会自动将int类型的数据转换为Integer类型的对象。在需要int类型的数据时,系统会自动将Integer类型的对象转换为int类型的数据。这个功能可以使得代码更加简洁,但是也会带来一些性能的损失。

    2.4.1 自动装箱

    自动装箱是指将基本数据类型转换为对应的包装类类型的过程。在Java中,基本数据类型可以自动转换为包装类类型,而无需进行显式的类型转换。

    int num = 10;
    Integer integerNum = num; // 自动装箱
    
    • 1
    • 2

    2.4.2 自动拆箱

    自动拆箱是指将包装类类型转换为对应的基本数据类型的过程。在Java中,包装类类型可以自动转换为基本数据类型,而无需进行显式的类型转换。

    Integer integerNum = 10;
    int num = integerNum; // 自动拆箱
    
    • 1
    • 2

    2.4.3 注意事项

    在进行自动装箱和拆箱操作时,需要注意以下几点:

    1. 自动装箱和拆箱操作会影响程序的性能,因此在性能要求较高的场景下,应尽量避免使用自动装箱和拆箱操作。
    2. 在进行自动拆箱操作时,如果包装类对象为null,则会抛出NullPointerException异常。
    3. 在进行自动拆箱操作时,如果包装类对象与基本数据类型不匹配,则会抛出ClassCastException异常。
    Integer integerNum = null;
    int num = integerNum; // 抛出NullPointerException异常
    
    Integer integerNum = 10;
    double doubleNum = integerNum; // 抛出ClassCastException异常
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. Integer是int的包装类,int则是java的一种基本的数据类型;
    2. Integer变量必须实例化之后才能使用,而int变量不需要实例化;
    3. Integer实际是对象的引用,当new一个Integer时,实际上生成一个指针指向对象,而int则直接存储数值
    4. Integer的默认值是null,而int的默认值是0。

    3. 比较

    1. New生成的是两个Integer对象是两个不同的对象,其内存地址不同。
        public static void main(String[] args) {
            Integer i = new Integer(100);
            Integer j = new Integer(100);
            System.out.println(i == j);//false
            System.out.println(i.equals(j));//true
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 包装类Integer和基本数据类型比较的时候,java会自动拆箱为int,再进行比较,实际上就是两个int变量进行比较
        public static void main(String[] args) {
            int a = new Integer(100);
            Integer b = new Integer(100);
            System.out.println(a == b);//true
            System.out.println(b.equals(a));//true
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 非new生成的Integer变量指向的是Java常量池中的对象,而new出来的对象指向的是堆中新建的对象,两者内存地址不同
        public static void main(String[] args) {
            Integer i = new Integer(100);
            Integer j = 100;
            System.out.println(i == j);//false
            System.out.println(i.equals(j));//true
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. -128到127之间的值都是直接从缓存中取出的:如果int型参数在IntegerCache.low和IntegerCache.high范围内,则直接由IntegerCache返回;否则new一个新的对象返回。
        public static void main(String[] args) {
            Integer i = 127;
            Integer j = 127;
            System.out.println(i == j);//true
            System.out.println(i.equals(j));//true
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
        public static void main(String[] args) {
            Integer i = 128;
            Integer j = 128;
            System.out.println(i == j);//false
            System.out.println(i.equals(j));//true
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    释放静电行为监测识别系统
    C++:多态、多态的实现及优点、虚函数(纯虚函数)
    基于单目的光流法测速
    django学习记录07——订单案例(复选框+ajax请求)
    ThinkPHP5文档学习——配置
    React总结1
    docker安装mysql(单体)
    Single-Shot Refinement Neural Network for Object Detection
    从数字化到智能化再到智慧化,智慧公厕让城市基础配套更“聪明”
    java计算机毕业设计网络招聘系统源码+系统+数据库+lw文档+mybatis+运行部署
  • 原文地址:https://blog.csdn.net/muzi187/article/details/133984503