当前位置: 首页 > news >正文

Java---包装类与泛型

1.包装类

1.1 包装类

在Java中,由于基本数据类型不是继承Object类,为了在泛型代码中可以支持基本数据类型,Java给每个基本数据类型各自提供了·一个包装类。

如下图

除了char和int基本数据类型的包装类型有点特别,其他的都是首字母大写 

1.2 装箱与拆箱

1. 装箱

装箱就是将基本数据类型的数据转化成包装类,装箱分为自动装箱和显示拆箱。

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

其实自动拆箱和显示拆箱的底层原理是一样的,都是调用了Integer.valueOf()方法。

2. 拆箱

拆箱就是将包装类的数据类型转换转换成基本数据类型,拆箱也分为自动拆箱和显示拆箱。

public static void main1(String[] args) {Integer a=10;int b=a.intValue();//显示拆箱int c=a;//自动拆箱}

 2.面试题

了解装箱与拆箱,我们来看一道面试题

public static void main(String[] args) {Integer a=100;Integer b=100;System.out.println(a == b);//打印trueInteger c=200;Integer d=200;System.out.println(c == d);//打印false}

为什么会打印不同的结果呢?

我们来看Integer.ValueOf()方法的原码

我们发现,在进行装包操作的时候,会根据装包的数据的大小来返回不同类型的数据。

当要装包的数据的范围在 [-127~128] 之间时,valueOf 方法就会返回数组中的一个数据(整数)。

如下图

当数据不在上面的范围时,就会返回一个新的实例化的对象。 

 所以,由于100在【128~127】这个范围内,所以两者的比较是两个整数之间的比较。

 由于200超出了以上范围,所以c和d的比较实际上是两个对象之间的比较,有==来比较两个对象,返回值当然是false。

2. 泛型

2.1 泛型的概念

一般类和方法,只能使用具体的数据类型,要么是基本数据类型或者是引用数据类型。当我们要编写设计多种数据类型的程序时,一旦我们将数据类型固定,那么对于后续的编程的限制会很大。所以在Java中提出了泛型的概念,所谓泛型,就是将数据类型参数化。

2.2 引出泛型

我们先来看一道题:实现一个类,该类中有一个可以存储任何数据类型的数组,并且可以通过方法来设置数组中的值和获取数组中对应的内容。

代码如下图

在类中,我们创建了一个Object类型的数组,这样就可以存储任何数据类型了。但是,后面我们发现,我们可以通过方法来直接设置数组中的内容,但是我们通过方法来获取数据类型的时候,却发现会报错,这是因为发生了向下转型,我们需要进行强制类型转换才能正确获得数组中的任何数据。这样想想就很奇怪了,我明明可以存储任何数据类型,但却不能直接1获取数组中的数据。为了解决这个问题,我们就可以使用泛型。

如以下代码

class DataBase<E>{Object[] array=new Object[10];public void setArray(int pos,E obj){array[pos]=obj;}public E getArray(int pos){return (E)array[pos];}
}
public class Test {public static void main(String[] args) {DataBase<Integer> dataBase=new DataBase<>();dataBase.setArray(0,10);Integer a=dataBase.getArray(0);DataBase<String> dataBase1=new DataBase<String>();dataBase1.setArray(1,"man");String str=dataBase1.getArray(1);}
}

< E >就是泛型的用法 ,可以发现,当我们使用泛型之后,我们就可以直接来获取数据了,不用进行强制转换了。

简单来说,使用泛型,就行我们在创建类的时候,通过泛型,我们可以将数据类型转换为参数来进行类的创建。如上图,我们在实例化database对象的时候,我们将Integer的数据类型作为参数传过去,所以此时,对于字母E就代表Integer数据类型,实例化database1的时候,我们将String数据类型作为参数传过去,此时,对于database1来说,字母E就代表String类型。

注意事项:<E>可以理解为一个标识符,代表该类为泛型类。

2.3 泛型的语法

class 类名<T>{}

类名后的<T>是一个标识符,表示当前类为泛型类。 其中< >里面也可以是其他字母,常见的有T和E。

3.泛型类的使用

3.1 语法格式

泛型类名<类型实参> 变量名=new 泛型类名<类型实参>();

举例

 

class MyFunc<T>{}
public class Test {public static void main(String[] args) {MyFunc<Integer> myFunc=new MyFunc<Integer>();MyFunc<String> myFunc1=new MyFunc<>();}}

在创建泛型类对象时,后面的new< >里面的包装类可以不写,编译器会根据前面的包装类来推导后面的包装类类型。

注意事项:泛型只能接受类,所有的基本数据类型必须使用包装类。

 4. 裸类型(了解)

裸类型是一种不带参数的泛型类型,它是为了兼容以前老版本JDK没有泛型的版本。例如MyArrayList就是一个裸类型。

5. 擦除机制

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

泛型是编译时期的机制,代码在运行的时候没有泛型的概念。

这就涉及到擦处机制:在编译完成后,所有的传给泛型类的数据类型,最终都会被擦除为Object类。所以,编译之后的字节码无泛型,只有Object类。

6. 泛型的上界

在定义泛型类时,有时需要对传入的类型变量进行限制,这时候可以通过类型边界来限制。

6.1 语法

class 泛型类名称<类型形参 extends 类型边界> {...
}

举例

 这时定义的泛型类时传入的类型参数的上界为Number,传如的类型参数必须是Number的子类,由于String类不是Number的子类,所以会报错。

注意事项:没有泛型边界的,默认边界为Object。

6.2 复杂例子

题目要求:创建一个类,里面有一个方法来获取数组中的最大值。

我们会很直接的写下以下代码

当我们写出上图的代码之后,我们发现会报错。这是因为泛型类的E代表很多数据类型,我们不能用平常的数学思维去比较。这时候我们可以对传入的类型参数实现comparable接口来解决问题。

class Alg<E extends Comparable<E>>{public E FindMax(E[] array){E max=array[0];for(int i=1;i<array.length;i++){if(array[i].compareTo(max)>0){max=array[i];}}return max;}
}
public class Test {public static void main(String[] args) {Integer[] array={1,2,3,4,5};Alg alg=new Alg();int ret=alg.FindMax(array);}
}

这时,由于我们在定义泛型类的时候使用了Comparable接口,所以,此时,传入的类型参数必须实现Comparable接口,否则会报错。

 7. 泛型方法

7.1 语法格式

方法修饰限定符 <类型参数> 返回值类型 方法名(){}

举例

public static<E extends Comparable<E>> E FindMax(E[] array)

 以上题目,获取最大值的另一种代码形式

class Alg{public static<E extends Comparable<E>> E FindMax(E[] array){E max=array[0];for(int i=1;i<array.length;i++){if(array[i].compareTo(max)>0){max=array[i];}}return max;}
}
public class Test {public static void main(String[] args) {Integer[] array={1,2,3,4,5};Alg alg=new Alg();Integer ret=Alg.FindMax(array);//使用类型推导Integer ret2=Alg.<Integer>FindMax(array);//不使用类型推导}
}

感谢观看。

 

相关文章:

Java---包装类与泛型

1.包装类 1.1 包装类 在Java中&#xff0c;由于基本数据类型不是继承Object类&#xff0c;为了在泛型代码中可以支持基本数据类型&#xff0c;Java给每个基本数据类型各自提供了一个包装类。 如下图 除了char和int基本数据类型的包装类型有点特别&#xff0c;其他的都是首字…...

如何优化 PostgreSQL 中对于复杂数学计算的查询?

文章目录 一、理解复杂数学计算的特点二、优化原则&#xff08;一&#xff09;索引优化&#xff08;二&#xff09;查询重写&#xff08;三&#xff09;数据库配置调整&#xff08;四&#xff09;使用数据库内置函数的优势 三、具体的优化方案和示例&#xff08;一&#xff09;…...

前端面试题27(在实际项目中,如何有效地利用Vue3的响应式系统提高性能?)

在实际项目中&#xff0c;有效利用Vue3的响应式系统提高性能主要涉及以下几个关键点&#xff1a; 1. 合理使用reactive和ref reactive&#xff1a;用于将复杂的数据结构&#xff08;如对象或数组&#xff09;转换成响应式版本。确保只将需要实时更新的数据结构声明为响应式&am…...

掌握Vue 3生命周期:从组合式API到高效代码实践

引言 在 Vue 3 中&#xff0c;生命周期的概念得到了进一步的优化和简化。Vue 3 引入了组合式 API&#xff08;Composition API&#xff09;&#xff0c;这为开发者提供了更灵活的方式来组织和重用代码逻辑。与传统的选项式 API&#xff08;Options API&#xff09;相比&#x…...

使用cgroup对pgsql进行分库资源限制

系统:Centos7 pg版本:14.11 自建pgsql14中有很多个库,一个库对应一个租户,偶尔会出现单个租户执行慢sql影响全局的问题,目前官方也没有比较合适的处理方案或者插件 解决方案: 因为pgsql是多进程应用,所以正好可以使用linux自带的cgroup功能进行资源限制。定时将进程中…...

【网络安全】一文带你了解什么是【网络劫持】

网络劫持&#xff08;Network Hijacking&#xff09;是一种网络攻击&#xff0c;攻击者通过非法手段劫持网络通信&#xff0c;导致合法用户的数据流被拦截、篡改或重定向到攻击者控制的系统。这种攻击可以在各种网络层面上进行&#xff0c;包括域名系统&#xff08;DNS&#xf…...

springcloud分布式架构网上商城 LW +PPT+源码+讲解

3系统分析 3.1可行性分析 在开发系统之前要进行系统可行性分析&#xff0c;目的是在用最简单的方法去解决最大的问题&#xff0c;程序一旦开发出来满足了用户的需要&#xff0c;所带来的利益也很多。下面我们将从技术、操作、经济等方面来选择这个系统最终是否开发。 3.1.1技术…...

【Linux】动态库的制作与使用

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

Vue框架引入

vue简介 1.1.vue是什么?Vue官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/ vue是一套构建用户界面的渐进式javascript框架 构建用户界面:将我们手里拿到的数据通过某种办法变成用户可以看见的界面前端工程师的职责:就是在合适的时候发出合适的请求,然后…...

贝叶斯估计(1):期末大乱炖

写在前面&#xff01; 1 先验分布和后验分布 三种信息&#xff1a;总体信息、样本信息、先验信息 总体信息&#xff1a;“总体是正态分布”&#xff1b;样本信息&#xff1a;总体抽取的样本提供的信息&#xff0c;是最新鲜的信息&#xff1b;先验信息&#xff1a;在抽样之前就…...

电脑找回彻底删除文件?四个实测效果的方法【一键找回】

电脑数据删除了还能恢复吗&#xff1f;可以的&#xff0c;只要我们及时撤销上一步删除操作&#xff0c;还是有几率找回彻底删除文件。 当我们的电脑文件被彻底删除后&#xff0c;尽管恢复的成功率可能受到多种因素的影响&#xff0c;但仍有几种方法可以尝试找回这些文件。本文整…...

java开发报错

查了一下啊。...

基于python 的动态虚拟主机

内容动态&#xff0c;内容通过程序的执行结果返回。 通过编写脚本&#xff0c;完成配置&#xff0c;实现访问页面返回Hello World。 实现步骤&#xff1a; 1、安装python模块 dnf install python3-mod_wsgi 2、编写脚本 在/var/www/cgi-bin/目录下编写脚本&#xff1a; vim…...

绝地求生PUBG没有开始游戏按钮的解决办法

绝地求生是一款特别热门的战术竞技型射击类游戏&#xff0c;游戏中玩家需要在游戏地图上收集各种资源&#xff0c;并在不断缩小的安全区域内持武器对抗其他玩家&#xff0c;让自己生存到最后。当游戏最后场上只剩下一支队伍的时候即可获得游戏胜利。然而一些玩家在游玩绝地求生…...

开始尝试从0写一个项目--前端(一)

基础项目构建 创建VUE初始工程 确保自己下载了node.js和npm node -v //查看node.js的版本 npm -v //查看npm的版本 npm i vue/cli -g //安装VUE CLI 创建 以管理员身份运行 输入&#xff1a;vue ui 就会进入 点击创建 自定义项目名字&#xff0c;选择npm管理 结…...

【Java探索之旅】多态:向上下转型、多态优缺点、构造函数陷阱

文章目录 &#x1f4d1;前言一、向上转型和向下转型1.1 向上转型1.2 向下转型 二、多态的优缺点2.1 多态优点2.2 多态缺陷 三、避免避免构造方法中调用重写的方法四、好的习惯&#x1f324;️全篇总结 &#x1f4d1;前言 在面向对象编程中&#xff0c;向上转型和向下转型是常用…...

Linux上web服务器搭建(Apache、Nginx)

第五章 web服务器 第一节 DNS&#xff1a;对域名进行解析&#xff0c;查询对应的地址 1.1 web服务器简介 www是world wide web的缩写&#xff0c;也就是全球信息广播的意思 1.2.网址及HTTP简介 web服务器提供的这些数据大部分都是文件&#xff0c;那么我们需要在服务器端…...

Django QuerySet对象,exclude()方法

模型参考上一章内容&#xff1a; Django QuerySet对象&#xff0c;filter()方法-CSDN博客 exclude()方法&#xff0c;用于排除符合条件的数据。 1&#xff0c;添加视图函数 Test/app11/views.py from django.shortcuts import render from .models import Postdef index(re…...

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264

一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出&#xff0c;可以拿到本地摄像头设备信息&#xff0c;顺藤摸瓜&#xff0c;发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息&#xff0c;会…...

Go bufio包

bufio包&#xff1a; 带缓冲的I/O操作&#xff0c; 减少系统调用次数&#xff0c; 读取文件、网络数据。 bufio包 是什么 bufio 包是 Go 标准库中的一个非常有用的包&#xff0c;用于提供带缓冲的 I/O 操作。它通过缓冲来提高读取和写入的效率&#xff0c;可以有效减少系统调用…...

[iPhone USB网络共享]完全指南:从驱动故障到高效连接

[iPhone USB网络共享]完全指南&#xff1a;从驱动故障到高效连接 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mirr…...

【Python】安装 Python 环境

需要安装的环境主要是两个部分&#xff1a; 运行环境&#xff1a;Python开发环境&#xff1a;PyCharm 一、安装 Python 1、找到官方网站 Welcome to Python.org 2、找到下载页面 选择 "Download for Windows"&#xff1a; 现在主流使用的 Python 版本是 Python…...

intv_ai_mk11保姆级教学:输入‘你好’→追问第2点→指定表格输出,完整交互链路演示

intv_ai_mk11保姆级教学&#xff1a;输入你好→追问第2点→指定表格输出&#xff0c;完整交互链路演示 1. 快速了解intv_ai_mk11 intv_ai_mk11是一款基于Llama架构的AI对话助手&#xff0c;拥有7B参数规模&#xff0c;运行在GPU服务器上。它能帮助你完成各种任务&#xff0c;…...

别再死记公式了!用Multisim仿真软件,10分钟搞懂555定时器的三种工作模式

用Multisim玩转555定时器&#xff1a;可视化学习三种工作模式的终极指南 记得第一次接触555定时器时&#xff0c;我被那些复杂的公式和抽象的工作原理搞得晕头转向。直到一位资深工程师告诉我&#xff1a;"别急着背公式&#xff0c;先看看它怎么工作。"这句话彻底改变…...

技术Lead:不亲手解决问题,你的位置还稳吗?

做到技术Lead这个位置&#xff0c;很多人开始纠结一件事——到底该不该自己动手&#xff1f;技术Lead的尴尬&#xff0c;其实很具体比如前端设计阶段&#xff0c;团队在讨论一个时序收敛问题&#xff0c;工程师说某条路径的slack是-0.3ns&#xff0c;建议加pipeline。这时候Lea…...

seo实用工具对网站长期发展有什么影响

SEO实用工具对网站长期发展的影响 在当今数字化时代&#xff0c;网站的长期发展离不开搜索引擎优化&#xff08;SEO&#xff09;。而SEO实用工具&#xff0c;则是推动网站长期发展的重要助手。它们不仅帮助提升网站的搜索排名&#xff0c;还能够提供数据分析、关键词研究和竞争…...

Ostrakon-VL终端入门指南:如何导出结构化JSON结果用于BI工具接入

Ostrakon-VL终端入门指南&#xff1a;如何导出结构化JSON结果用于BI工具接入 1. 认识Ostrakon-VL终端 Ostrakon-VL终端是一款专为零售与餐饮行业设计的智能图像识别工具&#xff0c;它将复杂的AI技术包装成一个充满游戏感的像素风格界面。这个终端基于Ostrakon-VL-8B多模态大…...

Phi-4-mini-reasoning案例分享:用逻辑题测试模型对‘必要条件’的理解深度

Phi-4-mini-reasoning案例分享&#xff1a;用逻辑题测试模型对必要条件的理解深度 1. 模型能力定位 Phi-4-mini-reasoning是专为推理任务优化的文本生成模型&#xff0c;其核心优势在于处理需要多步逻辑推导的问题。与通用对话模型不同&#xff0c;它更擅长处理以下类型任务&…...

期权到期日别慌!手把手教你搞定上交所股票期权的行权与交割(附避坑清单)

期权到期日实战指南&#xff1a;从行权准备到交割避坑全流程解析 手机屏幕上的红色倒计时提醒着期权合约即将到期&#xff0c;作为刚接触期权交易不久的新手&#xff0c;此刻最需要的不再是复杂的概念解释&#xff0c;而是一份能握在手中的应急操作清单。本文将用最直白的语言拆…...

大数据在电力行业应用案例解析 -【电力技术】(25)RPA 在电力业扩报装中的自动化应用与实现

目录 一、引言:业扩报装的效率瓶颈 二、RPA 技术特点与电力适用性 三、RPA 在业扩报装中的四大核心应用场景 3.1 预受理自动审核 3.2 批量用户信息自动导入 3.3 勘查工单自动派工 3.4 流程自动流转与归档 四、RPA 实施流程(标准化) 五、典型应用成效 六、完整可运行…...