int和Integer之间的详细比较

26 篇文章 8 订阅
订阅专栏
19 篇文章 1 订阅
订阅专栏

1 int与Integer的基本使用对比

(1)Integer是int的包装类;int是基本数据类型;
(2)Integer变量必须实例化后才能使用;int变量不需要;
(3)Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
(4)Integer的默认值是null;int的默认值是0。

2 int与Integer的深入对比

(1)由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。

Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false

(2)Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)

Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); //true

(3)非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)

Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false

(4)对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

Integer i = 100;
Integer j = 100;
System.out.print(i == j); //true

Integer i = 128;
Integer j = 128;
System.out.print(i == j); //false

对于第4条的原因: java在编译Integer i = 100 ;时,会翻译成为Integer i = Integer.valueOf(100)。而java API中对Integer类型的valueOf的定义如下,对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。

public static Integer valueOf(int i){
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high){
        return IntegerCache.cache[i + (-IntegerCache.low)];
    }
    return new Integer(i);
}

3 Java两种数据类型

3.1 Java两种数据类型分类
(1)基本数据类型,分为boolean、byte、int、char、long、short、double、float;
(2)引用数据类型 ,分为数组、类、接口。

3.2 Java为每个原始类型提供了封装类
  为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每 一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。

基本数据类型: boolean,char,byte,short,int,long,float,double
封装类类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

4 基本解析

4.1 自动装箱:将基本数据类型重新转化为对象

public class Test {  
    public static void main(String[] args) {  
        //声明一个Integer对象
        Integer num = 9;
        //以上的声明就是用到了自动的装箱:解析为:Integer num = new Integer(9);
    }  
}  

9是属于基本数据类型的,原则上它是不能直接赋值给一个对象Integer的,但jdk1.5后你就可以进行这样的声明。自动将基本数据类型转化为对应的封装类型,成为一个对象以后就可以调用对象所声明的所有的方法。

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

 public class Test {  
        public static void main(String[] args) {  
            //声明一个Integer对象
            Integer num = 9;
            //进行计算时隐含的有自动拆箱
            System.out.print(num--);
        }  
    }  

因为对象时不能直接进行运算的,而是要转化为基本数据类型后才能进行加减乘除。对比:

/装箱

Integer num = 10;
//拆箱
int num1 = num;

5 深入解析

5.1 情况描述

   public class Test {  
        public static void main(String[] args) {  
            //在-128~127 之外的数
            Integer num1 = 128;   Integer num2 = 128;           
            System.out.println(num1==num2);   //false

            // 在-128~127 之内的数 
            Integer num3 = 9;   Integer num4 = 9;   
            System.out.println(num3==num4);   //true
        }  
    }  

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

5.2 Integer源码解析
  给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,源码如下:

public static Integer valueOf(String s, int radix) throws NumberFormatException {
        return Integer.valueOf(parseInt(s,radix));
    }

public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

IntegerCache是Integer的内部类,源码如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下面我们来看一个具体的例子
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Integer a = 1 ;
Integer b = 2 ;
Integer c = 3 ;
Integer d = 3 ;
 
Integer e = 321 ;
Integer f = 321 ;
 
Long g = 3L;
Long h = 2L;
 
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a + b));
System.out.println(c.equals((a+b)));
System.out.println(g == (a+b));
System.out.println(g.equals(a+b));
System.out.println(g.equals(a+h));

在这里插入图片描述
分析:第一个和第二个结果没什么疑问,Integer类在-128到127的缓存问题;

第三个由于 a+b包含了算术运算,因此会触发自动拆箱过程(会调用intValue方法),==比较符又将左边的自动拆箱,因此它们比较的是数值是否相等。

第四个对于c.equals(a+b)会先触发自动拆箱过程,再触发自动装箱过程,也就是说a+b,会先各自调用intValue方法,得到了加法运算后的数值之后,便调用Integer.valueOf方法,再进行equals比较。

第五个对于 g == (a+b),首先计算 a+b,也是先调用各自的intValue方法,得到数值之后,由于前面的g是Long类型的,也会自动拆箱为long,==运算符能将隐含的将小范围的数据类型转换为大范围的数据类型,也就是int会被转换成long类型,两个long类型的数值进行比较。

第六个对于 g.equals(a+b),同理a+b会先自动拆箱,然后将结果自动装箱,需要说明的是 equals 运算符不会进行类型转换。所以是Long.equals(Integer),结果当然是false

第七个对于g.equals(a+h),运算符+会进行类型转换,a+h各自拆箱之后是int+long,结果是long,然后long进行自动装箱为Long,两个Long进行equals判断。

参考:
浅谈 Integer 类

integer和int

intinteger比较
chengxuzx的博客
11-01 252
区别: int是基本数据类型,Integer是引用数据类型; int默认值是0,Integer默认值是null; Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ; int类型直接存储数值,Integer需要实例化对象,指向对象的地址。 package HelloWorld; public class Intandinteger { @SuppressWarnings("removal") public static void main...
c#基础知识
最新发布
pengbin88888888的博客
09-17 1545
由于readonly所定义的常量相当于类的成员,因此使用const来定义常量所受到的类型限制,在使用readonly去定义的时候全部消失,即可以用readonly去定义任何类型的常量。在程序中使用DLL类库某个类的静态常量时,如果在类库中修改静态常量的值,其它接口没有发生变化,一般来说,程序调用端是不需要重新编译,直接执行就可以调用新的类库。2.用const定义的常量,对于所有类对象而言都是一样的,因此需要像访问静态成员那样去访问const定义的常量,而用对象的成员方式去访问会出变异错误。
JavaInteger两种转int方法比较
08-31
本文主要介绍了Java Integer两种转int方法比较。具有很好的参考价值,下面跟着小编一起来看下吧
intInteger比较
weixin_44823875的博客
08-09 2678
Java中的intInteger比较时是有区别的。(1)intJava中的一种基本数据类型,属于值类型,可以直接比较。(2)而Integer则是Java中的一种包装类型,属于引用类型,不能直接比较。当我们对两个Integer对象进行比较时,实际上是在比较它们所引用的对象在内存中的地址,而不是其所代表的数值。因此,如果直接使用==进行比较,通常不能得到正确的结果。
Integerint的种种比较你知道多少?
daxiang3255的博客
05-05 923
  如果面试官问Integerint的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false?估计就有一部分人答不出来了,如果再问一下其他的,估计更多的人会头脑一片混乱。所以我对它们进行了总结,希望对大家有帮助。  ...
intInteger比较
tiantian1980的专栏
10-26 301
四:对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false(这是因为Integer的缓存机制会对-128-127的数进行缓存,若下次。二:Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)而int则是直接存储数据值。
Integerint比较
qq_36127031的博客
06-11 703
package com.mawei.www;public class IntegerTest {public static void main(String[] args) {mytest01();mytest02();  mytest03();}/*** == 和 equals的差异*/private static void mytest01() {System.out.println("===...
详解JavaintInteger的区别
08-26
JavaintInteger 的区别 ...本文详细介绍了 JavaintInteger 的区别,以及它们之间的自动装箱/拆箱机制。我们可以通过了解这些区别和机制来更好地使用 Java 语言,提高编程效率和代码质量。
IntInteger的区别
zxx862309181的博客
04-13 440
转自java面试题之intInteger的区别 - 果冻迪迪 - 博客园 (cnblogs.com) intInteger的区别 1、Integerint的包装类,int则是java的一种基本数据类型 2、Integer变量必须实例化后才能使用,而int变量不需要 3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 4、Integer的默认值是null,int的默认值是0 延伸: 关于Integerint比较...
简单了解javaintInteger的区别
08-25
本文将详细介绍 JavaintInteger 的区别。 1. 数据类型 intJava 中的一种基本数据类型,表示一个 32 位的整数值。它是 Java 语言的原始类型,直接存储数据值。 IntegerJava 中的一个类,表示一个...
intInteger对比
weixin_42412843的博客
04-27 214
intInteger 有什么区别? Integerint的包装类;int是基本数据类型; Integer变量必须实例化后才能使用;int变量不需要; Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ; Integer的默认值是null;int的默认值是0。 两个new生成的Integer变量的对比 由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其.
int类型和Integer类型数据的比较
向上的"狼"的博客
05-01 4082
int类型和Integer类型数据的比较
intinteger比较
weixin_34033624的博客
12-06 122
程序代码: Integer i01 = 59; int i02 = 59; Integer i03 =Integer.valueOf(59); Integer i04 = new Integer(59); System.out.println(i01==i02); System.ou...
IntInteger的对比、优劣和应用场景
m0_43450656的博客
05-09 2237
对比 1、Integerint提供的封装类,而intJava的基本数据类型 2、Integer默认值是null,而int默认值是0; 3、声明为Integer的变量需要实例化,而声明为int的变量不需要实例化; 4、Integer是对象,用一个引用指向这个对象,而int是基本类型,直接存储数值。 int是基本数据类型,Integer是包装类,类似HashMap这样的结构必须使用包装类, 因为包装类继承自Object,都需要实现HashCode,所以可以使用在HashMap这类数据结构..
IntInteger的区别
aikunjiao3421的博客
03-19 1174
一、区别: 1.Integerint的包装类,int则是java的一种基本的数据类型; 2.Integer变量必须实例化之后才能使用,而int变量不需要实例化; 3.Integer实际是对象的引用,当new一个Integer时,实际上生成一个指针指向对象,而int则直接存储数值 4.Integer的默认值是null,而int的默认值是0。 二、Integerint比较 ...
intInteger有什么区别?
09-20
intInteger之间存在几个关键的区别: 1. 定义和数据类型:intJava的基本数据类型,而Integerint的封装类,属于引用类型。int只能表示整数,而Integer可以表示整数并提供了更多的操作方法。 2. 存储方式:int...
写文章

热门文章

  • C语言程序设计:图书管理系统(超详细有登录系统,附代码和实验报告) 282290
  • 详解 & 0xff 的作用 152820
  • python TCP通信详解 30867
  • 计算机组成原理:IEEE754标准中,为什么指数真值e变成阶码加上的偏移值是127不是128? 22571
  • 数据结构(C)小技巧:Dev-C++怎么新建和调用用户自定义的头文件 22461

分类专栏

  • Java基础入门 19篇
  • 蓝桥杯 20篇
  • 数据竞赛 1篇
  • 数据分析 1篇
  • 深度学习
  • 爬虫 1篇
  • 大数据 1篇
  • 机器学习 3篇
  • 编译原理 2篇
  • 算法轻松入门 10篇
  • Java 26篇
  • 数据结构 21篇
  • 计算学科导论 1篇
  • 计算机组成原理 3篇
  • 算法 20篇
  • python 11篇
  • Linux

最新评论

  • VS2017 C/C++调用python脚本文件

    小白*1: 你说的这种调用方式,当python代码使用了库的时候,比如OpenCV,是不是也容易出各种问题呢?不如直接把python代码打包成.exe程序,然后在C++中执行这个程序就可以了。不知道是否可行?

  • C语言程序设计:图书管理系统(超详细有登录系统,附代码和实验报告)

    2401_87079540: 修改密码未响应的话是xg函数中的n没有赋值,把n赋值为0就行

  • 详解 & 0xff 的作用

    树下友人: 就是第一个数取低8位,高位为0的意思

  • C语言程序设计:图书管理系统(超详细有登录系统,附代码和实验报告)

    欧泡果奶要要要: 亲爹在上

  • python项目:飞机大战(爆炸效果,血条,音效,buff加成,boss,菜单,完整详细注释的源码)

    Qii843: 大佬,求素材,3130516452@qq.com

大家在看

  • 论文 Python 实现WOA-CNN-BiGRU-Attention数据分类预测 64
  • 手环押金原路退回系统——足浴店——东方仙盟

最新文章

  • 笔试题:跳跃游戏每一次比上一次多跳1(数学,二进制搜索)
  • ZJU打卡基于pyppeteer,tkinter
  • 【天池学习笔记】二手车交易价格预测
2022年1篇
2021年7篇
2020年31篇
2019年71篇
2018年1篇

目录

目录

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家创意玻璃钢花盆最新玻璃钢花盆图片西藏模压玻璃钢花盆岑溪玻璃钢圆门头雕塑珠海发光景观玻璃钢雕塑定做绍兴玻璃钢雕塑摆件销售企业湖南花朵玻璃钢景观雕塑厂家安宁玻璃钢雕塑产品厂家特别推荐商场日常美陈方案卫滨玻璃钢雕塑厂家合肥玻璃钢雕塑设计方案广东特色商场美陈哪家好长沙玻璃钢雕塑批发市场河北玻璃钢雕塑摆件报价泉州玻璃钢桃子雕塑昌邑玻璃钢长颈雕塑枞阳玻璃钢花盆花器通辽仿铜玻璃钢雕塑定做广西玻璃钢仿铜雕塑玻璃钢红军浮雕雕塑丽水欧式玻璃钢雕塑云南水果玻璃钢雕塑订做价格现代玻璃钢雕塑的特点滨州玻璃钢雕塑定制新余特色玻璃钢雕塑定制商场夏季美陈主题方案珠海玻璃钢火烈鸟雕塑浦江卡通玻璃钢雕塑定制阜康玻璃钢南瓜屋雕塑河北室内商场美陈厂家直销香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化