阅读本文大概需要 2 分钟。

来自: 码农网

为什么 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]; //1Field myCache = cache.getDeclaredField("cache"); //2myCache.setAccessible(true);//3Integer[] newCache = (Integer[]) myCache.get(cache); //4newCache[132] = newCache[133]; //5int a = 2;int b = a + a;System.out.printf("%d + %d = %d", a, a, b); //}

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

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

    为什么 Java 中"1000==1000"为false,而"100==100"为true?  这是一个挺有意思的讨论话题. 如果你运行下面的代码: Integ ...

  2. java 高性能缓存_高性能Java缓存----Caffeine

    简单介绍 Caffeine是新出现的一个高性能的Java缓存,有了它完全可以代替Guava Cache,来实现更加高效的缓存:Caffeine采用了W-TinyLFU回收策略,集合了LRU和LFU的优 ...

  3. java array缓存_有java数组

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

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

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

  5. java几点钟_实现 Java 本地缓存,该从这几点开始

    缓存,我相信大家对它一定不陌生,在项目中,缓存肯定是必不可少的.市面上有非常多的缓存工具,比如 Redis.Guava Cache 或者 EHcache. 对于这些工具,我想大家肯定都非常熟悉,所以今 ...

  6. java cache组件_组件之Cache篇

    缓存---基础理论篇 1.   缓存 缓存介于应用程序和永久性数据存储源之间,它的作用是降低应用程序直接读写永久数据存储源的频率,从而提高应用的运行性能. 缓存中的数据是数据存储源中数据的拷贝,应用程 ...

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

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

  8. java coin介绍_代码示例中的Java 7:Project Coin

    java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...

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

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

最新文章

  1. 【Python学习笔记】面向对象三大特性
  2. C/C++ 程序设计员应聘常见面试试题深入剖析
  3. Python计算大文件行数方法及性能比较
  4. 2016.6.23 随笔———— AJAX
  5. grep 显示前后几行
  6. Atlas Unknown Error
  7. SQLPlus命令详细说明
  8. Docker安装与卸载,配置阿里云镜像加速器
  9. CMU 15-213 Introduction to Computer Systems学习笔记(9) Program Optimization
  10. 达梦数据库连接工具简介
  11. android hci设备,Android Bluetooth hci 命令分析
  12. 【JVM】JVM系列
  13. 2022蓝桥杯A组Python
  14. 【Java】若依前后端分离,分页数据为null报错
  15. python 培训基础
  16. Prolog教程 3
  17. Oracle数据库全备份和增量备份Windows
  18. 运维监控系列(16)-Alertmanager路由、抑制、静默功能使用详解。
  19. Linux 文件服务器配置
  20. 《加强5G公众移动通信系统无线电频率共享管理》最新解读来啦

热门文章

  1. 台式计算机键盘配置及价格,最新台式电脑组装配置单及价格【图文】
  2. CRMEB v4二开文档
  3. k8s angular mysql_Angular 实践:如何优雅地发起和处理请求
  4. android xml 解析天气,Retrofit2解析天气API XML接口
  5. mysql 账户管理_Mysql账户管理_MySQL
  6. 【uni-app】uParse 富文本解析插件遇到长图、大图宽高比异常问题
  7. spring el 三元表达式
  8. Maven 打包时不执行测试用例
  9. 模拟进程创建、终止、阻塞、唤醒原语_操作系统基础8-进程及进程控制
  10. linux中original_如何在 Linux 中整理磁盘碎片