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中,由于基本数据类型不是继承Object类,为了在泛型代码中可以支持基本数据类型,Java给每个基本数据类型各自提供了一个包装类。 如下图 除了char和int基本数据类型的包装类型有点特别,其他的都是首字…...

如何优化 PostgreSQL 中对于复杂数学计算的查询?
文章目录 一、理解复杂数学计算的特点二、优化原则(一)索引优化(二)查询重写(三)数据库配置调整(四)使用数据库内置函数的优势 三、具体的优化方案和示例(一)…...

前端面试题27(在实际项目中,如何有效地利用Vue3的响应式系统提高性能?)
在实际项目中,有效利用Vue3的响应式系统提高性能主要涉及以下几个关键点: 1. 合理使用reactive和ref reactive:用于将复杂的数据结构(如对象或数组)转换成响应式版本。确保只将需要实时更新的数据结构声明为响应式&am…...

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

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

【网络安全】一文带你了解什么是【网络劫持】
网络劫持(Network Hijacking)是一种网络攻击,攻击者通过非法手段劫持网络通信,导致合法用户的数据流被拦截、篡改或重定向到攻击者控制的系统。这种攻击可以在各种网络层面上进行,包括域名系统(DNS…...

springcloud分布式架构网上商城 LW +PPT+源码+讲解
3系统分析 3.1可行性分析 在开发系统之前要进行系统可行性分析,目的是在用最简单的方法去解决最大的问题,程序一旦开发出来满足了用户的需要,所带来的利益也很多。下面我们将从技术、操作、经济等方面来选择这个系统最终是否开发。 3.1.1技术…...

【Linux】动态库的制作与使用
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

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

贝叶斯估计(1):期末大乱炖
写在前面! 1 先验分布和后验分布 三种信息:总体信息、样本信息、先验信息 总体信息:“总体是正态分布”;样本信息:总体抽取的样本提供的信息,是最新鲜的信息;先验信息:在抽样之前就…...

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

java开发报错
查了一下啊。...

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

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

开始尝试从0写一个项目--前端(一)
基础项目构建 创建VUE初始工程 确保自己下载了node.js和npm node -v //查看node.js的版本 npm -v //查看npm的版本 npm i vue/cli -g //安装VUE CLI 创建 以管理员身份运行 输入:vue ui 就会进入 点击创建 自定义项目名字,选择npm管理 结…...

【Java探索之旅】多态:向上下转型、多态优缺点、构造函数陷阱
文章目录 📑前言一、向上转型和向下转型1.1 向上转型1.2 向下转型 二、多态的优缺点2.1 多态优点2.2 多态缺陷 三、避免避免构造方法中调用重写的方法四、好的习惯🌤️全篇总结 📑前言 在面向对象编程中,向上转型和向下转型是常用…...

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

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

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264
一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出,可以拿到本地摄像头设备信息,顺藤摸瓜,发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息,会…...

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

C++ 类和对象 拷贝构造函数
一 拷贝构造函数的概念: 拷贝构造函数是一种特殊的构造函数,用于创建一个对象是另一个对象的副本。当需要用一个已存在的对象来初始化一个新对象时,或者将对象传递给函数或从函数返回对象时,会调用拷贝构造函数。 二 拷贝构造函…...

C# —— Math对象
Math 数学类 提供了一些相关数学计算的属性和方法、四舍五入、向上求整、向下求整、开平方,几次方 最大值和最小值 sin cos 绝对值 方法 1.Math 常用的字段 Math.PI double x 2 * 180 / Math.PI; Console.WriteLine(x); 2 Math.Abs() 求绝对值 int a -3; Con…...

Face_recognition实现人脸识别
这里写自定义目录标题 欢迎使用Markdown编辑器一、安装人脸识别库face_recognition1.1 安装cmake1.2 安装dlib库1.3 安装face_recognition 二、3个常用的人脸识别案例2.1 识别并绘制人脸框2.2 提取并绘制人脸关键点2.3 人脸匹配及标注 欢迎使用Markdown编辑器 本文基于face_re…...

1-3分钟爆款视频素材在哪找啊?这9个热门爆款素材网站分享给你
在如今快节奏的时代,短视频已成为吸引观众注意力的黄金手段。然而,要制作出1-3分钟的爆款视频,除了创意和剪辑技巧外,选择合适的素材至关重要。那么,哪里可以找到那些能让你的视频脱颖而出的爆款素材呢?不用…...

武汉免费 【FPGA实战训练】 Vivado入门与设计师资课程
一.背景介绍 当今高度数字化和智能化的工业领域,对高效、灵活且可靠的技术解决方案的需求日益迫切。随着工业 4.0 时代的到来,工业生产过程正经历着前所未有的变革,从传统的机械化、自动化逐步迈向智能化和信息化。在这一背景下&…...

【vite创建项目】
搭建vue3tsvitepinia框架 一、安装vite并创建项目1、用vite构建项目2、配置vite3、找不到模块 “path“ 或其相对应的类型声明。 二、安装element-plus1、安装element-plus2、引入框架 三、安装sass sass-loader1、安装sass 四、安装vue-router-next 路由1、安装vue-router42搭…...

最优化方法 运筹学【】
1.无约束 常用公式 线搜索准则:求步长 精确线搜索(argmin) 最速下降:sd:线性收敛 2.算法 SD dk:付梯度-g newton dk:Gkd-g 二阶收敛,步长为1 阻尼牛顿:步长用先搜…...

探索 WebKit 的动感世界:设备方向和运动支持全解析
探索 WebKit 的动感世界:设备方向和运动支持全解析 随着移动设备的普及,网页应用对设备方向和运动的感知需求日益增长。WebKit 作为众多流行移动浏览器的渲染引擎,提供了对设备方向和运动的全面支持,使得 Web 应用能够根据设备的…...

高考假期预习指南
IT专业入门,高考假期预习指南 对于希望进入IT行业的学生来说,假期是学习信息技术的最佳时机。 在信息化快速发展的时代,IT行业的发展前景广阔,但高技能要求使新生可能感到迷茫。 建议新生制定详细的学习计划,包括了解…...

Spring Boot 事件监听机制工作原理
前言: 我们知道在 Spring 、Spring Boot 的启动源码中都大量的使用了事件监听机制,也就是我们说的的监听器,监听器的实现基于观察者模式,也就是我们所说的发布订阅模式,这种模式可以在一定程度上实现代码的解耦&#…...