为什么 Java 中“1000==1000”为false,而”100==100“为true? 

这是一个挺有意思的讨论话题。

如果你运行下面的代码:

Integer a = 1000, b = 1000;  System.out.println(a == b);//1Integer c = 100, d = 100;  System.out.println(c == d);//2

你会得到

falsetrue

基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。

因此,后面一条语句也应该是false 。

这就是它有趣的地方了。如果你看去看 Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。

所以事情就成了,所有的小整数在内部缓存,然后当我们声明类似——

Integer c = 100;

的时候,它实际上在内部做的是:

Integer i = Integer.valueOf(100);

现在,如果我们去看valueOf()方法,我们可以看到

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

如果值的范围在-128到127之间,它就从高速缓存返回实例。

所以…

Integer c = 100, d = 100;

指向了同一个对象。

这就是为什么我们写

System.out.println(c == d);

我们可以得到true。

现在你可能会问,为什么这里需要缓存?

合乎逻辑的理由是,在此范围内的“小”整数使用率比大整数要高,因此,使用相同的底层对象是有价值的,可以减少潜在的内存占用。

然而,通过反射API你会误用此功能。

运行下面的代码,享受它的魅力吧

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {      Class cache = Integer.class.getDeclaredClasses()[0]; //1      Field myCache = cache.getDeclaredField("cache"); //2      myCache.setAccessible(true);//3      Integer[] newCache = (Integer[]) myCache.get(cache); //4      newCache[132] = newCache[133]; //5      int a = 2;      int b = a + a;      System.out.printf("%d + %d = %d", a, a, b); //}

来自: 码农网

译文链接:http://www.codeceo.com/article/why-java-1000-100.html

英文原文:https://dzone.com/articles/why-1000-1000-returns-false-but-100-100-returns-tr

猜你喜欢

▶ 假如有人把支付宝所有存储服务器炸了,我们在里边的钱是不是都丢了?

▶ 原来,女孩的格子裙都是有名字的......

▶ 阿里官方Redis开发规范!建议收藏

▶ 学计算机的女生是一种怎样的存在?

▶ 2020年8月程序员工资最新统计,你拖后腿了吗?

点击“阅读全文”,给我充点儿电吧~

java cache缓存_涨姿势:为什么Java中“1000==1000”为false,而”100==100“为true?相关推荐

  1. java cache缓存_为什么 Java 中“1000==1000”为false,而”100==100“为true?

    阅读本文大概需要 2 分钟. 来自: 码农网 为什么 Java 中"1000==1000"为false,而"100==100"为true? 这是一个挺有意思的讨 ...

  2. Java cache类型_为什么有些Java 类方法中要cache类变量

    比如以下一段java代码: private void performTraversals() { // cache mView since it is used so much below... fi ...

  3. java redis 缓存_如何在 Java 中实现一个 redis 缓存服务

    缓存服务的意义 为什么要使用缓存?说到底是为了提高系统的运行速度.将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度.一个 web 应用的简单结构如下图. web 应用典型架 ...

  4. Java Cache 缓存方案详解及代码-Ehcache

    一.Spring缓存概念 Spring从3.1开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManage ...

  5. java 多线程缓存_[Java教程]【JAVA并发编程实战】12、使用condition实现多线程下的有界缓存先进先出队列...

    [Java教程][JAVA并发编程实战]12.使用condition实现多线程下的有界缓存先进先出队列 0 2016-11-29 17:00:10 package cn.study.concurren ...

  6. java 序列化 缓存_由缓存导致的一个java序列化问题

    背景描述: 项目是普通的java服务,以jar包的形式部署,前几天升级了一下服务,部署运行后跟踪日志发现时不时抛异常信息. 具体报错信息如下: class="linux">[ ...

  7. java array缓存_有java数组

    [JAVA零基础入门系列]Day10 Java中的数组 [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 D ...

  8. java避免装箱_深入剖析Java中的装箱和拆箱

    一.什么是装箱?什么是拆箱? Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果 ...

  9. java console 交互_实例讲解java中Console类的用法

    java的Console类的使用方法及实例 java的Console类的使用方法及实例 JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备.如果你的Java程序要与Win ...

最新文章

  1. PSS:简单有效的End-to-End检测
  2. 测试Python下载图片的三种方法
  3. matlab 条形图与饼图
  4. adchos 文本混淆工具
  5. Action访问Servlet API的对象
  6. SVN服务器的本地搭建和使用
  7. 【肌电信号】基于matlab GUI脉搏信号处理系统【含Matlab源码 1062期】
  8. 屋面光伏荷载计算机构,光伏系统屋顶荷载计算
  9. 什么是Meta分析异质性,怎么处理Meta分析异质性?看完这篇就够了
  10. 生产排程遇难题?APS系统来解决
  11. java web简答题_javaweb简答题
  12. kinect游戏下载
  13. 瞎琢磨先生のJava工具类
  14. SAP ABAP 工作区,内表,标题行的定义和区别
  15. button run clicked becomes grey Android studio运行按钮变灰
  16. linux误删文件后恢复
  17. 基于STM32F03RCT的多路频率占空比可调PWM输出
  18. 计算机网络——域名系统DNS
  19. XShell免费版的安装配置教程以及使用教程—解决“WARNINGThe remote SSH server rejected X11 forwarding request.“警告
  20. Pandas —— resample()重采样和asfreq()频度转换

热门文章

  1. android gpio驱动实例,Android/Linux 驱动层对GPIO口的操作方法和相关代码
  2. 取出list中属性_你是否用过List<T>和List<?>?
  3. html 字号自适应,自适应网页中字体大小自适应屏幕 - YangJunwei
  4. vba 指定列后插入列_如何用【VBA】快速批量提取多个工作表名称?
  5. ipad如何连接电脑_指纹打卡机如何连接电脑?怎么导出原始考勤数据记录?
  6. msra数据集_ACL2020 | 香侬科技提出使用Dice Loss缓解数据集数据不平衡问题
  7. php贺卡生成,用php与mysql的电子贺卡程序
  8. flex布局实现叠在另一个div之上_如何让一个div在另一个div的上面,求高手指点...
  9. pom.xml设置mysql连接_maven工程配置pom.xml实现mybatis的访问数据库操作
  10. 字节跳动技术整理:mysql性能优化方案