java cache缓存_涨姿势:为什么Java中“1000==1000”为false,而”100==100“为true?
为什么 Java 中“1000==1000”为false,而”100==100“为true?
这是一个挺有意思的讨论话题。
如果你运行下面的代码:
Integer a = 1000, b = 1000;
System.out.println(a == b);//1
Integer c = 100, d = 100;
System.out.println(c == d);//2
你会得到
false
true
基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。
因此,后面一条语句也应该是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?相关推荐
- java cache缓存_为什么 Java 中“1000==1000”为false,而”100==100“为true?
阅读本文大概需要 2 分钟. 来自: 码农网 为什么 Java 中"1000==1000"为false,而"100==100"为true? 这是一个挺有意思的讨 ...
- Java cache类型_为什么有些Java 类方法中要cache类变量
比如以下一段java代码: private void performTraversals() { // cache mView since it is used so much below... fi ...
- java redis 缓存_如何在 Java 中实现一个 redis 缓存服务
缓存服务的意义 为什么要使用缓存?说到底是为了提高系统的运行速度.将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度.一个 web 应用的简单结构如下图. web 应用典型架 ...
- Java Cache 缓存方案详解及代码-Ehcache
一.Spring缓存概念 Spring从3.1开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManage ...
- java 多线程缓存_[Java教程]【JAVA并发编程实战】12、使用condition实现多线程下的有界缓存先进先出队列...
[Java教程][JAVA并发编程实战]12.使用condition实现多线程下的有界缓存先进先出队列 0 2016-11-29 17:00:10 package cn.study.concurren ...
- java 序列化 缓存_由缓存导致的一个java序列化问题
背景描述: 项目是普通的java服务,以jar包的形式部署,前几天升级了一下服务,部署运行后跟踪日志发现时不时抛异常信息. 具体报错信息如下: class="linux">[ ...
- java array缓存_有java数组
[JAVA零基础入门系列]Day10 Java中的数组 [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 D ...
- java避免装箱_深入剖析Java中的装箱和拆箱
一.什么是装箱?什么是拆箱? Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果 ...
- java console 交互_实例讲解java中Console类的用法
java的Console类的使用方法及实例 java的Console类的使用方法及实例 JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备.如果你的Java程序要与Win ...
最新文章
- PSS:简单有效的End-to-End检测
- 测试Python下载图片的三种方法
- matlab 条形图与饼图
- adchos 文本混淆工具
- Action访问Servlet API的对象
- SVN服务器的本地搭建和使用
- 【肌电信号】基于matlab GUI脉搏信号处理系统【含Matlab源码 1062期】
- 屋面光伏荷载计算机构,光伏系统屋顶荷载计算
- 什么是Meta分析异质性,怎么处理Meta分析异质性?看完这篇就够了
- 生产排程遇难题?APS系统来解决
- java web简答题_javaweb简答题
- kinect游戏下载
- 瞎琢磨先生のJava工具类
- SAP ABAP 工作区,内表,标题行的定义和区别
- button run clicked becomes grey Android studio运行按钮变灰
- linux误删文件后恢复
- 基于STM32F03RCT的多路频率占空比可调PWM输出
- 计算机网络——域名系统DNS
- XShell免费版的安装配置教程以及使用教程—解决“WARNINGThe remote SSH server rejected X11 forwarding request.“警告
- Pandas —— resample()重采样和asfreq()频度转换
热门文章
- android gpio驱动实例,Android/Linux 驱动层对GPIO口的操作方法和相关代码
- 取出list中属性_你是否用过List<T>和List<?>?
- html 字号自适应,自适应网页中字体大小自适应屏幕 - YangJunwei
- vba 指定列后插入列_如何用【VBA】快速批量提取多个工作表名称?
- ipad如何连接电脑_指纹打卡机如何连接电脑?怎么导出原始考勤数据记录?
- msra数据集_ACL2020 | 香侬科技提出使用Dice Loss缓解数据集数据不平衡问题
- php贺卡生成,用php与mysql的电子贺卡程序
- flex布局实现叠在另一个div之上_如何让一个div在另一个div的上面,求高手指点...
- pom.xml设置mysql连接_maven工程配置pom.xml实现mybatis的访问数据库操作
- 字节跳动技术整理:mysql性能优化方案