【数据结构】包装类和泛型
🎉欢迎大家收看,请多多支持🌹
🥰关注小哇,和我一起成长🚀个人主页🚀
⭐在更专栏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…...
[ZJCTF 2019]NiZhuanSiWei1
打开题目 php代码审计 .从代码中可以看出要求,以get方式传递text,file,password三个参数。 3.第一层验证if(isset($text)&&(file_get_contents($text,r)"welcome to the zjctf")) 传入text,而且file_get_contents($text,r)之后内容…...
【网络安全】副业兼职日入12k,网安人不接私活就太可惜了!
暑假来了,很多同学后台私信我求做兼职的路子,这里,我整理了一份详细攻略,请大家务必查收,这可能会帮你把几个学期的生活费都赚够! Up刚工作就开始做挖漏洞兼职,最高一次赚了12k,后面…...
[STM32]HAL库实现自己的BootLoader-BootLoader与OTA-STM32CUBEMX
目录 一、前言 二、BootLoader 三、BootLoader的实现 四、APP程序 五、效果展示 六、拓展 一、前言 听到BootLoader大家一定很熟悉,在很多常见的系统中都会存在BootLoader。本文将介绍BootLoader的含义和简易实现,建议大家学习前掌握些原理基础。 …...
鸿萌数据备份服务:中小型企业如何策划及实施云备份方案
天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据安全、数据备份、数据恢复、数据清除等解决方案与服务。 对于中小型企业来说,保护运营数据(客户记录、财务文档和项目文件)的重要性不言而喻…...
x264 编码过程中延迟逻辑分析
编码延迟相关参数 相关参数:在 common.h文件中 frames 结构体中声明关于编码延迟的变量int i_delay; /* Number of frames buffered for B reordering */ int i_bframe_delay; int64_t i_bframe_delay_time;编码延迟计算 编码延迟计算:在x264_encoder_open函数和x264_…...
前端框架 element-plus 发布 2.7.8
更新日志 功能 组件 [级联选择器 (cascader)] 添加持久化属性以提升性能 (#17526 by 0song)[日期选择器 (date-picker)] 类型添加月份参数 (#17342 by Panzer-Jack)[级联选择器 (cascader)] 添加标签效果属性 (#17443 by ntnyq)[加载 (loading)] 补充加载属性 (#17174 by zhixi…...
2024.8.1(前端服务器的配置以及tomcat环境的配置)
回顾 [roottomcat ~]# cd eleme_web/public/img/ [roottomcat img]# ls 1.jpg [roottomcat public]# cd [roottomcat ~]# cd eleme_web/ [roottomcat eleme_web]# cd src [roottomcat src]# vim views/HomeView.vue [roottomcat src]# nohup npm run serve ctrlc后网页不出…...
使用 宝塔面板 部署 语料库php网站
【语料库网站】宝塔面板 在线部署全过程 代码仓库:https://github.com/talmudmaster/RedCorpus 网站介绍 语料库提供双语文本检索和分享功能。供英语、翻译相关专业的爱好者,学生和老师学习使用。 该网站是对BiCorpus开源项目的二次开发。 技术栈&am…...
springboot农产品报价系统-计算机毕业设计源码37300
摘 要 本研究基于鸿蒙系统,设计开发了一款农产品报价系统小程序,旨在帮助商家与买家更便捷、高效地进行交易。该系统利用鸿蒙系统的优势,实现了跨平台应用程序的开发,同时利用定位技术和数据采集技术,为用户提供了个性…...
食源送系统项目的测试
一、对整个系统编写测试用例 功能测试 性能测试 兼容性测试 易用性测试 安全测试 二、接口测试 针对接口的功能测试,也就是检验接口是否按照接口文档输入输出 2.1 使用Postman发送HTTP请求 2.2 使用Java TestNG 编写自动化测试用例 登录界面功能 package com.sky.…...
wordpress设置静态访问不了/百度seo关键词排名优化
本文首发 http://zhaoda.net/2018/05/22/centos-php-nginx/转载请注明出处创建用户、组和目录 # web 用户和组 groupadd www useradd -g www www -s /sbin/nologin# 网站目录 mkdir -p /data/htdocs# 日志目录 mkdir -p /data/logs# 创建软件包下载和编译目录,后续软…...
国外的外贸网站/百度竞价排名又叫
动态库的概念和优势在这就不多说了,这里只说编译和调用。下面会一步步演示如何用编译使用动态库及如何解决问题。当然如何还会具体的演示调用技巧。1.直接用编译方式使用动态库。动态地将程序和动态库链接,并让其在执行时加载库(如果它已在内存中则不会重…...
怎么做网站seo优化/深圳网络品牌推广公司
演讲达人成长记——用身体提升演讲感染力 你是否想自信满满地站在讲台上?你是否想滔滔不绝地发表自己的观点?《演讲达人成长记》,助你早日在讲台上叱咤风云! 讲座主题: 时间:2013年1月26日上午9:45—11:30 …...
金万邦网站备案信息真实性核验单/莫停之科技windows优化大师
nextInt(nextFloat nextByte) next nextLine 1.读取方式上来讲 大家都以回车符作为结束符号 除了nextLine以外其余的方法都不读取回车符 2.读取的返回结果来讲 nextInt–>int nextFloat–float next–String nextLine–>String next方法看到回车或空格都认为结束, 但是他…...
wordpress 主题编辑/企点下载
一、发展现状 学前教育是基础教育的基础,是终身教育的起点,在素质教育战略中具有奠基性地位,改革开放以来,我国学前教育随着基础教育的发展,无论在数量和教学质量及管理方面,都有快速的发展和提高,截止2021…...
产品介绍网站设计怎么做/网络营销有哪些例子
1. 前言 前文中讲了shuffleMapTask如何运行,输出Shuffle结果到Shuffle_shuffleId_mapId_0.data数据文件中,每个executor需要向Driver汇报当前节点的Shuffle结果状态,Driver保存结果信息进行下个Task的调度。 2. StatusUpdate消息 当Execut…...