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


相关推荐

  • 织梦dedecmsV5.7联动类型无法显示的处理方法

    织梦dedecmsV5.7联动类型无法显示的处理方法

    2021年10月7日
    34
  • Oracle 创建表空间

    Oracle 创建表空间–删除表空间droptablespacenacosincludingcontentsanddatafiles—-创建表空间并定义路径createtablespacenacos–表空间名datafile’D:/app/Administrator/oradata/nacos/nacos.dbf’size500m–大小初始值autoextendon–自动扩展next50mmaxsize20480m–每次扩展50m,最大为20480mex…

    2022年7月11日
    15
  • 随机函数生成随机正负小数(c语言自动生成随机数)

    原文转自:http://zhidao.baidu.com/question/560968122001783204.htmlC语言生成的随机数为无符号数,即都是正的。要想生成正负随机的,可以先通过模除限定返回,再减去对应的范围的中间值即可。比如,要获取-1000~+1000范围的随机数,总的数量为2001个,这样就可以通过代码rand()%2001使得到的结果限制在0-2000范围

    2022年4月16日
    85
  • java inputstream读取文件_java如何获取输入的数据

    java inputstream读取文件_java如何获取输入的数据InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b,int off,int len)。其中read()方法是一次读取一个字节,鬼都知道效率是非常低的。所以最好是使用后面两个方法。 /** *读取流 * *@paraminStream *@return字节数组 *@throwsExcepti

    2022年9月21日
    2
  • 使用PageOffice实现文档(word,excel,pdf)在线预览编辑[通俗易懂]

    使用PageOffice实现文档(word,excel,pdf)在线预览编辑[通俗易懂]最近发现一款不错的插件的PageOffice,地址是:http://www.zhuozhengsoft.com/Technical/他可以实现word,excel、pdf在线预览以及在线编辑。虽然商用的话需要收费,但是有免费的试用版,在实现自己毕业设计或是做样品的时候是一个不错的选择。他同时支持java\c#\php.一旦有了正真的项目花钱再买也可以。同时自己也可以熟悉如何使用。接着下面实现

    2022年5月3日
    132
  • 通过pycharm安装python_pycharm编译器安装教程

    通过pycharm安装python_pycharm编译器安装教程python环境的安装与编译器的安装python下载网址python官网:https://www.python.org/python的安装我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown将代码片显示选择的高亮样式进行展示;增加了图片拖拽功能,你可以将本地的图片直接拖拽到编辑区域直接展示;全新的Ka

    2022年8月25日
    7

发表回复

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

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