深入理解java中的自动装箱与拆箱[通俗易懂]

本文由java语言入门栏目为大家推荐,文中通过详细实例为大家深入讲解了java中的自动装箱与拆箱的相关知识,希望可以帮助到大家。装箱是把基本数据类型转换为包装类,拆箱是把包装类转换为基本数据类型。

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

深入理解java中的自动装箱与拆箱[通俗易懂]

一、什么是装箱,什么是拆箱

装箱:把基本数据类型转换为包装类。

拆箱:把包装类转换为基本数据类型。

基本数据类型所对应的包装类:

int(几个字节4)- Integer

byte(1)- Byte

short(2)- Short

long(8)- Long

float(4)- Float

double(8)- Double

char(2)- Character

boolean(未定义)- Boolean

免费在线视频学习教程推荐:java视频教程

二、先来看看手动装箱和手动拆箱

例子:拿int和Integer举例

Integer i1=Integer.valueOf(3);
int i2=i1.intValue();

手动装箱是通过valueOf完成的,大家都知道 = 右边值赋给左边,3是一个int类型的,赋给左边就变成了Integer包装类。

手动拆箱是通过intValue()完成的,通过代码可以看到 i1 从Integer变成了int

三、手动看完了,来看自动的

为了减轻技术人员的工作,java从jdk1.5之后变为了自动装箱与拆箱,还拿上面那个举例:

手动:

Integer i1=Integer.valueOf(3);
int i2=i1.intValue();

自动

Integer i1=3;
int i2=i1;

这是已经默认自动装好和拆好了。

四、从几道题目中加深对自动装箱和拆箱的理解

(1)

Integer a = 100;
int b = 100;
System.out.println(a==b);结果为 true

原因:a 会自动拆箱和 b 进行比较,所以为 true

(2)

Integer a = 100;
Integer b = 100;
System.out.println(a==b);//结果为true
Integer a = 200;
Integer b = 200;
System.out.println(a==b);//结果为false

这就发生一个有意思的事了,为什么两个变量一样的,只有值不一样的一个是true,一个是false。

原因:这种情况就要说一下 == 这个比较符号了,== 比较的内存地址,也就是new 出来的对象的内存地址,看到这你们可能会问这好像没有new啊,但其实Integer a=200; 200前面是默认有 new Integer的,所用内存地址不一样 == 比较的就是 false了,但100为什么是true呢?这是因为 java中的常量池 我们可以点开 Integer的源码看看。

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;
    }

在对 -128到127 之间的进行比较时,不会new 对象,而是直接到常量池中获取,所以100是true,200超过了这个范围然后进行了 new 的操作,所以内存地址是不同的。

(3)

Integer a = new Integer(100);
Integer b = 100;
System.out.println(a==b);
//结果为false

这跟上面那个100的差不多啊,从常量池中拿,为什么是false呢?

原因:new Integer(100)的原因,100虽然可以在常量池中拿,但架不住你直接给new 了一个对象啊,所用这俩内存地址是不同的。

(4)

Integer a = 100;
Integer b= 100;
System.out.println(a == b);
//结果true
a = 200;
b = 200;
System.out.println(c == d);
//结果为false

原因:= 号 右边值赋给左边a,b已经是包装类了,200不在常量池中,把int 类型200 赋给包装类,自动装箱又因为不在常量池中所以默认 new了对象,所以结果为false。

更多相关文章教程可以访问:java语言入门

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120810.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月17日 上午6:00
下一篇 2022年1月17日 上午6:00


相关推荐

  • CSS 清除浮动原理详解

    CSS 清除浮动原理详解CSS 清除浮动原理详解一 浮动 floatfloat 属性的本质是用来实现文字环绕效果的 它有一个很大的副作用 会导致父容器的高度坍塌疑问 那么将父容器固定高度有用吗 没用 因为只要浮动元素的区域超过了这个高度 依旧会出现环绕效果影响布局那么怎么解决这个问题呢 清除浮动方法很多 但本质上只有两种方法使用 clear 清除浮动形成 BFC1 1 使用 clear 清除浮动 cle

    2026年3月18日
    2
  • java中hashmap的实现原理与底层数据结构

    java中hashmap的实现原理与底层数据结构Hashmap是java面试中经常遇到的面试题,大部分都会问其底层原理与实现,本人也是被这道题问惨了,为了能够温故而知新,特地写了这个博客,以便时时学习。Hash结构HashMap根据名称可知,其实现方法与Hash表有密切关系。在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能。数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给…

    2022年5月19日
    31
  • oracle隐式转换和显式转换_oracle显示游标和隐式

    oracle隐式转换和显式转换_oracle显示游标和隐式和其他的关系型数据库一样,oracle中也能进行一些隐式的数据转换,这对我们写SQL语句有非常用,我们可以不必麻烦地手动转化很多类型的字符。虽然前面我们介绍了一些使用例如to_char,to_date的函数进行强制转换的方法,但是隐式转换也还是不错的。Orac和其他的关系型数据库一样,oracle中也能进行一些隐式的数据转换,这对我们写SQL语句有非常用,我们可以不必麻烦地手动转化很…

    2022年10月11日
    7
  • python保存图片的常用方法

    保存图片的常用方法1.PIL的保存图片方法path=r”./001.jpg”#图片路径img=Image.open(path)#打开图片img.save(“1.jpg”)#将图片保存为1.jpg2.opencv保存图片path=r”./001.jpg”#图片路径#img=cv.imdecode(np.fromfile(“动漫人物_0.jpg”,np.uint8))#含有中文路径的图片打开img=cv2.imread(path)#读

    2022年4月4日
    60
  • 一下uefi+gpt引导的方式安装win7+win10双系统教程

    一下uefi+gpt引导的方式安装win7+win10双系统教程

    2026年3月16日
    2
  • idea 集成svn_idea从svn拉代码

    idea 集成svn_idea从svn拉代码IDEA集成SVN代码管理常用功能

    2022年10月17日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号