01-为什么阿里巴巴强制要求使用包装类型定义属性?【Java面试题总结】

news2024/11/29 10:37:57

1.为什么阿里巴巴强制要求使用包装类型定义属性?

我认为主要有以下几个方面的原因:

  • 默认值问题:使用基本数据类型定义属性时,如果没有给属性赋初始值,会使用默认值(如 int 的默认值为 0),而使用包装类型定义属性,如果没有给属性赋初始值,属性的值为 null,这样可以更加清晰地表达属性的状态,在一些业务场景上,null是有实际业务含义的。
  • 拆箱问题:在一些特定场景下,如果使用基本数据类型定义属性,需要进行多次装箱和拆箱操作,这个操作会带来额外的性能开销和代码复杂度。而使用包装类型定义属性,可以避免这个问题,提高代码的效率和可读性。在进行拆箱操作时,如果包装类对象为null,会导致NullPointerException异常。
  • 泛型中只能使用对象:Java 中的泛型中只能使用对象类型,如果要在泛型编程中使用基本类型,就必须使用对应的包装类型。
  • 更多的API:包装类型提供了一些额外方法和属性比如 equals()、hashCode()、toString(),这些方法在某些特定场景中会比较有用。

知识扩展

(1)拆箱和装箱

概念:在Java中,拆箱(Unboxing)和装箱(Boxing)是用于基本数据类型和对应的包装类之间进行相互转换的过程,装箱是指将基本数据类型转换为对应的包装类对象(如int->Integer、double->Double等),拆箱是指把包装类对象转换成基本数据类型。

装箱

手动装箱

int num = 10;
Integer obj = new Integer(num);  // 使用构造函数
Integer obj2 = Integer.valueOf(num);  // 使用静态工厂方法

自动装箱

int num = 10;
Integer obj = num;  // 自动装箱,编译器会自动将基本类型转换为对应的包装类对象

拆箱

手动拆箱

Integer obj = new Integer(10);
int num = obj.intValue();  // 调用intValue()方法获取基本类型的值

自动拆箱

Integer obj = new Integer(10);
int num = obj;  // 自动拆箱,编译器会自动将包装类对象转换为对应的基本类型

在进行拆箱操作时,如果包装类对象为null,会导致NullPointerException异常

Integer obj = null;
int num = obj;  // 自动拆箱,由于obj为null,会触发NullPointerException异常

因此需要做额外的判断比较麻烦

Integer obj = null;
if (obj != null) {
    int num = obj;  // 自动拆箱,这里会跳过拆箱操作,避免了NullPointerException异常
}

(2)Java 中的泛型

  • 泛型(Generics)是一种强类型检查机制,在编译时期提供类型安全性检查,并在运行时避免类型转换错误。泛型在 Java 中主要应用于类、接口和方法。
  • 泛型主要是针对对象类型(引用类型)而设计的,而不是基本数据类型(如 intchar 等)。这是因为 Java 的泛型实现是通过类型擦除(Type Erasure)来实现的,即在编译时将泛型类型信息擦除,生成的字节码中只保留原始类型。虽然无法直接应用于基本数据类型,但Java 提供了对应的包装类来处理基本数据类型的泛型需求。例如,Integerint 的包装类,可以作为泛型类型使用。

为什么类型擦除要求是对象类型?

先看下面案例,我们下意识认为这两个集合是不同的类型,运行结果竟然是true。

public class GenericsTest {

    public static void main(String[] args) {
        List<Integer> integers = new ArrayList<>();
        List<String> strings = new ArrayList<>();
        System.out.println(integers.getClass().equals(strings.getClass()));
    }
}

image-20230827231648601

在编辑阶段会进行类型检查,编辑通过后编译器会把类型擦除,在运行阶段时,对JVM来说就没有什么泛型类型的对象,所有的对象都是属于普通类。 List和List被擦除类型后,类型都是List类型(被擦除后的类型,如这里的List统称叫原始类型)

image-20230827234701277

其中的泛型参数都会被替换成它的第一个上界

image-20230827234817383

没有边界只时就会被替换成底层父类Object。发现和Java1.5之前还没泛型时的代码是一致的。这也是类型擦除的目的:向低版本兼容

总结

泛型不支持基本数据类型,只支持引用类型,因为泛型最终被擦除成具体的类型,具体的类型的顶层是Object,而Object不能存储基本数据类型的值(int等基本数据类型)。

Java 泛型弊端:

  • 不能支持基本数据类型;
  • 只有原始类型的class;
  • 不能实例化参数类型;
  • 不能实例化泛型数组;

不能支持基本数据类型:

image-20230827235419752

只有原始类型的class:

image-20230827235447396

不能实例化参数类型:

image-20230827235514939

不能实例化泛型数组:image-20230827235529717

最后我们可以通过反射机制恢复这些泛型信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/967616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++:初识类与this指针

文章目录 前言一、类类的定义和实例化类的访问限定符类的作用域计算类的大小 二、类的成员函数的this指针总结 个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》 前言 一、类 类的定义和实例化 注意类定义结束时后面分号( ; )不能省略。 类…

基于粒子群算法的考虑需求响应的风-光-柴-储容量优化配置

目录 文章摘要&#xff1a; 研究背景&#xff1a; 考虑柔性负荷的风、光、柴、储微电网模型&#xff1a; 储能配置模型&#xff1a; 粒子群算法&#xff1a; 运行结果&#xff1a; 1. 全年运行效果展示&#xff1a; 2. 典型日运行效果&#xff1a; Matlab代码数据分享…

博客系统自动化测试项目实战(测试系列9)

目录 前言&#xff1a; 1.博客前端页面测试用例图 2.测试用例的代码实现 2.1登录页面的测试 2.2博客列表页面的测试 2.3写博客测试 2.4博客详情页面的测试 2.5已发布博客的标题和时间的测试 2.6注销用户的测试 结束语&#xff1a; 前言&#xff1a; 之前小编给大家讲…

js实现点击查看全部/收起功能

在上一篇文章实现用js截取文本后&#xff0c;我的另一个需求也迎刃而解了。需求就是一段长文本需要溢出隐藏&#xff0c;然后点击全部时显示全部文本&#xff0c;点击收起又回到溢出隐藏的状态。实现的效果如下图&#xff1a; 实现的思路时点击全部时使用这条数据的原文本&…

04-过滤器和拦截器有什么区别?【Java面试题总结】

过滤器和拦截器有什么区别&#xff1f; 运行顺序不同&#xff1a;过滤器是在 Servlet 容器接收到请求之后&#xff0c;但在 Servlet被调用之前运行的&#xff1b;而拦截器则是在Servlet 被调用之后&#xff0c;但在响应被发送到客户端之前运行的。 过滤器Filter 依赖于 Servle…

【优先级队列】

文章目录 基于无序数组实现基于有序数组的实现基于堆的实现合并多个有序链表-力扣 23 题 基于无序数组实现 要点 入队保持顺序&#xff0c;在数组尾部插入即可出队前找到优先级最高的出队&#xff0c;相当于一次选择排序 基于有序数组的实现 要点 入队后排好序&#xff0c…

企业架构LNMP学习笔记8

1、 运维人员需要考虑安全性、稳定性。 安装&#xff1a; 解压进入到目录&#xff1a; shell > tar zxf php-7.2.12.tar.gz shell > cd php-7.2.12 安装依赖软件&#xff1a; yum -y install libxml2-devel libjpeg-devel libpng-devel freetype-devel curl-devel op…

企业应用系统 PHP项目支持管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 项目支持管理系统是一套完善的web设计系统 应用于企业项目管理&#xff0c;从企业内部的各个业务环境总体掌握&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php项目支撑管理系统2 二、功能介绍 (1)权限管理&#xff1…

Android 使用OpenCV实现实时人脸识别,并绘制到SurfaceView上

1. 前言 上篇文章 我们已经通过一个简单的例子&#xff0c;在Android Studio中接入了OpenCV。 之前我们也 在Visual Studio上&#xff0c;使用OpenCV实现人脸识别 中实现了人脸识别的效果。 接着&#xff0c;我们就可以将OpenCV的人脸识别效果移植到Android中了。 1.1 环境说…

一个基于YAPI接口生产代码的开源工具

前后端分离的开发模式是一种趋势&#xff0c;但如果缺少好的开发工具跟管理模式&#xff0c;会使得前后端开发人员相互等待&#xff0c;扯皮等问题。从而影响项目的交付进度。 通过实践摸索&#xff0c;YAPI是一款很适合前后端分离开发的协助工具。它以项目为维度&#xff0c;可…

arduino仿真 SimulIDE1.0仿真器

SimulIDE 是一个开源的电子电路模拟器&#xff0c;支持模拟各种电子元器件的行为&#xff0c;可以帮助电子工程师和爱好者进行电路设计和测试。以下是 SimulIDE 的安装和使用说明&#xff1a; 安装 SimulIDE SimulIDE 可以在 Windows、Linux 和 Mac OS X 等操作系统上安装。您…

取证工具prodiscover的基本操作

前言提醒 取证工具ProDiscover在网上讲解操作的文章实在太少&#xff0c;一是prodiscover是用于磁盘取证的工具&#xff0c;本身比较小众比不上其他的编程软件能用到的地方多&#xff0c;二是这个工具是用来恢复提取磁盘中被删除的文件&#xff0c;是比较隐晦的软件。 需要注…

CSAPP的Lab学习——AttackLab

文章目录 前言一、阶段一攻击二、阶段二攻击三、阶段三攻击四、阶段四攻击五、阶段五攻击总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。刚刚看完CSAPP&#xff0c;真是一本神书啊&#xff01;遂尝试将它的Lab实现&#xff0c;并记录期间心酸历程。 代码下载 官方…

【AWS实验】 配置中转网关及对等连接

文章目录 实验概览目标实验环境任务 1&#xff1a;查看网络拓扑并创建基准任务 2&#xff1a;创建中转网关任务 3&#xff1a;创建中转网关挂载任务 4&#xff1a;创建中转网关路由表任务 4.1&#xff1a;创建路由表关联任务 4.2&#xff1a;创建路由传播 任务 5&#xff1a;更…

velodyne_msgs/VelodyneScan数据流消息转化为sensor_msgs/PointCloud2点云帧消息

目的 在查看一个开源数据集时&#xff0c;点云信息格式为velodyne_msgs/VelodyneScan&#xff0c;无法在rviz中显示&#xff0c;需要转换为sensor_msgs/PointCloud2。 软件版本 Ubuntu20.04 Noetic 激光雷达型号 32线激光雷达velodyne 32E 参考方法 ROS Noetic velodyn…

【DP】CF Edu 21 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 就是一个 N为1e5&#xff0c;M为3e5的背包问题&#xff0c;不过特殊条件是 w < 3 我们去从最简单的情况开始考虑 当只有w 1的物品和w 2的物品时&#xff0c;考虑贪心地把物品按价值排序&#xff0c;然后选…

Python数据分析实战-判断一组序列(列表)的变化趋势(附源码和实现效果)

实现功能 判断一组序列&#xff08;列表&#xff09;的变化趋势 实现代码 from sklearn.linear_model import LinearRegression import numpy as np # 计算相邻两个数之间的差值的均值&#xff0c;并判断变化趋势。 def trend(lst):diff [lst[i1] - lst[i] for i in range(…

Python之循环-三元表达式

Python之循环-三元表达式 continue, break break 结束循环 break语句可以提前结束循环。然后执行循环之后的语句。 continue continue用于跳出当前循环&#xff0c;执行下一次循环。 示例&#xff1a; 如下示例中是一个for循环&#xff0c;range(10)&#xff0c;然后遍历r…

【高效编程技巧】编程菜鸟和编程大佬的差距究竟在哪里?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《C语言进阶》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言1.如何写出好的代码&#xff1f;1.2 如何分析一个函数写的怎么样 2. 代码板式的重要性2.1 代码…

【C++】学习STL中的stack和queue

❤️前言 今天这篇博客的内容主要关于STL中的stack、queue和priority_queue三种容器。 正文 stack和queue的使用方式非常简单&#xff0c;我们只要根据之前学习数据结构的经验和文档介绍就可以轻松上手。于是我们直接开始对它们的模拟实现。 stack和queue的模拟实现 stack和q…