java基础解析系列(二)---Integer

时间:2022-08-29 08:59:44

java基础解析系列(二)---Integer

前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bug的时候,才能处理更加从容。

目录

自动装箱和拆箱

  • 装箱就是自动将基本数据类型装换为包装器类型,拆箱就是自动将包装器类型转换为基本数据类型。
Integer i=666;//装箱
int n=i;//拆箱

分析

    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,IntegerCache里面维护一个Integer类型的数组,默认情况下缓存-128到127的Integer对象
  • 缓存的范围可以通过-XX:AutoBoxCacheMax=size参数来设置
  • 注意缓存策略只有只有在装箱的时候起作用

实验一

public static void main(String[] args) {
Integer i1=new Integer(127);
Integer i2=new Integer(127);
System.out.println(i1==i2);
//false
}
  • 实验表明通过new来创建的对象,因为是在堆中的两个空间,所以显然是不同的

实验二

public static void main(String[] args) {
Integer i1=127;
}
  • 对其进行反汇编

java基础解析系列(二)---Integer

  • 实验表明自动装箱的效果等效于调用Integer的valueOf方法
 public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
  • 通过源码发现,当i处于缓存的范围内的时候,使用的缓存的cache数组中的对象,超出范围后,是创建一个新的对象

实验三

public static void main(String[] args) {
Integer i1=127;
Integer i2=127;
System.out.println(i1==i2);
//true }
  • 实验表明通过自动装箱的情况下,i1==i2,也就是指向的是同一个对象

实验四

public static void main(String[] args) {
Integer i1=Integer.valueOf(127);
Integer i2=127;
System.out.println(i1==i2);
//true
}
  • 实验表明,自动装箱的效果和valueOf方法效果一致

实验五

 public static void main(String[] args) {
Integer i1=128;
Integer i2=128;
System.out.println(i1==i2);
//false
}
  • 实验表明当超出范围后,会重新创建对象

实验六

// -XX:AutoBoxCacheMax=128
public static void main(String[] args) {
Integer i1=128;
Integer i2=128;
System.out.println(i1==i2);
//true
}
  • 实验表明,AutoBoxCacheMax可以设置Integer的缓存范围的最大值

实验7

 public static void main(String[] args) {
Integer sum = 0;
sum=sum+128;
}

java基础解析系列(二)---Integer

  • 通过反汇编,发现在相加的时候,Integer会进行拆箱(intValue()),相加后,然后再进行装箱(valueOf())

实验八

public static void main(String[] args) {
t1();
t2(); } public static void t1() {
Long start = System.currentTimeMillis();
Integer sum = 0;
for (int i = 130; i < 1000000; i++) {
sum = sum + i;
}
System.out.println(System.currentTimeMillis() - start);
} public static void t2() {
Long start = System.currentTimeMillis();
int sum = 0;
for (int i = 130; i < 1000000; i++) {
sum = sum + i;
}
System.out.println(System.currentTimeMillis() - start);
}
// 输出 10 3
  • 实验表明,通过Integer进行相加效率更慢,因为每一次循环,Integer会进行自动装箱自动拆箱,超出范围后每次装箱的时候还会重新创建对象,所以即消耗空间又消耗时间

我觉得分享是一种精神,分享是我的乐趣所在,不是说我觉得我讲得一定是对的,我讲得可能很多是不对的,但是我希望我讲的东西是我人生的体验和思考,是给很多人反思,也许给你一秒钟、半秒钟,哪怕说一句话有点道理,引发自己内心的感触,这就是我最大的价值。(这是我喜欢的一句话,也是我写博客的初衷)

作者:jiajun 出处: http://www.cnblogs.com/-new/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。

java基础解析系列(二)---Integer的更多相关文章

  1. java基础解析系列&lpar;四&rpar;---LinkedHashMap的原理及LRU算法的实现

    java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...

  2. java基础解析系列&lpar;五&rpar;---HashMap并发下的问题以及HashTable和CurrentHashMap的区别

    java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 目录 java基础解析系列(一)---String.StringBuffer.St ...

  3. java基础解析系列&lpar;六&rpar;---深入注解原理及使用

    java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer ja ...

  4. java基础解析系列&lpar;七&rpar;---ThreadLocal原理分析

    java基础解析系列(七)---ThreadLocal原理分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)-- ...

  5. java基础解析系列&lpar;八&rpar;---fail-fast机制及CopyOnWriteArrayList的原理

    fail-fast机制及CopyOnWriteArrayList的原理 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列( ...

  6. java基础解析系列&lpar;九&rpar;---String不可变性分析

    java基础解析系列(九)---String不可变性分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---In ...

  7. java基础解析系列&lpar;十&rpar;---ArrayList和LinkedList源码及使用分析

    java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder jav ...

  8. java基础解析系列&lpar;十一&rpar;---equals、&equals;&equals;和hashcode方法

    java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系 ...

  9. java基础解析系列&lpar;六&rpar;---注解原理及使用

    java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及 ...

随机推荐

  1. &period;NET相关操作其他文件的小程序(系列文章)

    平时自诩为使用.NET做开发,但是实际上从一开始学习C#直到现在除了做个几个不登大雅之堂的小网站,做过几个winform程序和几个控制台应用程序,真的没有踏踏实实地用.NET开发过某些属于自己的东西. ...

  2. 去掉谷歌浏览器获取焦点时默认的input、textarea的边框和背景

    去掉chrome(谷歌)浏览器默认的input.textarea的边框(border)和背景(background) 及chrome下不可更改textarea大小 1.使用Chrome的都知道,当鼠标 ...

  3. start bbs轻论坛安装时数据库提示错误

    A PHP Error was encounteredSeverity: NoticeMessage: Only variable references should be returned by r ...

  4. Unity-Animator深入系列---剪辑播放后位置预判&lpar;Animator&period;Target&rpar;

    回到 Animator深入系列总目录 animator.SetTarget(...);可以在播放前预判剪辑播放后的位置,但只限于人形动画 参数1是预判的关节,参数2是映射的剪辑时间 调用后通过targ ...

  5. MongoDB查询语法

    mongoDb是非关系型数据库,用习惯了mssql,mysql等数据库的需要转换一下思维 mongoDb存的是与js的json结构一样的文档,表中的每一条记录都可以结构不同 1,大于,小于,大于等于, ...

  6. GNOME与KDE的战争

    目录1 序言2 GNOME与KDE交替发展% M" O/ h% R( b  f, ~7 W' n9 V, G3 GNOME获得商业公司的支持4 KDE3.5可实现半透明和阴影效果,界面华丽. ...

  7. Windows Azure VM的两种shut down 方式

    今天在调查Azure的价格时,发现下面的语句,来自http://azure.microsoft.com/en-us/pricing/details/virtual-machines/ * If my ...

  8. 转场动画1-Push 动画

    先上效果图: 这篇文章完全是为造*制作:原作者是码农界的吴彦祖 作者视频下载地址 好的,我梳理一下思路: 理清思路 ||转场动画可以理解为一个对象,在这个对象里封装了一个动画.具体的我们跟着代码走 ...

  9. objective-C学习笔记(九)ARC

    ARC叫自动引用计数Automatic Reference Counting.针对堆上的对象,管理对象的创建和释放. 哪些对象受ARC管理: OC对象指针 Block指针 使用_attribute_( ...

  10. POPTEST老李推荐:互联网时代100本必读书&comma;来自100位业界大咖推荐 2

    ➤NO.30<移动的力量>[推荐人]刘九如:电子工业出版社副社长兼总编辑邬贺铨:中国工程院院士.原副院长汪力成:华立集团董事局主席➤NO.31<智慧社会>[推荐人]段永朝:财讯 ...