Integer和int相比较

news2024/11/28 22:39:11

Integer和int相比较

一、 Integer类

在Java中,”万物皆对象“,但是八种基本数据类型是个例外,出于性能等方面的考虑,八种基本数据类型没有类和对象的概念,相应的变量值直接在栈内存中存放。但这带来了一些问题,特别是对于集合类的使用,使用集合类时要求泛型必须是类类型,因此,引入了Integer类。Integer是Java中的一个封装类,用于表示整数。它是int的封装类,可以将int类型的数据转换为Integer类型的数据。

有以下三种方法实例化Integer对象:

1.1 构造函数

new Integer(int value)

构造函数,用于实例化一个Integer类的对象。与普通类通过new实例化对象的过程相同,声明的对象引用存放在栈中,该对象引用指向堆中的某块内存区域,该内存区域存放new出的具体数据。比如执行完语句Integer i1 = new Integer(123); 后,栈以及堆中的内存将按以下方式分配:

通过new实例化Integer对象

注意:

从Java9之后,该构造函数已经被废弃,因此对于Java9及其之后的版本不能再使用构造函数实例化Integer对象。

1.2 静态方法

Integer.valueOf(int i)

静态方法,返回指定值的Integer对象,推荐使用该方法实例化Integer对象。下面是该方法的具体实现:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

IntegerCache.cache是一个用于存放Integer对象的数组,该数组用于缓存区间[IntegerCache.low, IntegerCache.high]内的整数。当通过静态方法valueOf(i)实例化Integer对象时:

  • 若 i∈[IntegerCache.low, IntegerCache.high],直接从数组IntegerCache.cache中取对象以节省内存空间(这也是推荐使用该方法实例化Integer对象的重要原因)
  • 若 i∉[IntegerCache.low, IntegerCache.high],通过构造函数实例化一个新的对象
  • [IntegerCache.low, IntegerCache.high]的默认值为**[-128, 127]**
  • IntegerCache.high的值可以通过 -XX:AutoBoxCacheMax 设置,IntegerCache.high = max(127, -XX:AutoBoxCacheMax)

比如:

public class Main {
    public static void main(String[] args) {
        Integer i1 = Integer.valueOf(127);
        Integer i2 = Integer.valueOf(127);

        Integer i3 = Integer.valueOf(130);
        Integer i4 = Integer.valueOf(130);
    }
}

对于上面这段代码,栈以及堆中的内存将按以下方式分配:

通过静态方法实例化Integer对象

1.3 直接赋值

Integer i1 = 127;

这种方法适用于JDK 1.5及以后的版本,JDK 1.5增加了自动装箱、拆箱的功能,JVM可以完成基本类型和它们对应的包装类之间的自动转换(但并不意味着可以通过基本类型调用它们的包装类才具有的方法),上述代码等价于:

Integer i1 = Integer.valueOf(127);

二、 Integer对象之间的比较

对象之间的比较有两种方式:

  • == :比较两个对象指向的内存区域是否一致

  • equals():Integer对equals()方法进行了重写,比较对象的整数值是否相等

    // Integer 类对 equals 方法进行了重写
    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
    

对于下面代码:

public class Main {
    public static void main(String[] args) {
        Integer i1 = Integer.valueOf(127);
        Integer i2 = Integer.valueOf(127);
        Integer i3 = 127; // 等价于 Integer.valueOf(127);
        System.out.println(i1 == i2); // true
        System.out.println(i1 == i3); // true
        System.out.println(i1.equals(i2)); // true

        Integer i4 = Integer.valueOf(130);
        Integer i5 = Integer.valueOf(130);
        Integer i6 = 130; // 等价于 Integer.valueOf(130);
        System.out.println(i4 == i5); // false
        System.out.println(i4 == i6); // false
        System.out.println(i4.equals(i5)); // true

        Integer i7 = new Integer(1); // 只适用于JDK8及之前的版本
        Integer i8 = new Integer(1);
        System.out.println(i7 == i8); // false
        System.out.println(i7.equals(i8)); // true
    }
}

栈以及堆中的内存将按以下方式分配:
Integer对象之间的比较

  • i1、i2、i3都是通过静态方法Integer.valueOf得到的Integer对象,由于值127在区间[-128, 127]内,所以得到的都是同一个存放在IntegerCache.cache数组中的对象,即i1、i2、i3指向的内存区域相同,因此相互使用’=='比较时结果为true。而’equals()'比较的是存放在对象中的整数,因此相互使用’equals()'比较时结果为true。
  • i4、i5、i6也都是通过静态方法Integer.valueOf得到的Integer对象,但值130不在区间[-128, 127]内,所以得到的都是分别通过构造函数new出的对象,即i4、i5、i6指向的内存区域不同,因此相互使用’=='比较时结果为false。而’equals()'比较的是存放在对象中的整数,因此相互使用’equals()'比较时结果为true。
  • i7、i8都是通过构造函数new出的Integer对象,即i7、i8指向的内存区域不同,因此相互使用’=='比较时结果为false。而’equals()'比较的是存放在对象中的整数,因此相互使用’equals()'比较时结果为true。

三、 Integer对象和整型变量之间的比较

  • 当使用 == 比较时。无论是通过何种方式实例化的,Integer对象都会自动拆箱为基本类型,然后再去与整型变量比较。因此,Integer对象和整型变量之间的比较就相当于整数值之间的比较,只要整数值相同结果即为true。
  • 当Integer对象使用equals()方法与整型变量比较时。整型变量会自动装箱成Integer对象,然后通过equals()方法比较对象所存的整数值是否相同。
  • 综上,无论使用哪种方式,Integer对象和整型变量之间的比较都是Integer对象所存的整数值和整型变量之间的比较

比如:

public class Main {
    public static void main(String[] args) {
        int i1 = 127;
        Integer i2 = 127;
        Integer i3 = Integer.valueOf(127);
        Integer i4 = new Integer(127); // 只适用于JDK8及之前的版本

        System.out.println(i1 == i2); // true
        System.out.println(i1 == i3); // true
        System.out.println(i1 == i4); // true
        System.out.println(i2.equals(i1)); // true


        int i5 = 130;
        Integer i6 = 130;
        Integer i7 = Integer.valueOf(130);
        Integer i8 = new Integer(130); // 只适用于JDK8及之前的版本

        System.out.println(i5 == i6); // true
        System.out.println(i5== i7); // true
        System.out.println(i5 == i8); // true
        System.out.println(i6.equals(i5)); // true
    }
}

注:

各包装类缓存值范围(默认) :

  • boolean:true、false
  • byte:-128~127
  • char:0~127
  • short:-128~127
  • int:-128~127
  • long:-128~127
  • float和double:无缓存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1300153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

根据对数器找规律、根据数据量猜题目解法

题目一 小虎去买苹果&#xff0c;商店只提供两种类型的塑料袋&#xff0c;每种类型都有任意数量。1&#xff09;能装下6个苹果的袋子2&#xff09;能装下8个苹果的袋子小虎可以自由使用两种袋子来装苹果&#xff0c;但是小虎有强迫症&#xff0c;他要求自己使用的袋子数量必须…

NAND闪存市场2023年Q3增长2.9%,Q4有望激增20%

TrendForce报告显示&#xff0c;NAND闪存市场在2023年第三季度出现了关键转折&#xff0c;主要由三星的战略性减产决定驱动。最初&#xff0c;市场对终端用户需求的不确定性以及对平淡旺季的担忧导致买家采取保守的方法&#xff0c;库存低、采购慢。然而&#xff0c;随着三星等…

Go压测工具

前言 在做Go的性能分析调研的时候也使用到了一些压测方面的工具&#xff0c;go本身也给我们提供了BenchMark性能测试用例&#xff0c;可以很好的去测试我们的单个程序性能&#xff0c;比如测试某个函数&#xff0c;另外还有第三方包go-wrk也可以帮助我们做http接口的性能压测&…

「Verilog学习笔记」多bit MUX同步器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 输入数据暂存在data_reg中&#xff0c;使能信号data_en用打两拍的方式跨时钟域传输到时钟域B&#xff0c;最后data_out根据使能信号更新数据。data_en信号在A时钟域用一个D…

【QED】高昂的猫 Ⅰ

目录 题目背景题目描述输入格式输出格式 测试样例样例说明数据范围 思路核心代码 题目背景 这是小橘。因为它总是看起来很高傲&#xff0c;所以人送外号“高昂的猫”。 题目描述 "锕狗"的房间里放着 n n n ( 1 ≤ n ≤ 1 0 9 ) (1 \leq n \leq 10^9) (1≤n≤109)个…

忘记PDF密码了,怎么办?

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和office一样&#xff0c;可以对文件进行加密&#xff0c;但是没有提供恢复密码的功…

C++设计模式——Adapter(适配器)模式

一、Adapter模式是个啥&#xff1f; 适配器模式在软件开发的江湖里&#xff0c;可以说用途是非常广的。下面几个经典的场景来说明适配器模式的使用。 场景一 场景二 假如你正在开发一款股票市场监测程序&#xff0c; 它会从不同来源下载 XML 格式的股票数据&#xff0c; 然后…

USB host是如何区分reset、disconnect以及suspend?

如题。 reset和disconnect 在OTG2.0中&#xff0c;当其配置程host模式&#xff0c;当host发送reset时D/D-线都为低电平&#xff0c;这是USB协议侧的复位&#xff08;与上电复位不同&#xff0c;协议上的复位是为了对连接的dev进行枚举&#xff0c;例如对端点0进行set address…

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测 目录 分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类…

完整方案开放下载!详解中国移动《通信网络中量子计算应用研究报告》

8月30日&#xff0c;中国移动在第四届科技周暨战略性新兴产业共创发展大会上重磅发布了《通信网络中量子计算应用研究报告》。 玻色量子作为中国移动在光量子计算领域的唯一一家合作企业兼战投企业&#xff0c;在量子计算应用于通信行业达成了深入合作&#xff0c;并在5G天线多…

【代码随想录】算法训练计划41

dp 1、343. 整数拆分 题目&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 输入: n 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 思路…

电工--基本放大电路

电压放大倍数、输入电阻和输出电阻是放大电路的三个主要性能指标 共发射极基本交流放大电路 晶体管&#xff1a;电流放大作用。能量较小的输入信号通过晶体管的控制作用&#xff0c;去控制电源所共给的能量&#xff0c;以在输出端获得一个能量较大的信号 集电极电源电压&#…

接口测试 —— Jmeter读取数据库数据作测试参数

1、添加Jdbc Request 2、添加ForEach控制器(右键线程组->逻辑控制器->ForEach控制器) ①输入变量的前缀&#xff1a;mobilephone&#xff1b; 从jdbc request设置的变量得知&#xff0c;我们要取的值为mobilephone_1、mobilephone_2、mobilephone_3......所以这里输入m…

基于单片机智能病床呼叫系统设计

**单片机设计介绍&#xff0c;基于单片机智能病床呼叫系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能病床呼叫系统是一种利用单片机技术设计的医疗设备&#xff0c;它能够帮助病人在住院期间快速、方便…

侯捷C++ (二--STL标准库)

CSTL标准库与泛型编程 STL六大部件 容器 Containers分配器 Allocators 一种用来修饰容器或仿函数或迭代器接口的东西算法 Algorithms迭代器 Iterators适配器 Adapters仿函数 Functors 容器 前闭后开 大致分为两种容器&#xff1a;序列容器&#xff0c;关联容器 所谓关联容器…

安装 DevEco Studio 后不能用本地 Node.js 打开

安装 DevEco Studio 后第一次打开时&#xff0c;不能用本地 Node.js 打开 答&#xff1a;因为本地 Node.js 文件夹名字中有空格 Node.js路径只能包含字母、数字、“。”、“_”、“-”、“:”和“V” 解决方法&#xff1a; 1.修改文件夹名称 2.重新下载 注意&#xff1a;找一…

Verilog基础:$random系统函数的使用

相关阅读 Verilog基础​编辑https://blog.csdn.net/weixin_45791458/category_12263729.html $random系统函数语法的BNF范式如下所示&#xff0c;有关BNF范式相关内容&#xff0c;可以浏览以往文章Verilog基础&#xff1a;巴科斯范式(BNF)。 $random系统函数在每次调用时返回一…

【Docker】进阶之路:(一)容器技术发展史

【Docker】进阶之路&#xff1a;&#xff08;一&#xff09;容器技术发展史 什么是容器为什么需要容器容器技术的发展历程Docker容器是如何工作的 什么是容器 容器作为一种先进的虚拟化技术&#xff0c;已然成为了云原生时代软件开发和运维的标准基础设施。在了解容器技术之前…

14-1、IO流

14-1、IO流 lO流打开和关闭lO流打开模式lO流对象的状态 非格式化IO二进制IO读取二进制数据获取读长度写入二进制数据 读写指针 和 随机访问设置读/写指针位置获取读/写指针位置 字符串流 lO流打开和关闭 通过构造函数打开I/O流 其中filename表示文件路径&#xff0c;mode表示打…

C++学习笔记:继承

继承 什么是继承?继承的写法基类和派生类的赋值转换继承中的作用域派生类的默认成员函数单继承,多继承,虚拟继承is-a 和 has-a 什么是继承? 继承是C语言面向对象的三大特性之一&#xff0c;是面向对象程序设计使代码可以复用的最重要的手段,基本都是在一个类的基础上为了增加…