文档章节

java当中Integer==、equals以及cache

getqiu
 getqiu
发布于 2016/08/11 11:07
字数 713
阅读 8
收藏 0

经常遇到 用 `==`比较两个基本类型自动装箱后的对象,有些时候总让人晕,今天总体梳理一下这个问题。

梳理这个问题之前,先来看看最近遇到的一些程序片段:

public void integerCache()
{
    Integer number1 = new Integer(10);
    Integer number2 = new Integer(10);
    System.out.println("number1 == number2:"+(number1 == number2)); //@1

    Integer number3 = 300;
    Integer number4 = 300;
    System.out.println("number3 == number4 :"+(number3 == number4));//@2

    System.out.println("300 == 300 :"+(300 == 300));                //@3

    Integer number5 = Integer.valueOf("67");
    Integer number6 = Integer.valueOf("67");
    System.out.println("number5 == number6:"+(number5 == number6)); //@4

    Integer number7 = Integer.valueOf("128");
    Integer number8 = Integer.valueOf("128");
    System.out.println("number7 == number8:"+(number7 == number8)); //@5
}

遇到的问题大概就是这5类吧,程序输出的结果是这样的:

number1 == number2:false
number3 == number4 :true
300 == 300 :true
number5 == number6:true
number7 == number8:false

一个一个的来分析:

  1. @1 在java当中 `==`对于基本类型来说是判断两个变量的值是否相等(即使类型不同也行,比如21 == 21F),但是对于引用类型,必须是引用地址相等才能算相等,因此@1当中,这个两个引用类型的变量,在堆区的不同位置,因此答案是 false
  2. @2地方比较迷惑人。程序是申明了一个Integer对象,因此在赋值 number3=300时,300会自动装箱,成为Interger(300),又是堆区当中两个不同的对象,所以返回的结果是false。但是:如果把程序中的300改为30,那么结果返回是true?为什么呢?因为在java在初始化Integer时,会自动的缓存(-128,127)的Integer对象,所以当把30自动装箱,那么就会自动引用缓存当中的对象。但是为什么@1当中没有自动引用缓存呢?上面黄色标记的地方说了,在自动装箱的时候才去缓存当中取,没说创建的时候会到缓存当中取。
  3. @3地方,两个基本类型,所以只要值相等,自然就相等了。结果为true。
  4. @4:Integer的valueOf方法也会到缓存当中取对象,而且缓存的范围是(-128,127),故返回值为true,同理@5返回只为false。
  5. @5返回为false。

总之:

遇到这类问题首先要明白的是:

  1. ==判断的依据是什么? `==`对于基本类型来说是判断两个变量的值是否相等(即使类型不同也行,比如21 == 21F),但是对于引用类型,必须是引用地址相等才能算相等。
  2. 当前比较的类型是基本类型还是引用类型?
  3. 如果是引用类型:这两个变量的地址相同吗?(考虑是否被缓存了)

 

大概总结就这样吧,欢迎补充。

© 著作权归作者所有

共有 人打赏支持
getqiu
粉丝 2
博文 12
码字总数 11145
作品 0
朝阳
程序员
私信 提问
【源码分析】面试问烂的equals和各种字符串、Integer比较

今天在空闲时间聊天时发现,面试题中的equals问题,以及String、Integer等的判等问题还是讨论的比较激烈而且混乱。。。(滑稽) 其实网上有非常多关于这种面试题的文章或者博客,其实多去看看就...

LinkedBear
10/23
0
0
你不知道的 equals 和 ==

先来看一道 equals和 == 相关的面试题吧。 先告诉你答案是 true,true,false,true。 i1 == i2 和 i1.equals(i2) 这两个都是 true,大多数人应该可以答对。后面的 i3 == i4 和 i3.equals(i4...

Wizey
08/17
0
0
Java自动装箱和拆箱,包装类缓存机制和JVM调节

关于Java自动装箱和拆箱 基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能 自动装箱,个人感觉也就是为了所谓的java泛型,泛型就是一种糖,装箱是...

BakerZhu
2017/07/17
0
0
Java自动装箱与拆箱及其陷阱

在本文中,笔者向大家介绍下Java中一个非常重要也非常有趣的特性,就是自动装箱与拆箱,并从源码中解读自动装箱与拆箱的原理,同时这种特性也留有一个陷阱。开发者如果不注意,就会很容易跌入...

LCZ777
2014/07/26
0
0
JVM常量池及字符串==比较分析

Java常量池技术 java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创建相等变量时节省了很多...

陶邦仁
2012/10/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
31
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
15
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部