我是靠谱客的博主 神勇微笑,最近开发中收集的这篇文章主要介绍java自动拆装箱过程中的底层原理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一·:先简单引一下自动拆装箱

 Integer integer=new Integer(100);//手动装箱
Integer integer=100;
//自动装箱
Integer integer=new Integer(100);
int i=integer.intValue(); //手动拆箱
int i1=integer;
//自动拆箱

 

 二:本文的重点不是自动拆装箱,而是一些经常遇到的问题。

     (1):空指针问题。

package day_08;
public class student {
public static void main(String[] args) {
Integer integer=null;
//空指针赋给了integer的应用,这里的空指针会导致自动拆箱的函数没法被调用,所以下面就会报错
integer+=300;
//报错信息为:NullPointerException
System.out.println(integer);
}
}

(2)装箱后的对象地址问题。

     先来看一段代码:


Integer integer1=100;
Integer integer2=100;
System.out.println(integer1==integer2);//true
Integer integer3=200;
Integer integer4=200;
System.out.println(integer3==integer4);//false

这里我们会很疑问,为什么同样都是数字,反而出现了两种不同的情况呢?只有一种情况,那就是范围问题。

诚然,确实是范围的原因:

 在Integer的构造函数中,它分两种情况: 

1、i >= 128 || i < -128 =====> new Integer(i)    
2、i < 128 && i >= -128 =====> SMALL_VALUES[i + 128]  //在java中,为了提高效率,系统以及预先划定了一个数组,我们不妨形象的称之为常量池

        在-128到128内,系统预先建立了一个常量池,如果装箱的数据在此范围内的话,就直接用这个常量池中的数据,这就避免了当装箱数据相同时时的对象重复建立问题,(根据我们所学,不管在哪门语言中,内存都是寸土寸金的,能少用就少用。)但是在-128到128这个范围之外数字太多了,系统不可能把每一个数字都放入常量池,只能碰到一个就建立一个新对象。对于java系统来讲,根据不同的范围的数据选取不同的构造方法,这种方法是效率最高的。

上述只是Integer的情况,其他包装数据类型哪?是否都是和Integer情况一样那?

 显然不是:我们从系统这样设计的目的入手就不难理解了,Double表示小数,拿上面的-128到128范围来讲,这个范围内小数比整数要多的多,所以再像Integer那样建个常量池的话就太耗内存了。所以就Double的构造函数就选择了碰着一个数就建立一个新对象的方法。

Double d1=100.0;
Double d2=100.0;
System.out.println(d1==d2); //false

但是另一个极端就是布尔类型,因为可选择的范围很少,所以系统选择直接放入常量池。

 Boolean i1 = false;
Boolean i2 = false;
Boolean i3 = true;
Boolean i4 = true;
System.out.println(i1==i2);//true
System.out.println(i3==i4);//true

 

最后

以上就是神勇微笑为你收集整理的java自动拆装箱过程中的底层原理的全部内容,希望文章能够帮你解决java自动拆装箱过程中的底层原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部