Java 中有了基本类型为什么还需要包装类?

这篇具有很好参考价值的文章主要介绍了Java 中有了基本类型为什么还需要包装类?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

面试回答

Java 中有8种基本数据类型,这些基本类型又都有对应的包装类。

分类

基本数据类型

包装类

布尔型

boolean

Boolean

整型

byte

Byte

short

Short

int

Integer

long

Long

字符型

char

Character

浮点型

float

Float

double

Double

因为 Java 是一种面向对象语言,很多地方都需要使用对象而不是基本数据类型。比如,在集合类中,我们是无法将 int、double 等类型放进去的。因为集合的容器要求元素是 Object 类型。

为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

知识扩展

基本类型和包装类型的区别

  1. 默认值不同,基本类型的默认值为0,false或\u0000等,包装类默认为 null
  2. 初始化方式不同,一个需要new,一个不需要
  3. 存储方式不同,基本类型保存在栈上,包装类对象保存在堆上(通常情况下,在没有JIT优化栈上分配时)

如何理解自动拆装箱

拆箱与装箱

包装类是对基本类型的包装,所以,把基本数据类型转换成包装类的过程就是装箱;反之,把包装类转换成基本数据类型的过程就是拆箱

自动拆装箱

在 Java SE5 中,为了减少开发人员的工作,Java 提供了自动拆箱和自动装箱的功能。

自动装箱:就是将基本数据类型自动转换成对应的包装类。

自动拆箱:就是将包装类自动转换为对应的基本数据类型。

        Integer i=1; //自动装箱
        int x=i;     //自动拆箱

自动拆装箱原理

自动装箱都是通过包装类的 valueOf() 方法来实现的。自动拆箱都是通过包装类对象的 xxxValue() 来实现的。

如:int 的自动装箱都是通过 Integer.valueOf() 方法来实现的,Integer 的自动拆箱都是通过 integer.intValue() 来实现的。

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

    public int intValue() {
        return value;
    }

哪些地方会自动拆装箱

我们了解原理之后,再看一下,什么情况下,Java 会帮我们进行自动拆装箱。前面提到的变量的初始化和赋值的场景就不介绍了,那是最简单的也最容易理解的。

我们主要来看一下,那些可能被忽略的场景。

场景一:将基本数据类型放入集合类

我们知道,Java 中的集合类只能接收对象类型,那么以下代码为什么会不报错呢?

    List<Integer> list=new ArrayList<>();
    for (int i = 0; i < 50; i++) {
        list.add(i);
    }

将上面代码进行反编译,可以得到以下代码:

    List<Integer> list=new ArrayList<>();
    for (int i = 0; i < 50; i++) {
        list.add(Integer.valueOf(i));
    }

以上,我们可以得出结论,当我们把基本数据类型放入集合类中的时候,会进行自动装箱。

场景二:包装类型和基本类型的大小比较

有没有人想过,当我们对 Integer 对象与基本类型进行大小比较的时候,实际上比较的是什么内容呢?看一下代码:

    Integer a=1;
    System.out.println(a==1?"等于":"不等于");
    Boolean bool=false;
    System.out.println(bool?"真":"假");

对以上代码进行反编译,得到一下代码:

    Integer a=1;
    System.out.println(a.intValue()==1?"等于":"不等于");
    Boolean bool=false;
    System.out.println(bool.booleanValue()?"真":"假");

可以看到,包装类与基本数据类型进行比较运算,是先将包装类进行拆箱成基本数据类型,然后进行比较的。

场景三:包装类型的运算

有没有想过,当我们对 Integer 对象进行四则运算的时候,是如何进行的呢?看以下代码:

    Integer i=10;
    Integer j=20;
    System.out.println(i+j);

反编译代码如下:

    Integer i=10;
    Integer j=20;
    System.out.println(i.intValue()+j.intValue());

我们发现,两个包装类型之间的运算,会被自动拆箱成基本类型进行。文章来源地址https://www.toymoban.com/news/detail-634756.html

到了这里,关于Java 中有了基本类型为什么还需要包装类?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 面试官:为什么有了sleep还需要wait?

    面试官:为什么有了sleep还需要wait?

    对于线程执行最大的问题就是随机调度,抢占式执行,对于程序猿来讲,是不喜欢这种随机性的,程序猿喜欢确定的东西,于是就有了一些方法,可以控制线程之间的执行顺序,虽然线程在内核里调度是随机的,但我们可以通过一些 api 让线程主动阻塞等待,主动放弃 CPU 给其

    2024年02月05日
    浏览(7)
  • 为什么有了IP地址,还需要MAC地址呢?

    为什么有了IP地址,还需要MAC地址呢?

    不知道大家有没有困惑:为什么有了IP地址,还需要MAC地址呢? 他们之间到底有什么联系?又有什么区别?是不是有一个是多余的? 流言传到了“IP地址”和“MAC地址”的耳朵里,他俩也非常苦恼,今天文档君把话筒递给他们,看看他们怎么说?     PART   0 1   MACIP的自白

    2024年02月06日
    浏览(11)
  • TypeScript:为什么JavaScript需要类型检查?

    JavaScript是当今最为流行的编程语言之一。它是一种高级的、解释性的编程语言,用于Web应用程序的开发。然而,JavaScript的灵活性也是它的弱点之一。JavaScript中的变量、函数、类等都是动态类型,这意味着它们的类型可以在运行时发生变化。虽然这种灵活性为JavaScript开发人员

    2024年02月04日
    浏览(5)
  • 解决mysql的启动类型设置了自动,为什么电脑开机后还是需要手动启动?

    解决mysql的启动类型设置了自动,为什么电脑开机后还是需要手动启动?

    问题: 明明mysql的启动类型设置了自动,为什么电脑开机后还是需要手动启动,如下图。  解决方式: 一、ctrl+R 快捷键弹出运行框  二、输入 regedit 后回车  三、地址栏内输入  计算机HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControl 后回车    四、找到Control入径后,新建一个名称为

    2024年02月14日
    浏览(10)
  • html5为什么只需要写<!doctype html>? 有多少种Doctype文档类型?

    HTML5只需要写!doctype html是因为HTML5不基于SGML,不需要对DTD进行引用,但仍需要doctype来规范浏览器的行为。而HTML4.01基于SGML,需要对DTD进行引用,才能告知浏览器文档所使用的文档类型。 Doctype文档类型是指用于标识HTML或XML文档类型的声明,它告诉浏览器文档所使用的规范或标

    2024年01月20日
    浏览(9)
  • 有了MySQL,为什么还要有NoSQL

    有了MySQL,为什么还要有NoSQL

        🏆今日学习目标: 🍀MySQL和NoSQL的区别 ✅ 创作者 :林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页  🍁林在闪闪发光的个人社区,欢迎你的加入: 林在闪闪发光的社区 目录 noSQL的大概意思 理论支撑 为什么需要NoSQL 为什么NoSQL有处理超大规模

    2023年04月20日
    浏览(11)
  • 为什么有了 HTTP 还要 RPC

    哈喽大家好,我是咸鱼 随着互联网技术的发展,分布式架构越来越被人们所采用。在分布式架构下, 为了实现复杂的业务逻辑,应用程序需要分布式通信实现远程调用 而这时候就需要一种协议来支持远程过程调用,以便实现不同应用程序之间的数据交换和信息传递。其中常

    2024年02月05日
    浏览(8)
  • Java中为什么重写equals()也需要重写hashCode()?

    所有类默认继承Object类 先看一下Object源码 结论 equals()返回结果为true hashCode()一定相同 \\\'==\\\'结果为true hashCode()一定相同 \\\'==\\\'结果为false hashCode()有可能相同(哈希冲突) hashCode()重写规范就是保证equals()相同的两个对象拥有相同的哈希值 回到刚刚哪个问题 为什么重写equals还要重写

    2023年04月25日
    浏览(4)
  • 网络编程——RPC与HTTP基本介绍、历史追溯、主流应用场景、对比分析、为什么还需要使用RPC

    网络编程——RPC与HTTP基本介绍、历史追溯、主流应用场景、对比分析、为什么还需要使用RPC

    HTTP协议(Hyper Text Transfer Protocol) 超文本传输协议 : 一个用于在网络上交换信息的标准协议,它定义了客户端(例如浏览器)和服务器之间的通信方式。如平时上网在浏览器上敲个网址url就能访问网页,这里用到的就是HTTP协议。 明确 HTTP 是一个协议,是一个超文本传输协议,

    2024年02月16日
    浏览(8)
  • 为什么要学习Python呢?有了 ChatGPT 还有必要学习 python 吗?

    为什么要学习Python呢?有了 ChatGPT 还有必要学习 python 吗?

    学习 Python 的原因有很多,以下是一些常见的原因: 简单易学: Python 是一门易于学习的编程语言,语法简单、清晰明了,可以快速掌握基本的编程概念。 应用广泛: Python 是一门通用的编程语言,可用于 Web 开发、数据分析、机器学习、人工智能、游戏开发等多个领域。 巨

    2024年02月03日
    浏览(5)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包