本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。

在网上看到一个面试题,没有完全做, 本代码基于JDK8

  1. //下面代码运行结果是
  2. public class Test3
  3. {
  4. public static void main(String[] args) {
  5. Integer a = 1;
  6. Integer b = 2;
  7. Integer c = 3;
  8. Integer d = 3;
  9. Integer e = 11;
  10. Integer f = 11;
  11. Long g = 3L;
  12. Long h = 2L;
  13. Integer i =127;
  14. Integer k =128;
  15. System.out.println(c == d);
  16. System.out.println(e == f);
  17. System.out.println(c == (a + b));
  18. System.out.println(k == (a + i));
  19. System.out.println(c.equals(a + b));
  20. System.out.println(g == (a + b));
  21. System.out.println(g.equals(a + b));
  22. System.out.println(g.equals(a + h));
  23.  
  24. Integer a1 = new Integer(1);
  25. Integer b1 = new Integer(1);
  26. System.out.println("----"+(a1==b1));
  27. }
  28. }

先自己做一遍,看看自己能不能完全做作对

答案是如下:

相信挺多人 都或多或少的了解到Integer 有一个 缓存池,缓存的大小是:-128 -127 之间(Long同理)

  1. //缓存结构
  2. private static class IntegerCache {
  3. static final int low = -128;
  4. static final int high;
  5. static final Integer cache[];
  6.  
  7. static {
  8. // high value may be configured by property
  9. int h = 127;
  10. String integerCacheHighPropValue =
  11. sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
  12. if (integerCacheHighPropValue != null) {
  13. try {
  14. int i = parseInt(integerCacheHighPropValue);
  15. i = Math.max(i, 127);
  16. // Maximum array size is Integer.MAX_VALUE
  17. h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
  18. } catch( NumberFormatException nfe) {
  19. // If the property cannot be parsed into an int, ignore it.
  20. }
  21. }
  22. high = h;
  23.  
  24. cache = new Integer[(high - low) + 1];
  25. int j = low;
  26. for(int k = 0; k < cache.length; k++)
  27. cache[k] = new Integer(j++);
  28.  
  29. // range [-128, 127] must be interned (JLS7 5.1.7)
  30. assert IntegerCache.high >= 127;
  31. }
  32.  
  33. private IntegerCache() {}
  34. }

再了解一下 Integer(Long同理)内部一些代码

  1. //Integer 值 是基本类型 int
  2. private final int value;
  3.  
  4. //别急 结合后面发编译的代码看
  5. // Integer 赋值 首先会判断 是否是 -128 -127之间(缓存池)
  6. // 若没有 超出返回 才会 new 一个对象
  7. public static Integer valueOf(int i) {
  8. if (i >= IntegerCache.low && i <= IntegerCache.high)
  9. return IntegerCache.cache[i + (-IntegerCache.low)];
  10. return new Integer(i);
  11. }
  12.  
  13. //别急 结合后面发编译的代码看
  14. public int intValue() {
  15. return value;
  16. }
  17.   //euqals 方法 
  18. public boolean equals(Object obj) {
  19.   if (obj instanceof Integer) {
  20. return value == ((Integer)obj).intValue();
  21.   }
  22.   return false;
  23.   }

 首先 用反编译工具 打开 class文件 上下代码 结合思考一下

  1. import java.io.PrintStream;
  2. public class Test3
  3. {
  4. public static void main(String[] args)
  5. {
  6. Integer a = Integer.valueOf(1);
  7. Integer b = Integer.valueOf(2);
  8. Integer c = Integer.valueOf(3);
  9. Integer d = Integer.valueOf(3);
  10. Integer e = Integer.valueOf(321);
  11. Integer f = Integer.valueOf(321);
  12. Long g = Long.valueOf(3L);
  13. Long h = Long.valueOf(2L);
  14. Integer i = Integer.valueOf(127);
  15. Integer k = Integer.valueOf(128);
  16. //true c、d 取得都是缓存中的3那个对象
  17. System.out.println(c == d);
  18. // false 看一下 Integer 中 valueOf这个方法 e、f 会分别 new 一个对象
  19. System.out.println(e == f);
  20. /*** true 数值比较 initValue 方法 取的是 Integer 中 final变量 value的值
  21. int a =1;
  22. int b =2;
  23. int c =3
  24. a+b == c
  25. ***/
  26. System.out.println(c.intValue() == a.intValue() + b.intValue());
  27.   // true 数值比较 同上
  28. System.out.println(k.intValue() == a.intValue() + i.intValue());
  29.   //true equals比较的是数值
  30. System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));
  31.   //true 数值比较
  32. System.out.println(g.longValue() == a.intValue() + b.intValue());
  33.   //false Long.equals()首先会判断 传入是否为Long对象 不是 Long !=Integer (a+b自动装箱的是Integer类型)
  34. System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));
  35. // true 了解一下 自动装箱 (Integer +Long) 会转为Long (注意Long也是存在 缓存的 -128 -127)
  36. System.out.println(g.equals(Long.valueOf(a.intValue() + h.longValue())));
  37.  
  38. Integer a1 = new Integer(1);
  39. Integer b1 = new Integer(1);
  40.  
  41. System.out.println("----" + (a1 == b1)); //new 出来的对象 地址不同
  42. }
  43. }

java --Integer 学习的更多相关文章

  1. Java多线程学习(转载)

    Java多线程学习(转载) 时间:2015-03-14 13:53:14      阅读:137413      评论:4      收藏:3      [点我收藏+] 转载 :http://blog ...

  2. Java Web学习系列——Maven Web项目中集成使用Spring

    参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...

  3. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  5. Android(java)学习笔记206:利用开源SmartImageView优化网易新闻RSS客户端

    1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的 国内我们经常用到htt ...

  6. Android(java)学习笔记205:网易新闻RSS客户端应用编写逻辑过程

    1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...

  7. Android(java)学习笔记216:多线程断点下载的原理(Android实现)

    之前在Android(java)学习笔记215中,我们从JavaSE的角度去实现了多线程断点下载,下面从Android角度实现这个断点下载: 1.新建一个Android工程: (1)其中我们先实现布局 ...

  8. java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)

    概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...

  9. Java开发学习心得(二):Mybatis和Url路由

    目录 Java开发学习心得(二):Mybatis和Url路由 1.3 Mybatis 2 URL路由 2.1 @RequestMapping 2.2 @PathVariable 2.3 不同的请求类型 ...

随机推荐

  1. Django模板标签

    一.模板标签 1.模板标签是在模板中运用python语言的实现,如for循环,if语句 2.模板标签的运用 2.1在teacher模板下创建students_list模板, 在teacher视图中国创 ...

  2. easyUI dialog打开对话框,显示列表数据,选取一条数据操作后赋值给父窗口 resultMap声明为全局,生成getset方法

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" ...

  3. ps修改图片文字

    原图(机密内容以打马赛克): 需要修改的地方: 1.去除蓝色的线条, 2.改表格的字体 操作: 1.去线条 放大图片,使用魔棒工具选中蓝色点,调节容差,取消连续,然后填充白色,ctrl+delete ...

  4. android-音量管理

    推荐简书夕月风: 前两个主要设计音频建设置流程. 一.https://www.jianshu.com/p/a48fc2c830da 二.https://www.jianshu.com/p/892761 ...

  5. _ZNote_Qt_重启软件

    原文: http://wiki.qt.io/How_to_make_an_Application_restartable int main(int argc, char** argv) { QAppl ...

  6. Debian 8下手工安装 Eclipse CDT neon.2

    从 http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/neon2 下载 eclipse-cpp-neon-2-li ...

  7. 6 week work 3

    sticky vs fixed sticky:表示粘贴到某个位置.当组件设置了该属性值后,当页面滑动时,组件会跟着页面移动,当组件触及到窗体后,页面若继续滑动,组件则处在与窗体接触的位置不动.元素的定 ...

  8. RabbitMQ 适用于云计算集群的远程调用(RPC)

    在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成.那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会 ...

  9. ORACLE提交事务回滚

    execute执行后 可以回滚 commit提交后 闪回恢复原来的数据 其实Oracle提交数据是分两步操作的,第一步execute执行,第二步commit提交.对应的PL\SQL也是要先点execu ...

  10. PHP+XML写注册登录

    2018/12/06  今天尝试了下PHP   使用PHP+XML写注册登录   具体保存于上传的文件中 从此山水不相逢  莫问他人长与短