文档章节

java当中Integer==、equals以及cache

getqiu
 getqiu
发布于 2016/08/11 11:07
字数 713
阅读 7
收藏 0
点赞 0
评论 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
粉丝 1
博文 12
码字总数 11145
作品 0
朝阳
程序员
理解Java Integer的缓存策略

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

analogous_love ⋅ 04/26 ⋅ 0

Java:大数据技术领域的一匹黑马

诞生于1991年的Java如今已经成为世界范围内应用最为广泛的编程语言之一。在今天的文章中,我们将共同了解Java所拥有的七大关键新特性,展望其如何在未来的超级计算、大数据以及物联网等领域继...

Java大数据处理 ⋅ 04/22 ⋅ 0

云计算周末班培训:常用虚拟机参数

JVM 虚拟机提供了三种类型参数:标准参数中包括功能和输出的参数都是很稳定的,很可能在将来的JVM版本中不会改变。你可以用 java 命令(或者是用 java -help)检索出所有标准参数。 非标准化...

长沙千锋 ⋅ 05/17 ⋅ 0

Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

scala中的==、equals、eq

scala中equals方法和==是检查值是否相等,而eq方法检查的是引用是否相等。 Scala 的==与Java的有何差别 Java 里的既可以比较基本类型也可以比较引用类型。对于基本类型,Java 的==比较 值比较...

张欢19933 ⋅ 04/27 ⋅ 0

Java编程语言:4道java小测试,小测试

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

启示录是真的 ⋅ 05/23 ⋅ 0

java编程学习常见面试题及答案

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/22 ⋅ 0

用Java这么多年,这些秘密你知道吗?

摘要: 如果您是Java开发人员,那么这些问题可能会让您在某个时刻头痛不已。继续阅读以了解如何处理这5个棘手的秘密。 Java是一个拥有悠久历史的大型语言。在二十多年的时间里,语言中蕴含着...

James- ⋅ 05/11 ⋅ 0

Java虚拟机标准(第10版)第一章(节选)翻译与评注

英文原文链接:https://docs.oracle.com/javase/specs/jvms/se10/html/jvms-1.html 评注是括在鱼尾号之间的文字,其余均为翻译 Java虚拟机是Java平台的基石,这种技术实现了诸如跨平台、生成...

Jelif ⋅ 06/03 ⋅ 0

2018年Java编程学习面试最全知识点总结

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

服务网关过滤器

过滤器作用 我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了。但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会...

明理萝 ⋅ 13分钟前 ⋅ 1

【2018.06.21学习笔记】【linux高级知识 14.1-14.3】

14.1 NFS介绍 NFS服务全称是NetWork File System:网络文件系统,最早有sun公司开发的,4.0版本由Netapp公司开发,是基于RPC远程过程调用(Remote Procedure Call)协议的服务。 14.2 NFS服务...

lgsxp ⋅ 22分钟前 ⋅ 0

Day18 vim编辑模式、命令模式与练习

编辑模式 命令模式 :nohl 不高亮显示 :x与:wq类似,如果在更改文件之后操作,两者效果一样;如果打开文件,没有任何操作; :wq会更改mtime,但是:x不会。 练习题 扩展 vim的特殊用法 ht...

杉下 ⋅ 25分钟前 ⋅ 0

Enum、EnumMap、EnumSet

1、Enum 不带参数 public enum Car { AUDI { @Override public int getPrice() { return 25000; } }, MERCEDES { ......

职业搬砖20年 ⋅ 26分钟前 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 27分钟前 ⋅ 0

线程组和 ThreadLocal

前言 在上面文章中,我们从源码的角度上解析了一下线程池,并且从其 execute 方法开始把线程池中的相关执行流程过了一遍。那么接下来,我们来看一个新的关于线程的知识点:线程组。 线程组 ...

猴亮屏 ⋅ 28分钟前 ⋅ 0

相对路径和绝对路径

基本概念   文件路径就是文件在电脑中的位置,表示文件路径的方式有两种,相对路径和绝对路径。在网页设计中通过路径可以表示链接,插入图像、Flash、CSS文件的位置。   物理路径:物理路...

临江仙卜算子 ⋅ 32分钟前 ⋅ 0

消息队列属性及常见消息队列介绍

什么是消息队列? 消息队列是在消息的传输过程中保存消息的容器,用于接收消息并以文件的方式存储,一个队列的消息可以同时被多个消息消费者消费。分布式消息服务DMS则是分布式的队列系统,消...

中间件小哥 ⋅ 35分钟前 ⋅ 0

java程序员使用web3j进行以太坊开发详解

如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤器...

笔阁 ⋅ 35分钟前 ⋅ 0

vim编辑模式、vim命令模式

vim编辑模式 使用vim filename 进入的界面是一般模式,在这个模式下虽然我们能够查看,复制,剪切,粘贴,但是不能编辑新的内容,如何能直接写入东西呢?这就需要进入编辑模式了,从一般模式...

李超小牛子 ⋅ 38分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部