我们都知道Integer是int的封装类,提供了一些类型转换等工具方法,有一个-128-127的缓存,而且是final的。
-----------------------------
干货:
Integer是final 的,因此对Integer的操作返回的都是另一个新对象,而不是修改原来的值。
Integer的值存在value属性中,Integer的hashcode就是value值。
Integere重写了quals方法,equals()是比较value值,而不是Object的比较地址。
Integer在进行运算,跟int进行==比较时会进行自动拆箱,因此在for循环中进行叠加运算是不太合适的(频繁拆箱影响效率),应换为其它数据类型。
缓存部分看如下代码:
-----------------------------
关于缓存,看代码(jdk8):
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类中有一个IntegerCache静态内部类,这个类在初始化的时候构造了一个涵盖区间为-128-127的Integer数组,该数组为static final的。
Integer的valueOf()方法是将非Integer的数值转换为Integer:
valueOf的源码:
先判断给定的值是否在缓存区间,是直接返回缓存中的值,否则new一个新的。另外几个重载的valueOf()方法也是通过这个valueOf实现的。
Integer的自动装箱跟拆箱就是通过这个valueOf()来实现的,因此:
Integer a = 127;
Integer aa = 127;
Integer b = 128;
Integer bb = 128;
System.out.println(a == aa);//true
System.out.println(b == bb);//false
两者结果不同,原因是127在调用valueOf的时候发现在区间内会返回同一个对象,而超过127则new一个Integer,所以b跟bb是堆中的两个对象,一次为false。
需要注意的是跟int比较的时候Integer会自动拆箱为int:
int a = 128;
Integer aa = 128;
System.out.println(a == aa);//true
频繁拆箱造成性能损耗的例子:
Integer sum = 0;
for(int i=1000; i<5000; i++){
sum+=i;
}

Integer代码分析的更多相关文章

  1. lighttpd与fastcgi+cgilua原理、代码分析与安装

    原理 http://www.cnblogs.com/skynet/p/4173450.html 快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关 ...

  2. Cppcheck 1.54 C/C++静态代码分析工具

    Cppcheck是一个C/C++代码分析工具,只检测那些编译器通常无法检测到的bug类型.   官方上建议让编译器提供尽量多的警告提示:1.使用Visual C++的话,应使用警告等级4 2.使用GC ...

  3. Hive metastore整体代码分析及详解

    从上一篇对Hive metastore表结构的简要分析中,我再根据数据设计的实体对象,再进行整个代码结构的总结.那么我们先打开metadata的目录,其目录结构: 可以看到,整个hivemeta的目录 ...

  4. Thrift 代码分析

    Thrift的基本结束 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过IDL(Interface Definiti ...

  5. java 导入Excel -- 套路及代码分析

    一.思路分析 1.我们要做导入,实际上也就是先文件上传,然后读取文件的数据. 2.我们要有一个导入的模板,因为我们导入的Excel列要和我们的数据字段匹配上,所以我们要给它来一个规定,也就是模板. 3 ...

  6. jsencrypt代码分析——openssl的rsa加密解密在js的实现

    在js上做rsa,感觉jsencrypt这个是封装的比较好的,但用起来还是遇到了些坑,所以踩进代码里填填坑- 项目在这里 https://github.com/travist/jsencrypt [r ...

  7. ArrayList代码分析

    集合算是java中最常用的部分了,阅读该部分jdk代码可以让我们更加清楚的了解其实现原理,在使用时也能心中有数,有利于写出高质量的代码. ArrayList 底层数组实现,初始长度10,超过长度后的自 ...

  8. jsencrypt代码分析

    jsencrypt代码分析——openssl的rsa加密解密在js的实现   在js上做rsa,感觉jsencrypt这个是封装的比较好的,但用起来还是遇到了些坑,所以踩进代码里填填坑- 项目在这里  ...

  9. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

随机推荐

  1. jQuery 基础 : 获取对象 根据属性、内容匹配, 还有表单元素匹配

    指定元素中包含 id 属性的, 如: $("span[id]")   <span id="span1" name="S1">AA ...

  2. Ubuntu中安装LAMP

    现在,很多人可能已经用上ubuntu了,大家可能花了大量时间在ubuntu的美化上,这无可厚非,但是,ubuntu应该给我们的工作和学习带来更多的便利和方便.ubuntu作为linux,为我们提供了强 ...

  3. adb 无法调试的问题,ADB server didn't ACK,* failed to start daemon *

    The connection to adb is down, and a severe error has occured. You must restart adb and Eclipse. Ple ...

  4. 【bzoj2751】[HAOI2012]容易题(easy) 数论-快速幂

    [bzoj2751][HAOI2012]容易题(easy) 先考虑k=0的情况 那么第一个元素可能为[1,n] 如果序列长度为m-1时的答案是ans[m-1] 那么合并得 然后同理答案就是 k很小 而 ...

  5. 转载 javaweb三大框架和MVC设计模式 (自己加拉些内容)

    javaweb三大框架和MVC设计模式 一.MVC设计模式 1.MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基 ...

  6. SP705 SUBST1 - New Distinct Substrings

    \(\color{#0066ff}{ 题目描述 }\) 给定一个字符串,求该字符串含有的本质不同的子串数量. \(\color{#0066ff}{输入格式}\) T- number of test c ...

  7. 线段树 SP1043 GSS1 - Can you answer these queries I

    SP1043 GSS1 - Can you answer these queries I 题目描述 给出了序列A[1],A[2],-,A[N]. (a[i]≤15007,1≤N≤50000).查询定义 ...

  8. MySQL中join的用法

    近期用phpcms v9做项目,初期没有问题,后期随着数据量的增大,phpcms v9后台出现的栏目更新不动的情况,初期我以为是程序的问题,进行了程序排查,没有发现任何问题,登录上centos服务器后 ...

  9. maven 项目 配置docker镜像生成(dockerfile-maven-plugin)

    插件地址:https://github.com/spotify/dockerfile-maven 依github上备注,只要在项目根上录上编写dockerfile,然后引用插件即可 编写Dockerf ...

  10. java背包的数组实现,链表实现

    数组实现 package base.structure; import java.lang.reflect.Array; import java.util.Iterator; /** * @progr ...