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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MutationObserver 方法

    MutationObserver 方法MutationObserver是什么MutationObserverAPI让我们能监听DOM树变化,该API设计用来替换掉在DOM3事件规范中引入的Mutationevents。Mutationevents是同步触发的,每次变动都会触发一次调用。MutationObserverAPI是异步触发的,DOM的变动并不会马上触发,而是要等到当前所有DOM操作都结束才触发。所以MutationObserver相比Mutationevents性能要更高。代码

    2025年6月10日
    5
  • 2020年保密在线考试答案_2022保密教育线上培训考试30题

    2020年保密在线考试答案_2022保密教育线上培训考试30题2022年度保密教育线上培训考试参考答案选择题根据工作需要,指定定密责任人可以是本机关、本单位内设机构负责人;根据刑法第398条规定,国家机关工作人员违反保守国家秘密法的规定,故意或者过失泄露国家秘密,情节严重的,处三年以下有期徒刑或者拘役;机密级国家秘密是重要的国家秘密,泄露会使国家安全和利益遭受严重的损害;涉密人员使用普通手机,正确的做法是:不在通信中涉及国家秘密、不在手机上存储、处理、传输涉及国家秘密的信息、不在涉密公务活动中开启和使用位置服务功能;泄露军事设施秘密,或者为境外的机构、组

    2022年9月22日
    4
  • Java socket接收出现中文乱码[通俗易懂]

    Java socket接收出现中文乱码[通俗易懂]今天写Tcp,发现中文乱码的问题,百度了一下,发现这篇文章,开头两句话就解决了我的问题,读完受益匪浅啊,呵呵,收藏先。尊重版权:原文地址:http://hi.baidu.com/linjk03/blog/item/10023afad8303cd9b48f311a.htmlin=newBufferedReader(newInputStreamReader(socket.get

    2022年7月8日
    22
  • 人力资源管理系统详细设计说明书[通俗易懂]

    人力资源管理系统详细设计说明书[通俗易懂]人力资源管理系统详细设计说明书组名 : K2组员 : 罗猛、丘佩茵2021年1月12日目录1引言 31.1编写目的 31.2背景说明 31.3定义 31.4参考资料 32系统结构 42.1总系统结构图 42.2管理员登录注册模块结构图 42.3部门管理模块结构图 52.4员工管理模块结构图 52.5培训管理模块结构图 62.6招聘管理模块结构图 62.7奖惩管理模块结构图 72.8薪资管理模块结构图 72.9系统管理模块结构图 81.10查看消息模块结构图 83系

    2022年5月15日
    42
  • Java刷新bean重新加载bean 上下文 刷新bean

    Java刷新bean重新加载bean 上下文 刷新bean@Autowiredprivate ApplicationContext applicationContext;// 可以为接口或者业务方法被调用public void reloadInstance(){ //获取上下文 DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory)applicationContext.getAutowireCapableBeanFactory();

    2022年8月19日
    18
  • 最新VMware 安装Windows10——图文操作,超详细~~~「建议收藏」

    最新VMware 安装Windows10——图文操作,超详细~~~「建议收藏」VMware安装win10系统之前一直卡在找不到映像文件和开机需要登陆密码之个步骤,后续又卡在了设置,干脆自己梳理了下具体步骤,防止再次踩坑~

    2022年6月16日
    24

发表回复

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

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