java --Integer 学习
本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。
在网上看到一个面试题,没有完全做, 本代码基于JDK8
- //下面代码运行结果是
- public class Test3
- {
- public static void main(String[] args) {
- Integer a = 1;
- Integer b = 2;
- Integer c = 3;
- Integer d = 3;
- Integer e = 11;
- Integer f = 11;
- Long g = 3L;
- Long h = 2L;
- Integer i =127;
- Integer k =128;
- System.out.println(c == d);
- System.out.println(e == f);
- System.out.println(c == (a + b));
- System.out.println(k == (a + i));
- System.out.println(c.equals(a + b));
- System.out.println(g == (a + b));
- System.out.println(g.equals(a + b));
- System.out.println(g.equals(a + h));
- Integer a1 = new Integer(1);
- Integer b1 = new Integer(1);
- System.out.println("----"+(a1==b1));
- }
- }
先自己做一遍,看看自己能不能完全做作对
答案是如下:
相信挺多人 都或多或少的了解到Integer 有一个 缓存池,缓存的大小是:-128 -127 之间(Long同理)
- //缓存结构
- private static class IntegerCache {
- static final int low = -128;
- static final int high;
- static final Integer cache[];
- static {
- // high value may be configured by property
- int h = 127;
- String integerCacheHighPropValue =
- sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
- if (integerCacheHighPropValue != null) {
- try {
- int i = parseInt(integerCacheHighPropValue);
- i = Math.max(i, 127);
- // Maximum array size is Integer.MAX_VALUE
- h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
- } catch( NumberFormatException nfe) {
- // If the property cannot be parsed into an int, ignore it.
- }
- }
- high = h;
- cache = new Integer[(high - low) + 1];
- int j = low;
- for(int k = 0; k < cache.length; k++)
- cache[k] = new Integer(j++);
- // range [-128, 127] must be interned (JLS7 5.1.7)
- assert IntegerCache.high >= 127;
- }
- private IntegerCache() {}
- }
再了解一下 Integer(Long同理)内部一些代码
- //Integer 值 是基本类型 int
- private final int value;
- //别急 结合后面发编译的代码看
- // Integer 赋值 首先会判断 是否是 -128 -127之间(缓存池)
- // 若没有 超出返回 才会 new 一个对象
- public static Integer valueOf(int i) {
- if (i >= IntegerCache.low && i <= IntegerCache.high)
- return IntegerCache.cache[i + (-IntegerCache.low)];
- return new Integer(i);
- }
- //别急 结合后面发编译的代码看
- public int intValue() {
- return value;
- }
- //euqals 方法
- public boolean equals(Object obj) {
- if (obj instanceof Integer) {
- return value == ((Integer)obj).intValue();
- }
- return false;
- }
首先 用反编译工具 打开 class文件 上下代码 结合思考一下
- import java.io.PrintStream;
- public class Test3
- {
- public static void main(String[] args)
- {
- Integer a = Integer.valueOf(1);
- Integer b = Integer.valueOf(2);
- Integer c = Integer.valueOf(3);
- Integer d = Integer.valueOf(3);
- Integer e = Integer.valueOf(321);
- Integer f = Integer.valueOf(321);
- Long g = Long.valueOf(3L);
- Long h = Long.valueOf(2L);
- Integer i = Integer.valueOf(127);
- Integer k = Integer.valueOf(128);
- //true c、d 取得都是缓存中的3那个对象
- System.out.println(c == d);
- // false 看一下 Integer 中 valueOf这个方法 e、f 会分别 new 一个对象
- System.out.println(e == f);
- /*** true 数值比较 initValue 方法 取的是 Integer 中 final变量 value的值
- int a =1;
- int b =2;
- int c =3
- a+b == c
- ***/
- System.out.println(c.intValue() == a.intValue() + b.intValue());
- // true 数值比较 同上
- System.out.println(k.intValue() == a.intValue() + i.intValue());
- //true equals比较的是数值
- System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));
- //true 数值比较
- System.out.println(g.longValue() == a.intValue() + b.intValue());
- //false Long.equals()首先会判断 传入是否为Long对象 不是 Long !=Integer (a+b自动装箱的是Integer类型)
- System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));
- // true 了解一下 自动装箱 (Integer +Long) 会转为Long (注意Long也是存在 缓存的 -128 -127)
- System.out.println(g.equals(Long.valueOf(a.intValue() + h.longValue())));
- Integer a1 = new Integer(1);
- Integer b1 = new Integer(1);
- System.out.println("----" + (a1 == b1)); //new 出来的对象 地址不同
- }
- }
java --Integer 学习的更多相关文章
- Java多线程学习(转载)
Java多线程学习(转载) 时间:2015-03-14 13:53:14 阅读:137413 评论:4 收藏:3 [点我收藏+] 转载 :http://blog ...
- Java Web学习系列——Maven Web项目中集成使用Spring
参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Android(java)学习笔记267:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Android(java)学习笔记206:利用开源SmartImageView优化网易新闻RSS客户端
1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的 国内我们经常用到htt ...
- Android(java)学习笔记205:网易新闻RSS客户端应用编写逻辑过程
1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...
- Android(java)学习笔记216:多线程断点下载的原理(Android实现)
之前在Android(java)学习笔记215中,我们从JavaSE的角度去实现了多线程断点下载,下面从Android角度实现这个断点下载: 1.新建一个Android工程: (1)其中我们先实现布局 ...
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...
- Java开发学习心得(二):Mybatis和Url路由
目录 Java开发学习心得(二):Mybatis和Url路由 1.3 Mybatis 2 URL路由 2.1 @RequestMapping 2.2 @PathVariable 2.3 不同的请求类型 ...
随机推荐
- Django模板标签
一.模板标签 1.模板标签是在模板中运用python语言的实现,如for循环,if语句 2.模板标签的运用 2.1在teacher模板下创建students_list模板, 在teacher视图中国创 ...
- easyUI dialog打开对话框,显示列表数据,选取一条数据操作后赋值给父窗口 resultMap声明为全局,生成getset方法
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" ...
- ps修改图片文字
原图(机密内容以打马赛克): 需要修改的地方: 1.去除蓝色的线条, 2.改表格的字体 操作: 1.去线条 放大图片,使用魔棒工具选中蓝色点,调节容差,取消连续,然后填充白色,ctrl+delete ...
- android-音量管理
推荐简书夕月风: 前两个主要设计音频建设置流程. 一.https://www.jianshu.com/p/a48fc2c830da 二.https://www.jianshu.com/p/892761 ...
- _ZNote_Qt_重启软件
原文: http://wiki.qt.io/How_to_make_an_Application_restartable int main(int argc, char** argv) { QAppl ...
- Debian 8下手工安装 Eclipse CDT neon.2
从 http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/neon2 下载 eclipse-cpp-neon-2-li ...
- 6 week work 3
sticky vs fixed sticky:表示粘贴到某个位置.当组件设置了该属性值后,当页面滑动时,组件会跟着页面移动,当组件触及到窗体后,页面若继续滑动,组件则处在与窗体接触的位置不动.元素的定 ...
- RabbitMQ 适用于云计算集群的远程调用(RPC)
在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成.那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会 ...
- ORACLE提交事务回滚
execute执行后 可以回滚 commit提交后 闪回恢复原来的数据 其实Oracle提交数据是分两步操作的,第一步execute执行,第二步commit提交.对应的PL\SQL也是要先点execu ...
- PHP+XML写注册登录
2018/12/06 今天尝试了下PHP 使用PHP+XML写注册登录 具体保存于上传的文件中 从此山水不相逢 莫问他人长与短