面试系列(3)Integer 和 int 的区别

我们大多数对于两者的认识停在:
Integer 是 int 的包装类,在初始化的时候,int 初始值为 0,而 Integer 的初始为 null 。

那么两者谁更占内存呢?
答案是 Integer 更占用内存,因为 int 是基础数据类型,占用的空间相对较小,而 Integer 是一个对象,需要存储对象的元数据,所以更占用内存。

在看问题之前,我们需要明确 == 是比较的什么?
对于引用数据类型的变量,== 比较的是两个引用指向的是否是同一个对象;
而对于基本数据类型的数据,== 比较的是两个变量的值是否相等 。

接下来我们通过几个例子,分析一下两者的区别

1、int 与非 new 出来的 Integer 比较
int i1 = 129;
Integer i2 = 129;
System.out.println(i1 == i2);

结果输出为 true

包装类 Integer 在与 基本数据类型 int 进行比较的时候,Integer 会自动拆箱成 int ,然后两者进行比较,其实就相当于两个基本数据类型在进行比较,只要值相同,则结果相同。

2、int 与 new 出来的 Integer 比较
int i3 = 130;
Integer i4 = new Integer(130);
System.out.println(i3 == i4);

结果输出为 true

原因和第一条是一致的,不管 Integer 是否为 new 出来的,与 int 比较时,都会自动拆箱为 int 类型,然后只需要比较两个值是否相等即可。

3、两个 new 出来的 Integer 比较
Integer i5=new Integer(190);
Integer i6=new Integer(190);
System.out.println(i5 == i6);

结果输出为 false

Integer 变量实际上是对一个 Integer 对象的引用,当 new 一个 Integer 的时候,会产生一个指针指向这个对象,new 了两个 Integer ,则会产生两个对象,两者内存地址不同,则会输出 false 结果。

4、一个 new 出来的 Integer 和一个非 new 出来的 Integer 比较
Integer i7 = new Integer(200);
Integer i8 = 200;
System.out.println(i7 == i8);

结果输出为 false

非 new 出来的 Integer 指向的是常量池中的对象,而 new 出来的对象则指向堆中新建的对象,两者的内存地址不同,所以输出结果 false 。

5、两个非 new 出来的 Integer 比较
Integer i9 = 127;
Integer i10 = 127;
System.out.println(i9 == i10);

Integer i11 = 129;
Integer i12 = 129;
System.out.println(i11 == i12);

第一个输出为 true ,第二个输出为 false

两个都是非 new 出来的 Integer 对象,为什么输出结果会不一样呢?
那是因为在编译 Integer i9 = 129 时,会翻译成 Integer i9 = Integer.valueOf(129); 查看源码

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

其中 IntegerCache.low = -128 ;
IntegerCache.high = 127 ;

可以看出,当数字介于 [-128,127] 之间时,java 会将其缓存,如上例 i9 = 127 ,会将其缓存,当 i10 = 127 时,则直接从缓存中取值,不会新建,所以 i9 和 i10 比较结果为 true 。
而 129 不在这个范围内,所以每次都会新建,所以 i11 和 i12 比较结果为 false 。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容