Java中Integer和int的区别

文章目录

  • 一、介绍
  • 二、不同点
  • 三、相同点
  • 四、使用`equals()`和`==`的区别
  • 五、解惑

一、介绍

各位小伙伴们无论在工作还是学习中,与Integer都有着过硬的交情,我说的没错吧,大家都知道他可以表示一个整数,而且也知道可以表示整数的还有int,只是使用Integer的次数要比int多得多,今天我们就来好好探究一下Integer与int的区别以及更深处的知识。

二、不同点

  • Integer是包装类型(即引用类型),int是基本类型

    也就是说,Integer是一个类,里面有很多方法可以使用,例如

    boolean equals(Object obj){...}
    int compareTo(Integer anotherInteger){...}
    

    而int不是一个类,能做的只有+、-、*、/、=五种运算,例如

    int a = 3;   int b = 4;   int c = a + b;
    
  • Integer的默认值是null,int的默认值是0

    在这里插入图片描述

  • Integer变量使用之前必须先实例化,int变量可以直接使用。

    Integer如果没有实例化就直接使用会报空指针异常(因默认值为null);int如果没有初始化则使用默认值0。

三、相同点

  • 取值范围相同

    最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方)

    最大值:Integer.MAX_VALUE= 2147483647 (2的31次方-1)

    在这里插入图片描述

    原因:众所周知,整型变量在内存中的字节数是4个字节,一个字节是8位,因此一个整型变量占据32位,且首位为0表示非负数,1表示负数

四、使用equals()==的区别

对于每个java开发人员来说,Integer的用法再熟悉不过了,但仍然会有些工作一两年的小伙伴依然搞不清楚不同情况下equals()方法和 == 等号究竟有什么结果,以至于在基础的面试过程中翻跟头体验屡试不爽。这次我们一次性把所有可能以及结果出清楚。

  • equals()

    此方法由Object类定义,在Integer类中又对其进行了重写,我们来看一下重写后的方法。

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

    这个方法先判断参数对象是否继承了Integer引用类型(如果参数是int基本类型,会先将其自动装箱成引用类型),如果没有继承Integer引用类型,则返false,这个很好理解,如果数字和字符相比,那叫什么事嘛。如果继承了Integer引用类型,就先把它强转成Integer类型,再通过intValue()方法将其拆箱为int基本类型,再和value进行地址比较(==右边的value表示的是此Integer对象在常量池中的值,该值其实也是及本来想常量)。

    ​ 说了一大堆,简单一句话就是equals()方法进行的是常量池中的地址是否相等。

    ​ 另外一点:常量池中值相等的数据不会同时出现,常量池中只保存一份相同的值。

  • ==

    比较两个对象在内存中的地址是否相等。

下面是我们使用equals()方法和==方法来判断Integerint的区别。在此之前,我们要先知道装箱拆箱常量池对象堆内存对象两个概念:

  • 装箱

    基本数据类型变成引用类型的过程。发生在将基本数据类型赋值给引用类型的时候, 如Integer i = 5;

  • 拆箱

    引用类型变成基本数据类型的过程。发生在将引用类型和基本数据类型做运算的时候,如下所示

    Integer i = 5; 
    int j = 5; 
    System.out.println(i==j);
    
  • 常量池对象

    保存的是创建对象时的字面量,相等的字面量只保存一次

  • 堆内存对象

    保存的是new一个对象时这个对象在堆内存中的地址

声明变量使用equals()方法比较使用==比较
1Integer i = new Integer(1);
Integer j = new Integer(1);
truefalse
2Integer i = new Integer(1);
Integer j = 1;
truefalse
3Integer i = new Integer(1);
int j = 1;
truetrue
4Integer i = 1;
Integer j = 1;
truetrue
5Integer i = 1;
int j = 1;
truetrue
6int i = 1;
int j = 1;
——true
7Integer i = new Integer(128);
Integer j = new Integer(128);
truefalse
8Integer i = new Integer(128);
Integer j = 128;
truefalse
9Integer i = new Integer(128);
int j = 128;
truetrue
10Integer i = 128;
Integer j = 128;
truefalse
11Integer i = 128;
int j = 128;
truetrue
12int i = 128;
int j = 128;
——true
  • 情况1

    在Integer i = new Integer(1)的过程中,java为我们做了两件事,先在常量池中创建一个int=1的常量,再在堆内存中创建一个对这个常量的地址引用,因此在用equals()方法时比较的是常量池中int=1这个常量,自己和自己比较的结果当然为true;

    而在==运算时,直接比较了堆内存中的地址,于是比较的结果为false

  • 情况2

    在Integer j = 1的过程中,实际上是java为我们在常量池中生成了一个常量对象1,然后j对象指向这个常量对象的地址。

    equals()运算结果为true是因为比较的是常量池中对象的比较,实际上常量池中只有一个值为1的对象,即自己比较自己。

    ==运算结果为false是因为比较的是堆内存中对象j的地址和常量池中常量对象1的地址,是两个不同的地址比较

  • 情况3

    equals()运算结果为true可以参考上面的源码以及下方解释

    ==运算结果为true是因为引用类型Integer和基本数据类型int比较时,引用类型会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较,也是堆内存中常量自己与自己的地址比较

  • 情况4

    变量i与变量j指向的其实都是常量池中的常量对象1,因此equals()运算和==运算的结果都是true

  • 情况5

    与情况4相同, 如果有疑惑可在文章后面查找答案

  • 情况6

    基本数据类型只能进行加、减、乘、除、等于五种运算,没有equals()方法,==运算为true还是因为堆内存中常量自己与自己进行地址比较。

  • 情况7

    new Integer(128)会先在常量池中创建一个常量对象128,再在堆内存中保存这个常量对象的地址,Integer i = new Integer(128)中变量i指向堆内存中保存这个常量对象地址的地址,它是指向堆内存的。可以理解为两个不同的堆内存地址指向相同的常量池地址。

    equals()运算结果为true是因为比较的是常量池中的地址,而该地址只有一个,自己比较自己,结果为true

    ==运算比较的是这两个堆内存的地址,因此结果为false

  • 情况8

    equals()运算结果为true说了很多遍了,都是同一个原因

    ==运算为false是因为比较的是堆内存中两个对象的地址,原因和情况5相同,可在文章后面查找答案

  • 情况9

    与情况3相同

  • 情况10

    与情况8相同,可在文章后面查找答案

  • 情况11

    与情况3相同

  • 情况12

    与情况6相同

五、解惑

JVM中一个字节一下的整型数据(即[128,127])会在JVM启动时加载进内存,除非用new Integer()显示的创建对象,否则都是同一对象。当使用Integer i = 1时,会将1这个数字进行缓存,下次再运行Integer j = 1时,就会直接从缓存中取,就不会new了, 这样取到的1 地址也是相同的, ==判断返回true

对于-128 ~ 127范围之外的数 实际上就是new得到的, 地址不同==判断为false

java在编译Integer i = 100 ;时,java内部会将其翻译成为Integer i = Integer.valueOf(100)

所以关键就是看valueOf()函数了。JDK源码的valueOf()是这样的

在这里插入图片描述

到此,Integer与int运算时的迷之操作总算解释清楚了,如果有需要指正或者补充的,请小伙伴们扫下方二维码关注公众号并在后台留言,我会及时给予回复,让我们一起把java学到荒,头发掉到光。



纸上得来终觉浅,绝知此事要躬行。

————————我是万万岁,我们下期再见————————

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网工内推 | 上市公司中级网工,思科、华为认证优先,有带薪年假

01 新晨科技 招聘岗位:中级网络工程师 职责描述: 1. 负责公司网络系统的规划、设计、实施、维护和优化; 2. 负责网络设备的选型、采购、安装、配置和调试; 3. 负责网络安全策略的制定和实施,保障公司网络安全&#xf…

C# 将 Word 转化分享为电子期刊

目录 需求 方案分析 相关库引入 关键代码 Word 转 Pdf Pdf 转批量 Jpeg Jpeg 转为电子书 实现效果演示 小结 需求 曾经的一个项目,要求实现制作电子期刊定期发送给企业进行阅读,基本的需求如下: 1、由编辑人员使用 Microsoft Word…

Lucene

目录 1. Lucene概述 1.1 什么是Lucene 1.2 Lucene的原理 2. Lucene的使用 2.1 准备 2.2 生成索引 2.3 全文检索 2.4 多Field检索 2.5 中文分词器 2.6 停用词 2.7 是否索引,是否储存 1. Lucene概述 1.1 什么是Lucene Lucene是一个全文搜索框架,而不是应用…

标准库中的string类(上)——“C++”

各位CSDN的uu们好呀,好久没有更新小雅兰的C专栏的知识啦,接下来一段时间,小雅兰就又会开始更新C这方面的知识点啦,以及期末复习的一些知识点,下面,让我们进入西嘎嘎string的世界吧!!…

智能优化算法应用:基于混沌博弈算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于混沌博弈算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于混沌博弈算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.混沌博弈算法4.实验参数设定5.算法结果6.…

HamronyOS 自动化测试框架使用指南

概述 为支撑 HarmonyOS 操作系统的自动化测试活动开展,我们提供了支持 JS/TS 语言的单元及 UI 测试框架,支持开发者针对应用接口进行单元测试,并且可基于 UI 操作进行 UI 自动化脚本的编写。 本指南重点介绍自动化测试框架的主要功能&#x…

跟着我学Python进阶篇:01.试用Python完成一些简单问题

往期文章 跟着我学Python基础篇:01.初露端倪 跟着我学Python基础篇:02.数字与字符串编程 跟着我学Python基础篇:03.选择结构 跟着我学Python基础篇:04.循环 跟着我学Python基础篇:05.函数 跟着我学Python基础篇&#…

c语言力扣题目:消失的数字(有关时间复杂度O(N²)O(N))以及对异或操作符的更深入的理解(如何用人脑的十进制去考量二进制)

目录 Way One :暴力求解,时间复杂度为 O(N) 代码1 Way Two : 时间复杂度限制到 O(N) 代码及其详解 如题 Way One :暴力求解,时间复杂度为 O(N) 大体思路:比如这里我们需要处理的整型数组是"3,0,1",我们可以用冒泡排序或者 qsort函数将他从大到小进行排序成"…

纳米流体传热CFD模拟仿真

纳米流体传热CFD模拟仿真 一、引言 纳米流体传热是当前研究热点之一,由于其独特的传热特性和应用前景,受到了广泛关注。计算流体动力学(CFD)模拟作为一种有效的研究手段,在纳米流体传热领域发挥着重要作用。本文将介绍纳米流体传热CFD模拟的基本原理、方法、应用及未来发…

100GPTS计划-AI编码CodeWizard

地址 https://chat.openai.com/g/g-vX7yfHNcC-code-wizard https://poe.com/CodeWizardGPT 测试 sql 优化 select a.id,a.name,count(b.id),count(c.id) from product a LEFT JOIN secretkey b on a.id b.productId group by a.id LEFT JOIN secretkey c on a.id c.pr…

SLAM算法与工程实践——RTKLIB编译

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址: SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

node.js mongoose middleware

目录 官方文档 简介 定义模型 注册中间件 创建doc实例,并进行增删改查 方法名和注册的中间件名相匹配 执行结果 分析 错误处理中间件 手动抛出错误 注意点 官方文档 Mongoose v8.0.3: Middleware 简介 在mongoose中,中间件是一种允许在执…

Linux静态ip

Linux静态ip Ⅰ、修改静态ip Ⅰ、修改静态ip 修改静态ip必须是root用户 su root //切换root用户 ip a //查看修改前的动态ipvi /etc/sysconfig/network-scripts/ifcfg-ens33 //打开网卡配置文件,修改一处,新增四处 BOOTPROTO&quo…

NumPy教程(一)—— ndarray:多维数组对象

前言 该numpy学习笔记参考了菜鸟教程网、b站up主 孙兴华zz 的《孙兴华中文讲python数据分析三部曲》以及《北理-python数据分析与展示》,课本推荐使用《利用python进行数据分析》 Numpy简介: NumPy(Numerical Python) 是 Python 语言的一个扩展程序库&a…

RHCE8 资料整理(十一)

RHCE8 资料整理 第 32 章 控制语句32.1 判断语句 when32.1.1 when 判断中>、<、!和的使用32.1.2 when 判断中 in的用法32.1.3 when 判断中 is的用法 32.2 判断语句 block-rescue32.3 循环语句 第 32 章 控制语句 一个play中可以包含多个task&#xff0c;如果不想所有的t…

电子学会C/C++编程等级考试2022年06月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:小白鼠再排队2 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用 “red”,“blue”等字符串来表示。不同的小白…

董宇辉“回归”成为东方甄选高级合伙人,尘埃落地后是谁赢了?

董宇辉“回归”成为东方甄选高级合伙人&#xff0c;尘埃落地后是谁赢了&#xff1f; 董宇辉的“小作文事件”“CEO摔手机事件”迎来大结局了&#xff01; 就在12月18日&#xff0c;董宇辉被任命为新东方教育科技集团董事长文化助理&#xff0c;兼任新东方文旅集团副总裁。有朋…

Excel如何将行的值转换为列值?

问题:Excel如何将行的值转换为列值?(如图左表变成右表) 1.用 SUMIFS(求和区域, 条件区域1, 条件1, [条件区域2, 条件2], ...)函数 比如:=SUMIFS($C$2:$C$8,$A$2:$A$8,H3,$B$2:$B$8,"快车") 2.直接用简单的透视表 (1)随机点击目标目标表格任何位置,点击插入…

Gin之GORM事务(转账操作)

禁用默认事务的操作 为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。 // 全局禁用 db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{SkipDef…

Just Laws -- 中华人民共和国法律文库,简单便捷的打开方式

链接&#xff1a;JustLaws | Home 一个简洁便捷的中华人民共和国法律文库&#xff0c;而且收录比较完善&#xff0c;都是平常网民可能用到比较多的法律知识&#xff0c;目前包括宪法及宪法相关法、民商法、行政法、经济法、社会法、刑法和程序法等等 页面以文档的风格展示每一…