Java Integer 与 int 深刻理解

Java Integer 与 int 深刻理解Java Integer 与 int 深刻理解

大家好,又见面了,我是你们的朋友全栈君。

今天在做Object 自动转为Integer 类型之后的判断,遇到一个不理解的点,当数值超过127之后,两个数值相同的Object 对象用 == 判断的结果是false。

Object a = 128;
        Object b = 128;
        
        System.out.println(a.getClass().getName());
        System.out.println(b.getClass().getName());
        System.out.println(a==b);
        
        
        Object a1 = 127;
        Object b1 = 127;
        
        System.out.println(a1.getClass().getName());
        System.out.println(b1.getClass().getName());
        System.out.println(a1==b1);
        
        int a2 = 128;
        int b2 = 128;
        
        System.out.println(a2==b2);

结果:

false
true
true

之前隐约记得数值在 -128 与 127之间时,Integer 对象会特别处理,但是具体怎么处理的忘记了,网上查了些资料终于明白背后的设计原理了。

① Java 中的数据类型分为基本数据类型和引用数据类型

int是基本数据类型,Integer是引用数据类型;

Ingeter是int的包装类,int的初值为0,Ingeter的初值为null;

② 自动装箱和拆箱

从Java5.0版本以后加入了autoboxing功能,自动拆箱和装箱是依靠JDK的编译器在编译期的预处理工作。

A. 自动装箱:将基本数据类型封装为对象类型,成为一个对象以后就可以调用对象所声明的所有的方法。

   Integer inA = 127;
    //以上的声明就是用到了自动的装箱:解析为
    Integer inA = new Integer(127);

B. 自动拆箱:将对象重新转化为基本数据类型。

//装箱
Integer inB = 128;
//拆箱
int inC = inB;

C. 自动拆箱很典型的用法就是在进行运算的时候:因为对象不能直接进行运算,需要转化为基本数据类型后才能进行加减乘除。

Integer inD = 128;
System.out.println(inD--);

③ 回到我遇到的问题:为什么数值在 -128 与 127之间时,两个Integer 对象是否相等可以用 ==来判断,但是这个范围之外的就不能了呢?

这是因为Java对于Integer 与int 的自动装箱与拆箱的设计,是一种模式:享元模式(flyweight),为了加大对简单数字的重利用,Java定义:在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象。而如果超过了这之间的值,被装箱后的Integer 对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象;

以上的现象是由于使用了自动装箱所引起的,如果你没有使用自动装箱,而是跟一般类一样,用new来进行实例化,就会每次new就都一个新的对象;这个的自动装箱拆箱不仅在基本数据类型中有应用,在String类中也有应用。

④ 包装类

所有基本类型都有一个与之对应的类,即包装类;是不可变类;包装类是final的,不能定义他们的子类。

基本数据类型 包装类
byte java.lang.Byte
boolean java.lang.Boolean
short java.lang.Character
char java.lang.Boolean
int java.lang.Integer
long java.lang.Long
float java.lang.Boolean
double java.lang.Double

原文地址

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105845.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 快速熟悉 PyQt5 与 Eric6 的极速 GUI 开发

    完美安装Anaconda3+PyQt5+Eric6一文对PyQt5与Eric6的安装做了详细的记录。这次将结合使用PyQt5和Eric6以实例的方式向大家展示PyQt5与Eric6的极速GUI开发,同时也可以让大家对PyQt5与Eric6先混个脸熟。用Eric6与PyQt5结合,非常方便的实现界面与逻辑分离,满足python的极速GUI编程,你只需要关注程序的逻辑实现,而不需要在

    2022年4月8日
    65
  • matlab控制系统仿真教程答案唐(matlab求传递函数的极点)

    简单的控制算法,没有用Simulink工具,直接写代码。主要点就是分清楚仿真环境和需要验证的算法。也就是说首先要数学建模,建立一个‘环境’,用来模拟实际环境。然后写自己的控制算法。最后把算法用到‘环境’上,就是在仿真了。全部代码如下:%Thesimulationofthestablependulumcart%usingPID,poleplacementandLQRclc;clea…

    2022年4月12日
    63
  • 关于adventure的短语_adventureinwellies

    关于adventure的短语_adventureinwelliesdown了个AdventureWorks2008的数据库备份,没办法谁让一些书上用这个库作为示例呢。主要差别是Person表格,搞不清楚为什么MS在搞什么。用MS提供的安装文件,就是装不上。还有很多人提到那个FileStream的设置,可是根本没用。

    2022年9月12日
    0
  • datagrip 2021.10.1 激活码_在线激活[通俗易懂]

    (datagrip 2021.10.1 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1STL…

    2022年3月27日
    41
  • 保研面试/考研复试:英语口语面试必备话题及常用句型句式整理(二)「建议收藏」

    目录TravelAFFIRMATIVENEGATIVEArtFORAGAINSTShoppingAFFIRMATIVENEGATIVEPetAFFIRMATIVENEGATIVETravelAFFIRMATIVEWecanexplorenewplacesandmeetnewfolks.Iprefertotravellight.PeoplefromallwalksoflifeenjoytravellingTravelingwithfriendsisa

    2022年4月16日
    41
  • 网页中图片去色问题是什么_网页问题

    网页中图片去色问题是什么_网页问题网页中图片去色问题网页中经常需要一种js效果,就是鼠标经过某张图片,图片去色。为了不加载两张图片(一张彩色和一张灰色),在网上找到了一些方法。方案一:使用grayscale.js可以使用grayscale.js来实现图片的去色,但是有个缺点就是它可以实现鼠标经过图片去色,但是实现不了鼠标移开之后,图片恢复颜色。使用demo:window.onload=function(

    2022年10月6日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号