一、装箱、拆箱定义

如果一个int型量被传递到需要一个Integer对象的地方,那么,编译器将在幕后插入一个对Integer构造方法的调用,这就叫做自动装箱。而如果一个Integer对象被放到需要int型量的地方,则编译器将幕后插入一个队intValue方法的调用,这就叫做自动拆箱。

public static voidmain(String[] args) {//装箱

Integer i1 = Integer.valueOf(1);//自动装箱

Integer i2 = 1;//默认执行valueOf(1);

System.out.println(i1 == i2);//true

//自动拆箱

int i3 =i1.intValue();int i4 =i2.intValue();

System.out.println(i3== i4);//true

//超出Integer的缓存范围,不从私有静态内部类IntegerCache的数组cache中获得,通过new返回新对象

Integer i5 = 128;

Integer i6= -129;

Integer i5_1= 128;

Integer i6_1= -129;

System.out.println(i5== i5_1);//false

System.out.println(i6 == i6_1);//false

}

所以说,对于-127~127之间的值,Integer对象中存在一个IntegerCache的私有静态内部类,这个内部类有一个Integer类型的静态常量数组,在这个内部类中通过静态方法块,初始化了这个静态常量数组。默认这个数组保存[-127,128)之间的Integer对象。源码如下:

1 private static classIntegerCache {2 static final int low = -128;3 static final inthigh;4 static finalInteger 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 try{13 int i =parseInt(integerCacheHighPropValue);14 i = Math.max(i, 127);15 //Maximum array size is Integer.MAX_VALUE

16 h = Math.min(i, Integer.MAX_VALUE - (-low) -1);17 } catch( NumberFormatException nfe) {18 //If the property cannot be parsed into an int, ignore it.

19 }20 }21 high =h;22

23 cache = new Integer[(high - low) + 1];24 int j =low;25 for(int k = 0; k < cache.length; k++)26 cache[k] = new Integer(j++);27

28 //range [-128, 127] must be interned (JLS7 5.1.7)

29 assert IntegerCache.high >= 127;30 }31

32 privateIntegerCache() {}33 }

通过下面的源码可以知道,为什么Integer i = 128;与Integer y = 128;,通过==比较的结果为false。如果要赋值的int变量在范围内,则返回数组中的对象给Integer,如果不在,则通过带参构造方法,new一个新的Integer对象。

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

二、其它包装类型

The Java Language Specification, 3rd Edition 写道:

为了节省内存,对于下列包装对象的两个实例,当它们的基本值相同时,他们总是==:

Boolean :全部缓存

Byte :全部缓存

Character : <=127缓存

Short : (-128,127)缓存

Long : (-128,127)缓存

Float : (没有缓存)

Double : (没有缓存)

其中Character的缓存源码:

1   private static classCharacterCache {2 privateCharacterCache(){}3

4 static final Character cache[] = new Character[127 + 1];5

6 static{7 for (int i = 0; i < cache.length; i++)8 cache[i] = new Character((char)i);9 }10 }

其中Float没有缓存,直接返回源码:

1   public static Float valueOf(String s) throwsNumberFormatException {2 return newFloat(parseFloat(s));3 }

三、用处

除了包装类提供了额外的方法外,当使用集合框架时,泛型为Object类型,所以如果声明为List list...,则这样是不行的,必须声明为List list...。

四、存储的位置

因为是对象,所以存储在堆中。

java 拆箱_Java自动装箱拆箱相关推荐

  1. java 自动装箱拆箱_java——自动装箱拆箱

    讲一下JDK 5 引入的自动装箱与拆箱 自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使 ...

  2. java装箱和拆箱_java自动装箱和拆箱

    这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱 ...

  3. java基础--06(自动装箱拆箱)

    目录 1.自动装箱,自动拆箱 1.自动装箱,自动拆箱 装箱就是自动将基本数据类型转换为包装器类型:拆箱就是 自动将包装器类型转换为基本数据类型. java的数据类型: 自动装箱: 最主要的就是Inte ...

  4. java中为什么自动装箱拆箱_Java自动装箱和自动拆箱的理解

    Java自动装箱和自动拆箱的理解 1.代码 public class AutoBoxing { public static void main(String[] args) { Integer a = ...

  5. java 自动拆箱_Java 自动装箱 和 自动拆箱

    自动装箱:/** * 实际上,程序运行时,系统为我们执行了下面一条语句: * Integer number = new Integer(290); */ Integer number = 290; S ...

  6. Java 性能笔记:自动装箱/拆箱(转)

    如果我说"仅仅修改下面代码中的一个字符就可以获得五倍于当前的运行速度"你会怎么想呢? long t = System.currentTimeMillis(); Long sum = ...

  7. Java 性能笔记:自动装箱/拆箱

    如果我说"仅仅修改下面代码中的一个字符就可以获得五倍于当前的运行速度"你会怎么想呢? long t = System.currentTimeMillis(); Long sum = ...

  8. java 包装类缺点_Java 自动拆箱和自动装箱学习笔记

    Java 自动拆箱和自动装箱学习笔记 详情参考以下 1. 概述 Java 中的自动装箱和自动拆箱算是一种语法糖,也就是在编译阶段编译器在合适的情况下帮我们的做了自动拆箱和自动装箱. 众所周知,Java ...

  9. java 自动拆箱_Java中的自动装箱拆箱

    Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 //自动装箱 2 Integer total = 90; ...

最新文章

  1. python note
  2. 1、win10下连接本地系统上的Linux操作系统(分别以Nat方式和桥接模式实现)
  3. 在Tomcat下JSP、Servlet和JavaBean环境的配置
  4. 【一】Drupal 入门之新建主题
  5. EventFlow.helper.js 事件流程控制
  6. case --when
  7. 算法之美 : 位运算
  8. opencv4-图像操作
  9. 计算机网络及应用的说课稿,第一课计算机网络及应用说课稿
  10. Android中service的生命周期
  11. PowerDesigner的學習
  12. python发送邮件程序
  13. stm32系统时钟配置,标准库v3.5
  14. c语言局域网聊天,局域网聊天的程序(C++版)
  15. 斐讯K2 刷breed 再刷 固件 。
  16. cruzer php sandisk 闪迪u盘量产工具_sandisk cruzer 32G U盘量产工具下载
  17. python3抓取-双色球开奖的所有历史数据-2003年始
  18. 随机数生成器python_python安全开发军规之四:使用安全的随机数生成器
  19. 网吧客户信息查询c语言,网吧经营管理之客户定位
  20. 2019元旦消费大数据

热门文章

  1. multi-mechanize error: can not find test script: v_user.py问题
  2. 【整理】fiddler不能监听 localhost和 127.0.0.1的问题
  3. .NET4.0 之 Dynamic VS Refle“.NET研究”ction 效率
  4. ubuntu 安装fcitx输入法(3.6和4.0bate)
  5. JQuery 对控件的事件操作
  6. twitter数据分析_Twitter上最受欢迎的数据科学文章主题
  7. leetcode 959. 由斜杠划分区域(并查集)
  8. leetcode1219. 黄金矿工(回溯)
  9. 表达爱意的程序_如何像程序员一样表达爱意❤️
  10. vue.js 全局应用js_如何在不到7分钟的时间内测试您的Vue.js应用