学习JDK源码(二):Integer

最近没有好好保持学习的好习惯,该打。

天天忙,感觉都不知道在干嘛。真的厌倦了普通的Java代码,还是想学点新技术。

用了这么久的Java,最常用的数据类型肯定是Int了,而他的包装类Integer用的其实也不少。但是问问我们自己,当我们创建一个数字对象时,你们是直接new int x =1的多吧,或者说用new Integer(1),其实这样写的已经就很少了,我就没怎么这么写过。直到最近,我才知道一个能提升性能的方法Integer.valueOf(1),他可以使用系统缓存,既能减少可能的内存占用,也省去了频繁创建对象的开销。

1 public static Integer valueOf(int i) {
2     assert IntegerCache.high >= 127;
3     if (i >= IntegerCache.low && i <= IntegerCache.high)
4         return IntegerCache.cache[i + (-IntegerCache.low)];
5     return new Integer(i);
6 }  

看下上面的valueOf的源码,关键在于return那里,其实这里看不出什么,再往深层看:

 1 private static class IntegerCache {
 2     static final int low = -128;
 3     static final int high;
 4     static final Integer cache[];
 5
 6     static {
 7         // high value may be configured by property
 8         int h = 127;
 9         String integerCacheHighPropValue =
10             sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
11         if (integerCacheHighPropValue != null) {
12             int i = parseInt(integerCacheHighPropValue);
13             i = Math.max(i, 127);
14             // Maximum array size is Integer.MAX_VALUE
15             h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
16         }
17         high = h;
18
19         cache = new Integer[(high - low) + 1];
20         int j = low;
21         for(int k = 0; k < cache.length; k++)
22             cache[k] = new Integer(j++);
23     }
24
25     private IntegerCache() {}
26 }  

它为 -128 ~ 127 数值提供自动装箱的缓存服务,明显速度能有提升

static 静态代码块可知缓存的初始化是在第一次使用的时候。 通过 VM 参数-XX:AutoBoxCacheMax=<size> 可以配置缓存的最大值。 在 VM 初始化期间, 缓存最大值 high, 可能被保存在 sun.misc.VM class 的私有系统属性里。

原文地址:https://www.cnblogs.com/timePasser-leoli/p/8244652.html

时间: 2024-10-23 03:15:52

学习JDK源码(二):Integer的相关文章

JDK源码分析-Integer

Integer是平时开发中最常用的类之一,但是如果没有研究过源码很多特性和坑可能就不知道,下面深入源码来分析一下Integer的设计和实现. Integer: 继承结构: -java.lang.Object --java.lang.Number ---java.lang.Integer 其中父类Number是个抽象类,是所有数字类型相关的类的父类,例如Double.Float.Integer.Long 和 Short. Integer类还实现了Comparable接口用以比较两个Integer的

JDK 源码解析 —— Integer

零. 简介 对于 Integer 这个 Java 程序员几乎天天使用的类, 使用上却可以看出普通程序员和优秀程序员区别. 一. 深入代码 在创建数字 1 的对象时, 大多数人会使用 new Integer(1), 而使用 Integer.valueOf(1) 可以使用系统缓存,既减少可能的内存占用,也省去了频繁创建对象的开销. 系统默认只缓存 -128-127 之间的整数.下面我们看一下 Integer.valueOf(int) 方法的代码: public static Integer valu

学习JDK源码(一):String

用了好久的Java了,从来没有看过jdk的源码,趁着今天有点时间,拿出了jdk的源码看了下,今天先看了关于String的,毕竟开发中String类型使用最广泛.在我们下载安装jdk的时候,部分源码也已经同时存放在我们电脑里了,具体路径为jdk目录下的src.zip压缩包,解压即可. java.lang.String 1 public final class String 2 implements java.io.Serializable, Comparable<String>, CharSeq

JDK源码学习--String篇(二) 关于String采用final修饰的思考

JDK源码学习String篇中,有一处错误,String类用final[不能被改变的]修饰,而我却写成静态的,感谢CTO-淼淼的指正. 风一样的码农提出的String为何采用final的设计,阅读JDK源码的时候,有粗略的思考过,今天下班后又把<Thinking in Java>中关于final的内容重新看了一遍,对此写下一些关于自己的理解和想法. String类中final关键字的使用 final关键字,用来描述一块数据不能被改变,两种可能理由:设计.效率 final使用的三种情况:数据.方

由JDK源码学习HashMap

HashMap基于hash表的Map接口实现,它实现了Map接口中的所有操作.HashMap允许存储null键和null值.这是它与Hashtable的区别之一(另外一个区别是Hashtable是线程安全的).另外,HashMap中的键值对是无序的.下面,我们从HashMap的源代码来分析HashMap的实现,以下使用的是Jdk1.7.0_51. 一.HashMap的存储实现 HashMap底层采用的是数组和链表这两种数据结构.当我们把key-value对put到HashMap时,系统会根据ha

JDK源码学习LinkedList

LinkedList是List接口的子类,它底层数据结构是双向循环链表.LinkedList还实现了Deque接口(double-end-queue双端队列,线性collection,支持在两端插入和移除元素).所以LinkedList既可以被当作双向链表,还可以当做栈.队列或双端队列进行操作.文章目录如下: 1.LinkedList的存储实现(jdk 1.7.0_51) 2.LinkedList的读取实现 3.LinkedList的性能分析 下面我们进入正题,开始学习LinkedList. L

学习和查看jdk源码

作为一个java从业人员,学习和查看jdk源码应该是要的. 下面介绍一下查看的方法: 法一:链接源码路径,但src.zip不全,只能查看部分源码. 教程URL: http://blog.csdn.net/bruce128/article/details/6887732 http://zhidao.baidu.com/link?url=QCJlelxsz7ssyFgz0gxif30XW8lAeQaR3ClGxihewSt2Eu2w5h6bwsQh3lWBf4Bv2n3g-W3OaTa2x_vvW9

由JDK源码学习ArrayList

ArrayList是实现了List接口的动态数组.与java中的数组相比,它的容量能动态增长.ArrayList的三大特点: ① 底层采用数组结构 ② 有序 ③ 非同步 下面我们从ArrayList的增加元素.获取元素.删除元素三个方面来学习ArrayList. ArrayList添加元素 因为ArrayList是采用数组实现的,其源代码比较简单.首先我们来看ArrayList的add(E e).以下代码版本是jdk7. public boolean add(E e) { // 检查数组容量 e

JDK源码学习系列07----Stack

                                                               JDK源码学习系列07----Stack 1.Stack源码非常简单 package java.util; public class Stack<E> extends Vector<E> { // 版本ID.这个用于版本升级控制,这里不须理会! private static final long serialVersionUID = 122446316454