【数据结构】包装类和泛型
🎉欢迎大家收看,请多多支持🌹
🥰关注小哇,和我一起成长🚀个人主页🚀
⭐在更专栏Java ⭐数据结构
⭐已更专栏有C语言、计算机网络⭐
👑目录
包装类🌙
⭐基本类型对应的包装类
⭐装箱与拆箱
🌈自动装箱和显式装箱
🚀自动装箱:
🚀显式装箱
🚀 Integer类的缓存机制:
🌈自动拆箱和显式拆箱
🚀自动拆箱
🚀显式拆箱
🌈相关面试题及知识点
泛型🌙
⭐语法
🌈基本泛型类定义:
🌈多类型参数的泛型类:
🌈泛型类继承自其它泛型类:
🌈泛型类继承自特定类型的泛型类:
🌈具体代码举例:
⭐泛型类的使用:
🌈语法:
🌈举例:
⭐裸类型(了解):
⭐泛型的擦除机制(泛型如何编译):
⭐泛型的上界
🌈语法:
🌈例子:
🌈复杂例子:
⭐泛型方法:
🌈方法示例:
🌈 使用方法示例:
🚀可以类型推导:
🚀不使用类型推导:
包装类🌙
Java中每个基本数据类型都对应了一个包装类,
除了int的包装类是Integer,char的包装类是Character,其他的基本类型对应的包装类都是将首字母大写。
基本数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
boolean | Boolean |
float | Float |
double | Double |
Java中的泛型中,不能直接使用基本数据类型作为类型参数;
如果需要使用与基本数据类型相关的泛型,应该使用它们对应的包装类。
⭐装箱与拆箱
又叫装包或拆包。
🌈自动装箱和显式装箱
🚀自动装箱:
自动地将基本数据类型(如int、double等)转换为它们对应的包装类(如Integer、Double等)
int a = 6;//自动装箱Integer b = a;Integer b2 = (Integer)a;
🚀显式装箱
int a = 6;//显式装箱,调用valueOf()方法Integer d = Integer.valueOf(888);Integer d2 = Integer.valueOf(a);Integer d3 = new Integer(a);//已弃用,避免使用
🚀 Integer类的缓存机制:
这个缓存机制默认缓存 -128~127的所以Integer对象。
当你创建Integer类型的对象时,(使用.valueOf或自动装箱来创建对象,)
如果值在这个范围内,Java会直接从内存中返回已经存在的对象,而不是创建新对象。
因此在这个范围内的Integer变量可能指向同一个对象示例。
为什么是可能?
如果使用显式装箱new Integer(int value)来创建,那么即使值在 -128~127这个范围内,也不会从内存中调用已经存在的对象,而是创建一个新的对象示例。
🌈自动拆箱和显式拆箱
🚀自动拆箱
Integer a = 99;//自动拆箱int b = a;int b2 = (int)a;
🚀显式拆箱
Integer a = 99;//显式拆箱int c = a.intValue();double d = a.doubleValue();
🌈相关面试题及知识点
下面代码输出内容是什么?
public static void main(String[] args) {Integer aa = 128;Integer bb = 128;System.out.println(aa == bb);Integer a = 127;Integer b = 127;System.out.println(a == b);}
答案是false和true
为什么呢?
这涉及两个知识点:Integer的缓存机制、引用类型的比较方式。
这里用自动装箱将int类型值转换为Integer对象,其中a和b为127,在 -128~127这个范围内,因此a和b都指向内存中返回的同一个对象。
而aa、bb值不在范围内,因此aa、bb各自创建一个新的对象。
另外,代码中是用 == 来比较的,在引用类型中,==比较的是实例对象的地址,.equals()比较的是对象的内容,.compareTo()比较的是内容大小。
a和b指向同一个对象,因此 a==b结果为true;
aa和bb指向的不是同一个对象,因此 aa==bb结果为false。
泛型🌙
通俗讲,泛型就是适用于许多类型。
从代码角度上看,泛型就是将类型参数化。编译时自动进行类型检查和转换
泛型的主要目的:
就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。
⭐语法
🌈基本泛型类定义:
class 泛型类名称<类型形参列表> { // 这里可以使用类型参数
}
这里的泛型类名称是类的名称就,<类型形参列表>是定义在尖括号中的类型参数列表,它们是占位符,用于在类的定义中指定不确定的类型。
例如
class Box<T> { private T t; public void set(T t) {this.t = t; } public T get() {return t; }
}
🌈多类型参数的泛型类:
class ClassName<T1, T2, ..., Tn> {
}
该类可以拥有多个类型参数。类型参数之间用逗号分隔。这样的类可以更加灵活,因为它可以同时处理多种类型的数据。
例如:
class Pair<K, V> { private K key; private V value; public void setKey(K key) {this.key = key; } public void setValue(V value) { this.value = value; } public K getKey() { return key;} public V getValue() { return value;}
}
🌈泛型类继承自其它泛型类:
class 泛型类名称<类型形参列表> extends 继承类<这里可以使用类型参数> { // 这里可以使用类型参数
}
当泛型类继承自另一个泛型类时,子类可以定义自己的类型参数列表,并且可以在继承时使用父类的类型参数。子类可以选择性地覆盖或保留父类的类型参数。
例如:
class GenericList<E> { // 假设这里有一些与E类型相关的操作
} class MyList<T> extends GenericList<T> { // 这里可以直接使用T,因为T被传递给了GenericList
}
🌈泛型类继承自特定类型的泛型类:
class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> { // 可以只使用部分类型参数
}
🌈具体代码举例:
class MyArray<T> {public Object[] array = new Object[10];public T getPos(int pos) {return (T)this.array[pos];}public void setVal(int pos,T val) {this.array[pos] = val;}}public class TestDemo {public static void main(String[] args) {MyArray<Integer> myArray = new MyArray<>();//1myArray.setVal(0,10);myArray.setVal(1,12);int ret = myArray.getPos(1);//2System.out.println(ret);myArray.setVal(2,"Java");//3,此处报错}}
注释1处,类型后加入<Integer>指定当前类型。
注释2处不用再进行强制类型转换,因为在getpos()中返回值前就转换了。
注释3处报错,"Java"是String类型,但myArray已经指定了Integer类型,编译报错。编译器会在我们存放元素时进行类型检查。
类名后的<T>代表占位符,表示当前类是一个泛型类,< >中必须是引用类型,不能是基本数据类型。
类型形参一般用一个大写字母表示,常见的有:
T代表Type E代表Element K代表Key V代表Value
N代表Number S、U、V……第二、第三、第四个类型
⭐泛型类的使用:
🌈语法:
泛型类<类型参数> 变量名字; //定义一个泛型类引用
new 泛型类<类型实参> (构造方法实参); //实例化一个泛型类对象
🌈举例:
MyArray<Integer> arr = new MyArray<Integer>();
当编译器可根据上下文推导处类型参数的时候,可以省略< >中的类型参数
MyArray<Integer> arr = new MyArray<>();
⭐裸类型(了解):
是一个泛型类,但是没有类型实参:
MyArray arr = new MyArray();
我们不需要自己去使用裸类型,它是为了兼容老版本的API保留的机制。
⭐泛型的擦除机制(泛型如何编译):
在编译过程中将所有的T替换为Object,这种机制就是擦除机制。
当泛型类被类型擦除时,如果泛型类中的类型参数部分指定上限(如<T extends String>),则类型参数会被替换成类型上限。
Java的泛型机制是在编译级别实现的,因此编译器生成的字节码文件中不包含泛型的类型信息。
⭐泛型的上界
🌈语法:
class 泛型类名称<类型形参 extends 类型边界> {...}
注意与继承了其它泛型类的泛型类区别
🌈例子:
public class MyArray<E extends Number> {...}
这里只接收Number的子类作为类型参数
MyArray<Integer> l1; // 正常,因为 Integer 是 Number 的子类型
MyArray<String> l2; // 编译错误,因为 String 不是 Number 的子类型
没有指定类型上界时,可视为<E extends Object>
🌈复杂例子:
public class MyArray<E extends Comparable<E>> {...}
这里表示类型参数E必须是实现了Comparable<E>接口的任何类型,实现了这个接口后,
这个类的对象可以与其它同类型的对象进行比较。
⭐泛型方法:
方法限定符 返回值类型 方法名称(形参列表) { ... }
🌈方法示例:
public class Util {//静态的泛型方法 需要在static后用<>声明泛型类型参数public static <E> void swap(E[] array, int i, int j) {E t = array[i];array[i] = array[j];array[j] = t;}}
🌈 使用方法示例:
🚀可以类型推导:
Integer[] a = { ... };swap(a, 0, 9);String[] b = { ... };swap(b, 0, 9);
🚀不使用类型推导:
Integer[] a = { ... };Util.<Integer>swap(a, 0, 9);String[] b = { ... };Util.<String>swap(b, 0, 9)
🎉🎉本次内容结束啦
🌹如有问题,欢迎评论区讨论~~🌹
感谢支持🥰
相关文章:

【数据结构】包装类和泛型
🎉欢迎大家收看,请多多支持🌹 🥰关注小哇,和我一起成长🚀个人主页🚀 ⭐在更专栏Java ⭐数据结构 ⭐已更专栏有C语言、计算机网络⭐ 👑目录 包装类🌙 ⭐基本类型对应的包…...
浅学爬虫-数据存储
在数据爬取完成后,我们需要将数据存储起来,以便于后续的分析和处理。常见的数据存储方式包括存储到CSV文件和存储到数据库。下面我们详细介绍如何实现这些存储方式。 存储到CSV CSV(Comma-Separated Values)文件是一种常用的文本…...

十六、maven git-快速上手(智慧云教育平台)
🌻🌻 目录 一、概述及项目管理工具介绍1.1 项目介绍1.2 maven 介绍及其配置1.2.1 maven 介绍1.2.2 maven 下载与配置 1.3 pom 中常见标签的使用1.4 后端项目环境的搭建1.5 Git 简介1.6 Git 的基本使用1.6.1 码云的注册与仓库创建1.6.2 上传代码到码云仓库…...

chrome/edge浏览器插件开发入门与加载使用
同学们可以私信我加入学习群! 正文开始 前言一、插件与普通前端项目二、开发插件——manifest.json三、插件使用edge浏览器中使用/加载插件chrome浏览器中使用/加载插件 总结 前言 chrome插件的出现,初衷可能是为了方便用户更好地控制浏览器,…...

【完美解决】 TypeError: ‘str’ object does not support item assignment
【完美解决】 TypeError: ‘str’ object does not support item assignment 在Python编程中,遇到TypeError: str object does not support item assignment这样的错误通常意味着你试图修改字符串中的某个字符,但字符串是不可变类型,不支持这…...
Android SurfaceFlinger——渲染开始帧(四十三)
通过前面的文章我们介绍了 SurfaceFlinger 图层合成的整体流程,已经对应步骤的前五步,这里我们开始介绍帧渲染流程的第一步——开始帧。 1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异…...
fastadmin搜索栏实现某字段动态下拉搜索
记录:fastadmin搜索栏实现某字段动态下拉搜索 方式一:使用selectpicker组件,可多选 { field: travel_agency, title:__(Travel_agency),addClass:"selectpicker", operate:"IN",data:"multiple", searchList:…...
.NET未来路在何方?
简述 在软件开发的漫长旅程中,将代码打包成可执行的EXE文件是一项必不可少的技能。它不仅能够保护源代码,还能为用户提供便捷的安装体验。但手动打包过程繁琐且容易出错,自动化打包成为了开发者的福音。 在软件开发的浩瀚星空中,.…...

Vue开发环境搭建
文章目录 引言I 安装NVM1.1 Windows系统安装NVM,实现Node.js多版本管理1.2 配置下载镜像1.3 NVM常用操作命令II VUE项目的基础配置2.1 制定不同的环境配置2.2 正式环境隐藏日志2.3 vscode常用插件引言 开发工具: node.js 、npm 开发编辑器:vscode 开发框架:VUE I 安装NVM…...

【数据结构初阶】详解:实现循环队列、用栈实现队列、用队列实现栈
文章目录 一、循环队列1、题目简述2、方法讲解2.1、了解tail的指向2.2、了解空间是如何利用的2.3、如何判断队列是否为空(假溢出问题)?2.4、实现代码 二、用栈实现队列1、题目简述2、方法讲解2.1、讲解2.2、实现代码 三、用队列实现栈1、题目…...

【Hot100】LeetCode—31. 下一个排列
目录 题目1- 思路2- 实现⭐31. 下一个排列——题解思路 3- ACM 实现 题目 原题连接:31. 下一个排列 1- 思路 技巧题,分为以下几个步骤 ① 寻找拐点: i 1 :出现 nums[i1] > nums[i] ,则 i 1 就是拐点 从右向左遍…...

找到学习的引擎,更让你进入心流状态的高效学习
一、心流状态的启动秘籍 1. 简单开始:找到学习的入口 从简单的任务开始,比如整理学习空间或列出学习计划,让大脑逐渐适应学习的节奏。 2. 环境塑造:打造专注的学习空间 清理桌面,减少干扰,比如将手机置…...
QItemDelegate QItemDelegate QItemDelegate
qtreeview点击某一行有颜色显示 c 在Qt中,要实现QTreeView点击某行有颜色显示,可以通过设置QTreeView的itemDelegate来自定义显示样式。以下是一个简单的例子,演示如何为QTreeView的项设置点击时的背景颜色。 #include <QApplication>…...

MySQL数据库 外键默认约束和action 基础知识【2】推荐
数据库就是储存和管理数据的仓库,对数据进行增删改查操作,其本质是一个软件。MySQL就是一种开源的关系型数库,也是最受欢迎的数据库之一,今天对MySQL数据的基础知识做了整理,方便自己查看,也欢迎正在学习My…...
JS正则表达式学习与实践
JS正则表达式学习笔记 1 学习笔记1.1 字符类1.2 量词和分支1.3 标志1.4 锚点1.5 断言 2 常用正则2.1 检查微信浏览器2.2 检查移动端浏览器2.3 检查中文字符2.4 手机号严格2.5 手机号比较宽松2.6 手机号宽松2.7 邮箱验证2.8 金额格式2.9 身份证号2.10 至少8为有数字、大小写字符…...

Java数据结构(五)——栈和队列
文章目录 栈和队列栈基本概念栈的模拟实现集合框架中的栈栈的创建栈的方法栈的遍历 栈的应用及相关练习括号匹配逆波兰表达式求值出栈入栈次序匹配最小栈 几个含"栈"概念的区分 队列基本概念队列的模拟实现循环队列双端队列集合框架中的队列队列的创建队列的方法队列…...
工具使用:nrm使用以及n模块
nrm nrm 是一个npm(Node Package Manager)的源管理器,它允许用户轻松地在不同的npm源之间进行切换。在Node.js的生态系统中,nrm 提供了一种方便的方式来管理registry源,这对于那些需要从不同的npm源下载或发布包的开发…...

匿名管道+进程池+命名管道
mkfifo name_pipe 创建管道文件。 命名管道: 路径文件名具有唯一性。 匿名管道: 进程池代码: #include<iostream> #include<unistd.h> #include<cstdlib> #include<cassert> #include<vector> #include&…...

【深度学习】【语音TTS】OpenVoice: Versatile Instant Voice Cloning,论文
https://github.com/myshell-ai/OpenVoice https://arxiv.org/abs/2312.01479 文章目录 摘要1 引言2 方法2.1 直观思路2.2 模型结构2.3 训练细节3 结果4 结论摘要 我们介绍了OpenVoice,一种多功能的即时语音克隆方法,只需参考说话者的短音频片段即可复制其声音,并生成多语…...

一六零、云服务器开发机配置zsh
切换shell 在Linux中默认使用/bin/bash,在用户创建时,会自动给用户创建用户默认的shell。默认的shell就是/bin/bash。要修改shell将其设置为/bin/ksh,有两种方法方法 # 方法一: chsh -s /bin/ksh chsh -s /bin/zsh # 方法二: usermod -s /b…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...