文档章节

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 和 ==

先来看一道 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
JVM常量池及字符串==比较分析

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

陶邦仁
2012/10/21
0
0
Java自动装箱与拆箱及其陷阱

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

LCZ777
2014/07/26
0
0
理解Java Integer的缓存策略

本文将介绍 Java 中 Integer 缓存的相关知识。这是 Java 5 中引入的一个有助于节省内存、提高性能的特性。首先看一个使用 Integer 的示例代码,展示了 Integer 的缓存行为。接着我们将学习这...

analogous_love
04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hbase 概述及特点

1、Hbase概述 HBase是一种构建在HDFS之上的分布式、面向列的存储系统。在需要实时读写、随机访问超大规模数据集时,可以使用HBase。 尽管已经有许多数据存储和访问的策略和实现方法,但事实上...

PeakFang-BOK
10分钟前
0
0
TortoiseGit(乌龟git)保存用户名密码的方法

windows下比较比较好用的git客户端有2种: 1. msysgit + TortoiseGit(乌龟git) 2. GitHub for Windows github的windows版也用过一段时间,但还是不太习惯。所以目前仍然青睐与msysgit+乌龟g...

simpower
29分钟前
0
0
Java并发编程:volatile关键字解析

volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生...

engeue
47分钟前
2
0
通过ajax访问远程天气预报服务

http://www.webxml.com.cn/zh_cn/index.aspx 更改wsdl文件 打开文件将15行,51行,101行去掉 然后把文件复制到c盘 然后在桌面上面就生成了文件 将文件打成jar包 package cn.it.ws.weather;...

江戸川
今天
1
0
聊聊storm的tickTuple

序 本文主要研究一下storm的tickTuple 实例 TickWordCountBolt public class TickWordCountBolt extends BaseBasicBolt { private static final Logger LOGGER = LoggerFactory.getLogg......

go4it
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部