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

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.mzph.cn/news/65121.shtml

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

相关文章

linux安装minio以及springboot整合使用

文章目录 1.linux安装minio2.springboot整合minio使用 1.linux安装minio 1.新建文件夹 mkdir /home/minio # 数据文件夹 mkdir /home/minio/data # 创建日志文件夹 mkdir /home/minio/log2.进入文件夹 cd /home/minio3.下载minio&#xff0c;链接可从官网获取 wget https://…

【Terraform学习】使用 Terraform创建DynamoDB添加项目(Terraform-AWS最佳实战学习)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

4.1 链式栈StackT

C关键词&#xff1a;内部类/模板类/头插 C自学精简教程 目录(必读) C数据结构与算法实现&#xff08;目录&#xff09; 栈的内存结构 空栈&#xff1a; 有一个元素的栈&#xff1a; 多个元素的栈&#xff1a; 成员函数说明 0 clear 清空栈 clear 函数负责将栈的对内存释放…

CCF HPC China2023|澎峰科技:使能先进计算,赋能行业应用

CCF HPC China2023圆满落幕&#xff01; 桂秋八月&#xff0c;为期三天的中国高性能计算领域最高规格盛会——2023CCF全球高性能计算学术年会&#xff08;HPC China&#xff09;在青岛红岛国际展览中心圆满落幕。行业超算大咖、顶级学界精英、先锋企业领袖参会者齐聚山东青岛&a…

联邦学习FedAvg-基于去中心化数据的深度网络高效通信学习

随着计算机算力的提升&#xff0c;机器学习作为海量数据的分析处理技术&#xff0c;已经广泛服务于人类社会。 然而&#xff0c;机器学习技术的发展过程中面临两大挑战&#xff1a;一是数据安全难以得到保障&#xff0c;隐私泄露问题亟待解决&#xff1b;二是网络安全隔离和行业…

uniapp 配置网络请求并使用请求轮播图

由于平台的限制&#xff0c;小程序项目中不支持 axios&#xff0c;而且原生的 wx.request() API 功能较为简单&#xff0c;不支持拦截器等全局定制的功能。因此&#xff0c;建议在 uni-app 项目中使用 escook/request-miniprogram 第三方包发起网络数据请求。 官方文档&#xf…

【C++入门】命名空间、缺省参数、函数重载、引用、内联函数

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; C入门学习必备语法 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.9.3 前言 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加…

大数据-玩转数据-Flink窗口函数

一、Flink窗口函数 前面指定了窗口的分配器, 接着我们需要来指定如何计算, 这事由window function来负责. 一旦窗口关闭, window function 去计算处理窗口中的每个元素. window function 可以是ReduceFunction,AggregateFunction,or ProcessWindowFunction中的任意一种. Reduc…

打包个七夕exe玩玩

前段时间七夕 当别的哥们都在酒店不要不要的时候 身为程序员的我 还在单位群收到收到 正好后来看到大佬些的这个 https://www.52pojie.cn/thread-1823963-1-1.html 这个贱 我必须要犯&#xff0c;可是我也不能直接给他装个python吧 多麻烦 就这几个弹窗 好low 加上bgm 再打包成…

Nexus仓库介绍以及maven deploy配置

一 、Nexus仓库介绍 首先介绍一下Nexus的四个仓库的结构&#xff1a; maven-central 代理仓库&#xff0c;代理了maven的中央仓库&#xff1a;https://repo1.maven.org/maven2/&#xff1b; maven-public 仓库组&#xff0c;另外三个仓库都归属于这个组&#xff0c;所以我们的…

贝叶斯神经网络 - 捕捉现实世界的不确定性

贝叶斯神经网络 - 捕捉现实世界的不确定性 Bayesian Neural Networks 生活本质上是不确定性和概率性的&#xff0c;贝叶斯神经网络 (BNN) 旨在捕获和量化这种不确定性 在许多现实世界的应用中&#xff0c;仅仅做出预测是不够的&#xff1b;您还想知道您对该预测的信心有多大。例…

第2章 Linux多进程开发 2.18 内存映射

内存映射&#xff1a;可以进行进程间的通信 1.如果对mmap的返回值(ptr)做操作(ptr), munmap是否能够成功? void * ptr mmap(…); ptr; 可以对其进行操作 munmap(ptr, len); // 错误,要保存地址 2.如果open时O_RDONLY, mmap时prot参数指定PROT_READ | PROT_WRITE会怎样? 错…

二进制安全虚拟机Protostar靶场 安装,基础知识讲解,破解STACK ZERO

简介 pwn是ctf比赛的方向之一&#xff0c;也是门槛最高的&#xff0c;学pwn前需要很多知识&#xff0c;这里建议先去在某宝上买一本汇编语言第四版&#xff0c;看完之后学一下python和c语言&#xff0c;python推荐看油管FreeCodeCamp的教程&#xff0c;c语言也是 pwn题目大部…

SpringBoot 使用MyBatis分页插件实现分页功能

SpringBoot 使用MyBatis分页插件实现分页功能 1、集成pagehelper2、配置pagehelper3、编写代码4、分页效果 案例地址&#xff1a; https://gitee.com/vinci99/paging-pagehelper-demo/tree/master 1、集成pagehelper <!-- 集成pagehelper --> <dependency><gr…

“亚马逊云科技创业加速器”首期聚焦AI,促进入营企业业务发展

生成式AI技术飞速发展&#xff0c;颠覆着人们的生活&#xff0c;正在掀起新一轮的科技革命。在生成式AI的浪潮中&#xff0c;亚马逊云科技旨在为中国的优秀初创企业提供全方位支持&#xff0c;助其抢占先机。 在6月底举办的亚马逊云科技中国峰会上&#xff0c;亚马逊云科技联合…

6. series对象及DataFrame对象知识总结

【目录】 文章目录 6. series对象及DataFrame对象知识总结1. 导入pandas库2. pd.Series创建Series对象2.1 data 列表2.2 data 字典 3. s1.index获取索引4. s1.value获取值5. pd.DataFrame()-创建DataFrame 对象5.1 data 列表5.2 data 嵌套列表5.3 data 字典 6. df[列索引]…

java对象创建的过程

1、检查指令的参数是否能在常量池中定位到一个类的符号引用 2、检查此符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;就先执行相应的类加载过程 3、类加载检查通过后&#xff0c;接下来虚拟机将为新生对象分配内存。 4、内存分配完成之后&#xff0c;…

一句话画出动漫效果

链接&#xff1a; AI Comic Factory - a Hugging Face Space by jbilcke-hfDiscover amazing ML apps made by the communityhttps://huggingface.co/spaces/jbilcke-hf/ai-comic-factory 选择类型&#xff1a; Japanese 输入提示词&#xff1a; beauty and school love st…

12、监测数据采集物联网应用开发步骤(9.1)

监测数据采集物联网应用开发步骤(8.2) TCP/IP Server开发 在com.zxy.common.Com_Para.py中添加如下内容 #锁机制 lock threading.Lock() #本机服务端端口已被连接客户端socket list dServThreadList {} #作为服务端接收数据拦截器 ServerREFLECT_IN_CLASS "com.plug…

设计模式-装饰模式

文章目录 一、简介二、基本概念三、装饰模式的结构和实现类图解析&#xff1a;装饰器的实现方式继承实现&#xff1a;组合实现&#xff1a;继承和组合对比 四、装饰模式的应用场景五、与其他模式的关系六、总结 一、简介 装饰模式是一种结构型设计模式&#xff0c;它允许动态地…