Integer和int相比较

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:无缓存

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

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

相关文章

个人博客搭建保姆级教程-发布篇

发布方式 可以使用gitee或者github托管博客内容&#xff0c;然后直接在服务端nginx目录进行拉取。或者将内容压缩&#xff0c;拷贝到对应目录后再进行解压。 发布位置 前面我们已经部署了nginx服务器。这里我们需要将对应的html文件拉取或拷贝到对应的文件夹&#xff0c;即n…

使用linux CentOS本地部署SQL Server数据库

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装sql server二. 局域网测试连接三. 安装cpolar内网穿透四. 将sqlserver映射…

IDEA远程调试与JDWP调试端口RCE漏洞

文章目录 前言Docker远程调试Java调试原理远程调试实践 JDWP端口RCE调试端口探测调试端口利用 总结 前言 在对一些 Java CVE 漏洞的调试分析过程中&#xff0c;少不了需要搭建漏洞环境的场景&#xff0c;但是本地 IDEA 搭建的话既麻烦&#xff08;通过 pom.xml 导入各种漏洞组…

[ 蓝桥杯Web真题 ]-布局切换

目录 介绍 准备 目标 规定 思路 解法参考 介绍 经常用手机购物的同学或许见过这种功能&#xff0c;在浏览商品列表的时候&#xff0c;我们通过点击一个小小的按钮图标&#xff0c;就能快速将数据列表在大图&#xff08;通常是两列&#xff09;和列表两种布局间来回切换。…

任何错误都不是单一的原因造成的,你的电脑没有正确启动的错误也不例外

当你的电脑无法启动到Windows时&#xff0c;你可能会看到“你的电脑没有正确启动”的错误。此错误表示启动过程中断&#xff0c;可能需要你注意&#xff0c;也可能不需要你注意。有时你可以通过重新启动计算机来解决这个问题&#xff0c;但如果不起作用&#xff0c;还有其他几种…

STM32——继电器

继电器工作原理 单片机供电 VCC GND 接单片机&#xff0c; VCC 需要接 3.3V &#xff0c; 5V 不行&#xff01; 最大负载电路交流 250V/10A &#xff0c;直流 30V/10A 引脚 IN 接收到 低电平 时&#xff0c;开关闭合。

Spring Boot 3.0 : 集成flyway数据库版本控制工具

目录 Spring Boot 3.0 : 集成flyway数据库版本控制工具flyway是什么为什么使用flyway主要特性支持的数据库&#xff1a; flyway如何使用spring boot 集成实现引入依赖配置sql版本控制约定3种版本类型 运行SpringFlyway 8.2.1及以后版本不再支持MySQL&#xff1f; 个人主页: 【⭐…

【算法Hot100系列】两数之和

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

《深入理解计算机系统》学习笔记 - 第四课 - 浮点数

Floating Point 浮点数 文章目录 Floating Point 浮点数分数二进制示例能代表的数浮点数的表示方式浮点数编码规格化值规格化值编码示例 非规格化的值特殊值 示例IEEE 编码的一些特殊属性四舍五入&#xff0c;相加&#xff0c;相乘四舍五入四舍五入的模式二进制数的四舍五入 浮…

Terminator的layout设置(一个新的一键启动思路)

首先你得有terminator&#xff1a; sudo apt install terminator然后就能使用了&#xff0c;我一般喜欢修改它原本的水平和垂直分割&#xff1a;用ctrlshifta和ctrlshifts 把屏幕先分成多块&#xff1a; 比如是这样的&#xff0c;接下来 右键->点击Preference 弹框中上方标…

C++:this指针

目录 前言 成员函数返回this指向的对象本身时&#xff0c;为什是返回引用类型&#xff1f; 成员函数返回this对象本身时&#xff0c;内部通常会通过拷贝构造函数来创建一个临时对象&#xff1f; 总结 前言 c通过提供特殊的对象指针&#xff0c;this指针 指向被调用的成员函…

Ubuntu下安装SDL

源码下载地址&#xff08;SDL version 2.0.14&#xff09;&#xff1a;https://www.libsdl.org/release/SDL2-2.0.14.tar.gz 将源码包拷贝到系统里 使用命令解压 tar -zxvf SDL2-2.0.14.tar.gz 解压得到文件夹 SDL2-2.0.14 进入文件夹 执行命令 ./configure 执行命令 make…

Linux环境下socket本地通信

最近项目有用到了socket本地通信&#xff0c;故复习一下。之前都是基于本地虚拟机的ip地址通信的&#xff0c;现在项目&#xff0c;Linux单板上面有2个进程需要通信&#xff0c;故用到了本地socket通信&#xff0c;主要其实就是用了sockfd,文件描述符&#xff0c;也叫句柄。 服…

Android系统中使用Cunit测试C/C++接口

Android系统中使用Cunit测试C/C接口 Cunit是C/C语言的单元测试框架&#xff0c;但常用于Windows和Linux开发中。 Android系统中经常有jni、so库、hal service等都是C/C实现&#xff0c;本文讲解如何将Cunit嵌入Android中&#xff0c;用于测试一些C/C api。 Cunit简介 Cunit是很…

什么是CDN?用了CDN一定会更快吗?

文章目录 前言CDN是什么?CDN的工作原理为什么要加个CNAME那么麻烦&#xff1f;怎么知道哪个服务器IP里调用方最近&#xff1f; 回源是什么回源是什么&#xff1f;那还有哪些情况会发生回源呢&#xff1f; 怎么判断是否发生回源用了CDN一定比不用的更快吗&#xff1f;什么情况下…

C语言笔试例题_指针专练30题(附答案解析)

C语言笔试例题_指针专练30题(附答案解析) 指针一直是C语言的灵魂所在&#xff0c;是掌握C语言的必经之路&#xff0c;收集30道C语言指针题目分享给大家&#xff0c;测试环境位64位ubuntu18.04环境&#xff0c;如有错误&#xff0c;恳请指出&#xff0c;文明讨论&#xff01;&am…

【git】关于git二三事

文章目录 前言一、创建版本库1.通过命令 git init 把这个目录变成git可以管理的仓库2.将修改的内容添加到版本库2.1 git add .2.2 git commit -m "Xxxx"2.3 git status 2.4 git diff readme.txt3.版本回退3.1 git log3.2 git reset --hard HEAD^ 二、理解工作区与暂存…

面试 Redis 八股文十问十答第一期

面试 Redis 八股文十问十答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.Redis数据类型有哪些? String&#xff08;字符串&#xff09;&#xff1a;是…

win11 CUDA(12.3) + cuDNN(12.x) 卸载

win11 CUDA&#xff08;12.3&#xff09; cuDNN&#xff08;12.x&#xff09;卸载 信息介绍卸载 信息介绍 本文是对应 win11RTX4070Ti 安装 CUDA cuDNN&#xff08;图文教程&#xff09; 的卸载 卸载 控制面板 --> 程序 --> 卸载程序 卸载掉图中红框内的&#xff0c…

四. 基于环视Camera的BEV感知算法-环视背景介绍

目录 前言0. 简述1. 环视背景介绍2. 环视思路3. 主流基于环视Camera的算法详解总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基于环视Camer…