数据结构预备知识(Java):包装类泛型

1、包装类

1.1 包装类

在Java中,每一个基本数据类型都有一个对应的包装类:

在SE的学习中我们已有过简单了解。

我们可以注意到,除了int类型的包装类为Integer,char类型的包装类为Character外,其余基本类型的包装类均将首字母大写即可。

1.2 装箱和拆箱

装箱(装包):把基本数据类型变为包装类类型的过程,叫做装箱。

拆箱(拆包):把包装类类型变为基本数据类型的过程,叫做拆箱。

装箱又分为 自动装箱和显示装箱。

拆箱又分为 自动拆箱和显示拆箱。

1.2.1 装箱

装箱(装包):把基本数据类型变为包装类类型的过程,叫做装箱。

装箱分为 自动装箱和显示装箱。

1.2.1.1 自动装箱&显示装箱
public static void main(String[] args) {Integer a = 10;//自动装箱int b = 10;Integer c = Integer.valueOf(b);//显示装箱}

我们可以将数据直接赋值给包装类类型来自动装箱,也可以通过包装类中的方法来显示装箱。

1.2.2 拆箱

拆箱(拆包):把包装类类型变为基本数据类型的过程,叫做拆箱。

拆箱分为 自动拆箱和显示拆箱。

1.2.2.1 自动拆箱&显示拆箱
public static void main(String[] args) {Integer a = 10;//自动装箱(先装好箱,再来拆箱)int a1 = a;//自动拆箱int a2 = a.intValue();//手动拆箱double a3 = a.doubleValue();//手动拆箱}

1.2.3 自动拆箱&自动装箱 底层原理

其实不管是自动装箱,还是自动拆箱,底层都是帮我们调用了valueOf或者intValue/doubleValue/..... 方法:

1.3 包装类面试题 --->缓存数组

我们先来看以下代码:

读到这里,大家可以先猜测一下结果。

结果是出人意料的:

为什么会出现以上的结果的?明明两组数据都是包装类啊,为什么一组结果是true,而另一组结果是false呢?

要解决问题,我们就需要找到问题的主要矛盾。

我们可以发现,这几行代码,仅仅只发生了装箱。那我们就去看装箱是怎么操作的,也就是valueOf的源码是怎么工作的:

我们发现,当我们传入的值满足一个范围的时候,返回了一个数组中的值,而不满足这个范围的时候,则新返回了一个对象,既然返回了一个新对象,新对象用 == 来进行比较,那结果必然是false!

那这个范围是多少呢?

我们可以看到,范围为[-128,127] 。

也就是说,当我们要装箱的数据在这个范围当中时,是直接从一个数组中拿的数据,而这个数组就是缓存数组

缓存数组中共有256个数字,数组下标的范围为[0,255] ,存储着如下的数据:

所以当传入的数据在[-128,127]这个范围时,是直接从这个缓存数组中拿到的数据。

2、泛型

2.1 什么是泛型

顾名思义,泛型就是适用于许多许多类型。

在我们之前的学习中,我们可以将一个数据当做参数传到一个方法中,而泛型,是将一个数据类型当做参数传入,我们需要什么类型,就传入什么类型。

2.2 泛型的语法

类名后的 <E> 代表占位符,表示当前类是一个泛型类。
new关键字后<>中的类型实参可以不写,Java会根据第一个传入的参数自动的来推导出这个类型。
<>中参数传入规范:

2.3 泛型的使用

我们将Integer作为参数传入,那我们用E来接收的参数的类型必须为整型,不能再传入其他类型,如:字符串、字符型......:

这里就会帮我们进行自动类型检查,如果不是对应的类型,就会报错。

我们接收数据时也不需要强制类型转换,会进行自动类型转换

注意!注意!注意!!!

实例化对象时,<>中传入的类型只能为类类型,不能为普通数据类型!!!

泛型代码:

class myArray<E> {public Object[] array = new Object[10];public void setValue(int pos,E val) {array[pos] = val;}public E getValue(int pos) {return (E)array[pos];}
}
public class Test {public static void main(String[] args) {myArray<Integer> Array = new myArray<>();Array.setValue(0,10);//自动类型检查Array.setValue(1,100);//自动类型检查//Array.setValue(2,"dings");自动类型检查 发现错误Integer ret1 = Array.getValue(0);//自动类型转换System.out.println(ret1);}
}

2.4 裸类型(Raw Type) (了解)

裸类型是一个泛型类但没有传入类型实参,例如 Array  就是一个裸类型
我们发现,我们明明定义的是一个泛型类,但是我们实例化对象时并没有传入类型参数,却也没有发生报错,这是为什么呢?
答: 泛型是在JDK5引入的裸类型是为了兼容老版本的 API 保留的机制,所以不会报错。

2.5 泛型是如何进行编译的?

2.5.1 擦除机制

泛型是编译时期的一种机制,在运行的时候没有泛型的概念,也就是说,JVM当中没有泛型的概念。

在编译完成后,我们定义的<>中的T、E......等等,都会被擦除并且替换为Object,编译器生成的字节码在运行期间并不包含泛型的类型信息,这就是擦除机制

关于擦除机制的介绍:擦除机制

2.5 泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

2.5.1 语法

2.5.2 示例一

语法:

我们对泛型类定义了上界为Number ,那传入的类型只能是Number或者是Number的子类。

代码示例:

ps:没有指定类型边界 E,可以视为 E extends Object

2.5.3 复杂示例二

例如:

那传入的类类型只能是实现了Comparable接口的类。

为什么要这样规定呢?

因为,我们使用的是泛型类,一旦我们要在类中进行数据的比较,那我们比较方法是未被定义的,就是说我们在写下这段代码时,还不知道传入的E会是什么类型,在方法中不能直接使用 >或者<来直接进行比较。于是,我们规定传入的类必须实现了Comparable接口,那就可以直接调用CompareTo方法来进行数据的比较了。

代码示例:

class A<E extends Comparable<E>> {//要求传入的类必须实现了Comparable接口,下面用来数据之间的比较public E findMax(E[] array) {//利用compareTo进行比较,找到数组中的最大值int max = 0;for (int i = 0; i < array.length; i++) {if (array[max].compareTo(array[i]) < 0) {max = i;}}return array[max];}
}
public class Student implements Comparable<Student>{//实现了Comparable接口public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Override//重写compareTo方法,规范比较行为public int compareTo(Student o) {return this.age - o.age;}public static void main(String[] args) {Student[] students = new Student[]{new Student("dinsg",10),new Student("fdd",100),new Student("kasg",21),new Student("hau",1)};A<Student> aaa = new A<>();Student maxStudent = aaa.findMax(students);System.out.println(maxStudent);}
}

2.6 泛型方法

未完待续....

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

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

相关文章

远程工作岗位机会

电鸭&#xff1a;​​​​​​https://eleduck.com/?sortnew电鸭社区是具有8年历史的远程工作招聘社区&#xff0c;也是远程办公互联网工作者们的聚集地。在社区&#xff0c;我们进行有价值的话题讨论&#xff0c;也分享远程、外包、零活、兼职、驻场等非主流工作机会。「只工…

llm-大模型落地评测?提供一个领域大模型测评方法

文章目录 前置说明1.领域大模型评估指标1.1.性能指标计算方法1.1.1.F11.1.2.首字响应时间1.1.3.处理效率1.1.4.并发路数1.1.5.正确性1.1.6.完整度1.1.7.相关度1.1.8.有效性 1.2.安全性指标计算方法1.2.1.禁止项内容的统计方式1.2.2.问题项内容占比率的统计方式 1.3.质量指标及计…

启动报错 “lc.exe”已退出,代码为 -1

启动项目时报错 “lc.exe”已退出&#xff0c;代码为 -1&#xff0c;这个原因是项目需要认证的凭证&#xff0c;有两种方法解决 1.手动搜索license&#xff0c;然后删掉即可 2.安装插件 工具->nuget包管理->管理解决方案的nuget包&#xff0c;搜emptylicenses&#xff0c…

使用LangChain+Ollama自己做的一个和大语言模型聊天的网站支持上下文对话,学习记录。

0.引言 在自己学习的过程中可以自己做一个和聊天大模型对话的一个小网站&#xff0c;成就感不亚于人生第一次跑完10km。 1.项目介绍 前端代码&#xff1a;Vue3, MarkDownIT. 后端代码&#xff1a;Python3, Fernet库, OpenAPI, LangChain, Ollama. Ollama 本地模型的部署和管理…

SuperMap iClient3D 11i(2023) SP1 for Cesium 调整

SuperMap iClient3D 11i(2023) SP1 for Cesium 最新版本 下载地址 SuperMap技术资源中心|为您提供全面的在线技术服务 每一次版本升级,都要对代码进行修改调整,都是为了解决功能需求。当然,也为产品做了小白鼠测试,发现bug,优化功能。 由于前端开发使用的是dojo框架,类…

java之sql注入审计

1 基础环境搭建 1.1 mysql数据库搭建 phpStudy是一个PHP调试环境的程序集成包&#xff0c;PHPMysqlApache。 通过phpstduy下载与安装指 定版本的mysql数据库【可以同时下载多个版本&#xff0c;便于应对不对的系统及复现漏洞便捷切换多个版本】 完成下载后&#xff0c;启动…

失眠焦虑?这里有你的心灵疗愈手册

&#x1f343; 亲爱的朋友们&#xff0c;你是否也曾在深夜里辗转反侧&#xff0c;无法入眠&#xff1f;是否也曾因为生活中的琐事而焦虑不安&#xff0c;无法放松心情&#xff1f;在这个快节奏的时代&#xff0c;失眠和焦虑似乎成为了我们生活中难以避免的问题。今天&#xff0…

SpringBoot购物网站

摘要 随着信息技术的高速发展&#xff0c;二十一世纪的网络技术和网络应用正在快速融入人们的生活&#xff0c;并且由于网络服务以及网络应用日渐普及&#xff0c;人们对于现在生活的需求也随之增长&#xff0c;而网上购物的便捷对人们的吸引力越来越大&#xff0c;购物网站可…

ES 8.14 向量搜索优化

参考&#xff1a;https://blog.csdn.net/UbuntuTouch/article/details/139502650 检索器&#xff08;standard、kNN 和 RRF&#xff09; 检索器&#xff08;retrievers&#xff09;是搜索 API 中的一种新抽象概念&#xff0c;用于描述如何检索一组顶级文档。检索器被设计为可以…

【经典爬虫案例】用Python爬取微博热搜榜!

一、爬取目标 本次爬取的是: 微博热搜榜 &#xff08;代码也可直接在下方拿&#xff09;&#xff1a; ​ 分别爬取每条热搜的&#xff1a; 热搜标题、热搜排名、热搜类别、热度、链接地址。 下面&#xff0c;对页面进行分析。 经过分析&#xff0c;此页面没有XHR链接通过&am…

如何覆盖!important修饰的属性

最简单的方法 如果这个!important修饰的属性 是自己的写的&#xff0c;去掉这种写法&#xff0c;使用优先级的方式来写这个属性&#xff08;.outter .inner 的优先级就会比 。outter的优先级高&#xff09; 复杂的方法&#xff1a;用魔法打败魔法 但是这个样式来自于全局css&am…

【机器学习】智能创意工厂:机器学习驱动的AIGC,打造未来内容新生态

&#x1f680;时空传送门 &#x1f50d;机器学习在AIGC中的核心技术&#x1f4d5;深度学习&#x1f388;生成对抗网络&#xff08;GANs&#xff09; &#x1f680;机器学习在AIGC中的具体应用&#x1f340;图像生成与编辑⭐文本生成与对话系统&#x1f320;音频生成与语音合成 …

uniapp小程序计算地图计算距离

我们拿到自身和目标距离经纬度 调用此方法即可计算出自身与目标的距离 最后我所展示的页面如下 具体效果可能会有点偏差 要求严格的可以在精细的计算一下

【Python】Redis数据库

Redis数据库 Unit01一、Redis1.1 概述1.2 安装1.3 Redis-cli1.4 数据类型1.5 字符处理1.6 键的命名规则 二、通用命令三、字符串(String)3.1 概述3.2 常用命令3.3 应用场景 四、列表(List)4.1 概述4.2 常用命令 五、集合(SET)5.1 概述5.3 常用命令 六、有序集合6.1 概述6.2 常用…

【行业应用】基于 Arm 虚拟硬件平台实现微信支付二维码识别的智能闸机系统

基于 Arm 虚拟硬件平台实现微信支付二维码识别的智能闸机系统 本实验过程中所显示的优惠价格及费用报销等相关信息仅在【Arm AI 开发体验创造营】体验活动过程中有效&#xff0c;逾期无效&#xff0c;请根据实时价格自行购买和体验。同时&#xff0c;感谢本次体验活动 Arm 导师…

解读自然语言处理:技术、应用与未来展望

引言 自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是计算机科学、人工智能和语言学的一个跨学科领域&#xff0c;致力于实现人与计算机之间通过自然语言进行有效沟通的能力。NLP 的核心任务是理解、解释和生成人类语言&#xff0c;使计…

入门二.HTB--Fawn

大佬 [Hackthebox] Fawn (FTP)_根据您的扫描,目标上运行的 ftp 版本是什么?-CSDN博客 大佬 https://www.cnblogs.com/Hekeats-L/p/16535561.html 任务一 FTP缩写 File Transfer Protocol 任务二 FTP的TCP端口 21 FTP监听的TCP端口号为21,监听的数据端口为20。 任务三 FTP…

Spring技术——介绍、初识

从这篇博客正式开始学习 Spring 。 一、整个Spring技术学习的介绍 首先先对 Spring 做一个简单的认识&#xff0c;并从以下3个方面了解学习Spring 技术的意义&#xff1a; &#xff08;1&#xff09;为什么要学习 Spring 技术&#xff1f; 1、它的市场的占有率很高&#xff…

css之浏览器兼容性

css之浏览器兼容性 内核 内核代表作品 兼容的概念和原因 Hack的副作用 常见的CSS Bug 多个图片在一起&#xff0c;图片套个盒子 图片在IE浏览器上有蓝色边框 解决办法&#xff1a;给img加上 border:0 表单元素中距离顶部元素不一样 左边input 右边button 解决办法&#x…

umijs脚手架

node 16.9.1 注意node版本的问题 node 18.20.0 这个问题其实是node与中端连接出错&#xff0c;无法初始化TTY&#xff08;终端设备&#xff09;&#xff0c;可以用cmd命令行来创建umi项目 nvm管理node https://github.com/coreybutler/nvm-windows/releases 这是nvm-window…