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

原文地址

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • navicat premium 15 激活码[免费获取]

    (navicat premium 15 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~M…

  • rcnn fast rcnn faster rcnn_档案整理年终总结

    rcnn fast rcnn faster rcnn_档案整理年终总结行人检测概述:    行人检测有两种方向,传统算法和基于深度学习算法。传统算法的典型代表有Haar特征+Adaboost算法,Hog特征+Svm算法,DPM算法。而基于深度学习的行人检测典型代表有RCNN系列,YOLO系列和SSD系列。其中RCNN系列算法是现在使用的最广泛的基于深度学习的行人检测算法。    在说行人检测之前不得不说一下目标检测。行人检测是目标检测下的一个…

  • JSTAT分析_jstat命令详解

    JSTAT分析_jstat命令详解S0S1EOMCCSYGCYGCTFGCFGCTGCT21.220.0040.5976.4381.2580.972212513.28633.413516.69921.220.0040.5976.4381.2580.9

  • 【idea】推荐一个idea翻译插件:Translation「建议收藏」

    【idea】推荐一个idea翻译插件:Translation「建议收藏」打开settings-plugins,打开Browserepositories(如图):搜索”Translation”,往下找,找到图中插件install即可(我是已经安装了的)我的插件版本现在是支持谷歌、有道、百度三种翻译,其中有道和百度的需要填写应用id及secret等才能用,这个需要到有道智云(百度的没有试过)申请。使用很简单:选中单词或者段落ctrl+shift+…

  • pageinfo 分页实现_分页显示

    pageinfo 分页实现_分页显示项目中有时候遇到list多种来源,不能使用PageInfo在查询数据库时分页,需要查询全部之后,手动分页。 //手动分页的分割起始下标IntegerfromIndex=0;//手动分页的分割结尾下标IntegertoIndex=0;Integertotal=arrayList.size();…

    2022年10月25日
  • eigen库的优缺点_简单介绍一种你在家中使用过的工具

    eigen库的优缺点_简单介绍一种你在家中使用过的工具#include”mainwindow.h”#include<QApplication>#include”eigen3/Eigen/Core”#include”eigen3/Eigen/Dense”#include<cmath>#include<iostream>intmain(intargc,char*argv[]){QApplicationa(argc,argv);floatvalue=4.0;

    2022年10月19日

发表回复

您的电子邮箱地址不会被公开。

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