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

如果你运行下面的代码

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 && ireturn 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); //}

来源:http://www.codeceo.com/why-java-1000-100.html

connection timed out是什么意思_为什么Java中1000==1000为false而100==100为true?相关推荐

  1. c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务

    作者: 杨高超 juejin.im/post/5a4984265188252b145b643e 获取全局唯一标识的方法介绍 在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求.在以前的单体应用 ...

  2. java触发器如何创建表_在java 中执行触发器代码、创表语句

    由于程序的需要,在SQLServer 中创建触发器及建表,碰到了在java 代码中执行创建触发器及表. /**建立中间表*/ public static final String createMidd ...

  3. java代码连接oracle数据库连接_在JAVA中连接Oracle数据库(例子)

    * TODO 要更改此生成的文件的模板,请转至 * 窗口 - 首选项 - java - 代码样式 - 代码模板 */ package person.fane.test; import java.sql ...

  4. java正则表达式匹配数字范围_在java中怎么利用正则表达式匹配数字

    在java中怎么利用正则表达式匹配数字 发布时间:2020-12-03 17:47:12 来源:亿速云 阅读:58 作者:Leah 在java中怎么利用正则表达式匹配数字?针对这个问题,这篇文章详细介 ...

  5. Java中怎样创建数据库_在java中怎样创建MySQL数据库列表给个例子 爱问知识人

    java中怎样创建MySQL数据库列表 需要使用jdbc访问数据库. 具体步骤如下: 1:加载驱动 ,返回连接 private static final String DRIVER_CLASS = & ...

  6. java根据父类找子类_在java中实现多态时,可以通过父类变量引用子类的对象。_学小易找答案...

    [单选题]对于字符串s="java",下面哪个选项返回字符在字符串中'v'的位置( ). [简答题]汽车核保的主要内容 [判断题]在java中产生子类对象时,直接调用子类的构造方法 ...

  7. 关于java中数据类型叙述正确的是( )_关于Java中数据类型叙述正确的是:

    [判断题]图像的分辨率是指图像单位面积上的象素个数. [填空题]9. Together with the development of bourgeois relationships and form ...

  8. java 插入 mysql 乱码_解决java中插入mysql中文乱码的方法

    解决java中插入mysql中文乱码的方法 发布时间:2020-07-11 14:35:11 来源:亿速云 阅读:100 作者:清晨 这篇文章主要介绍解决java中插入mysql中文乱码的方法,文中介 ...

  9. java对数据库的增删改查_在java中对数据库进行增删改查

    代码区域: package com.oracle.jdbc.demo1; import java.sql.Connection; import java.sql.DriverManager; impo ...

最新文章

  1. 高德API+Python解决租房问题
  2. TensorFlow object detection api------ssd_mobilenet使用
  3. 贝叶斯居然用事件概率,就轻松预知了未来?
  4. 什么是数据中台?全面解读数据中台
  5. linux之cut命令详解
  6. MySQL自学2018/05/02-数据类型
  7. Java 8 - 06 Lambda 和方法引用实战
  8. c语言,如何产生随机数
  9. 中嵌协会 第1期“嵌入式与物联网”主题论坛将于2010年6月26日在中关村软件园举行...
  10. jzoj4669-[NOIP2016提高A组模拟7.19]弄提纲【LCA,KMP,字符串】
  11. c++堆栈中 top() pop()的具体作用是什么
  12. 社区网站类场景下的静态资源处理
  13. django中的Ajax文件上传
  14. 各种排序算法的时间复杂度对比
  15. 项目总结【Excel中附件导出和导入】
  16. chrome实现屏幕取词并翻译
  17. 从mysql中导出数据乱码_MySQL导入导出数据出现乱码的解决办法
  18. (VGG)VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION--Karen Simonyan
  19. php中开通短信验证码,php利用云片网实现短信验证码功能的示例代码
  20. Java 数字转中文数字(会计格式与非会计格式,暂不包含小数)

热门文章

  1. 计算机大数乘法引发的思考 | CSDN 博文精选
  2. 这本在日本销量突破70W+的 Python 书,凭什么这么火?
  3. 性能提升 3 倍的树莓派 4,被爆设计缺陷!
  4. @程序员,你的 996,可能是给公司无能的管理背锅
  5. 程序员探案之 Python 和 Redis 的“第三者”
  6. 写给科技公司项目经理的一封警告书
  7. 用Python搭建“冲顶大会”外挂,王思聪们还舍得撒币吗?
  8. javaweb实训第一天上午——HTML和CSS
  9. android监听键盘的隐藏,Android监听软键盘的显示和隐藏
  10. 怒肝三个月啃完这110道面试题,跳槽薪资翻倍