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

【数据结构】包装类和泛型

 🎉欢迎大家收看,请多多支持🌹

🥰关注小哇,和我一起成长🚀个人主页🚀

在更专栏Java ⭐数据结构

已更专栏有C语言、计算机网络⭐


👑目录

包装类🌙

⭐基本类型对应的包装类

⭐装箱与拆箱

🌈自动装箱和显式装箱

🚀自动装箱:

🚀显式装箱

🚀 Integer类的缓存机制:

🌈自动拆箱和显式拆箱

🚀自动拆箱

🚀显式拆箱

 🌈相关面试题及知识点

泛型🌙

⭐语法

🌈基本泛型类定义:

🌈多类型参数的泛型类:

🌈泛型类继承自其它泛型类:

🌈泛型类继承自特定类型的泛型类:

 🌈具体代码举例:

⭐泛型类的使用:

🌈语法:

🌈举例:

⭐裸类型(了解):

⭐泛型的擦除机制(泛型如何编译):

⭐泛型的上界

🌈语法:

🌈例子:

🌈复杂例子:

⭐泛型方法:

🌈方法示例:

🌈 使用方法示例:

🚀可以类型推导:

🚀不使用类型推导:


包装类🌙

Java中每个基本数据类型都对应了一个包装类,

除了int的包装类是Integer,char的包装类是Character,其他的基本类型对应的包装类都是将首字母大写。

⭐基本类型对应的包装类

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
charCharacter
booleanBoolean
floatFloat
doubleDouble

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)

🎉🎉本次内容结束啦

🌹如有问题,欢迎评论区讨论~~🌹

感谢支持🥰

 

相关文章:

【数据结构】包装类和泛型

&#x1f389;欢迎大家收看&#xff0c;请多多支持&#x1f339; &#x1f970;关注小哇&#xff0c;和我一起成长&#x1f680;个人主页&#x1f680; ⭐在更专栏Java ⭐数据结构 ⭐已更专栏有C语言、计算机网络⭐ &#x1f451;目录 包装类&#x1f319; ⭐基本类型对应的包…...

浅学爬虫-数据存储

在数据爬取完成后&#xff0c;我们需要将数据存储起来&#xff0c;以便于后续的分析和处理。常见的数据存储方式包括存储到CSV文件和存储到数据库。下面我们详细介绍如何实现这些存储方式。 存储到CSV CSV&#xff08;Comma-Separated Values&#xff09;文件是一种常用的文本…...

十六、maven git-快速上手(智慧云教育平台)

&#x1f33b;&#x1f33b; 目录 一、概述及项目管理工具介绍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浏览器插件开发入门与加载使用

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

【完美解决】 TypeError: ‘str’ object does not support item assignment

【完美解决】 TypeError: ‘str’ object does not support item assignment 在Python编程中&#xff0c;遇到TypeError: str object does not support item assignment这样的错误通常意味着你试图修改字符串中的某个字符&#xff0c;但字符串是不可变类型&#xff0c;不支持这…...

Android SurfaceFlinger——渲染开始帧(四十三)

通过前面的文章我们介绍了 SurfaceFlinger 图层合成的整体流程,已经对应步骤的前五步,这里我们开始介绍帧渲染流程的第一步——开始帧。 1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异…...

fastadmin搜索栏实现某字段动态下拉搜索

记录&#xff1a;fastadmin搜索栏实现某字段动态下拉搜索 方式一&#xff1a;使用selectpicker组件&#xff0c;可多选 { field: travel_agency, title:__(Travel_agency),addClass:"selectpicker", operate:"IN",data:"multiple", searchList:…...

.NET未来路在何方?

简述 在软件开发的漫长旅程中&#xff0c;将代码打包成可执行的EXE文件是一项必不可少的技能。它不仅能够保护源代码&#xff0c;还能为用户提供便捷的安装体验。但手动打包过程繁琐且容易出错&#xff0c;自动化打包成为了开发者的福音。 在软件开发的浩瀚星空中&#xff0c;.…...

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、如何判断队列是否为空&#xff08;假溢出问题&#xff09;&#xff1f;2.4、实现代码 二、用栈实现队列1、题目简述2、方法讲解2.1、讲解2.2、实现代码 三、用队列实现栈1、题目…...

【Hot100】LeetCode—31. 下一个排列

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

找到学习的引擎,更让你进入心流状态的高效学习

一、心流状态的启动秘籍 1. 简单开始&#xff1a;找到学习的入口 从简单的任务开始&#xff0c;比如整理学习空间或列出学习计划&#xff0c;让大脑逐渐适应学习的节奏。 2. 环境塑造&#xff1a;打造专注的学习空间 清理桌面&#xff0c;减少干扰&#xff0c;比如将手机置…...

QItemDelegate QItemDelegate QItemDelegate

qtreeview点击某一行有颜色显示 c 在Qt中&#xff0c;要实现QTreeView点击某行有颜色显示&#xff0c;可以通过设置QTreeView的itemDelegate来自定义显示样式。以下是一个简单的例子&#xff0c;演示如何为QTreeView的项设置点击时的背景颜色。 #include <QApplication>…...

MySQL数据库 外键默认约束和action 基础知识【2】推荐

数据库就是储存和管理数据的仓库&#xff0c;对数据进行增删改查操作&#xff0c;其本质是一个软件。MySQL就是一种开源的关系型数库&#xff0c;也是最受欢迎的数据库之一&#xff0c;今天对MySQL数据的基础知识做了整理&#xff0c;方便自己查看&#xff0c;也欢迎正在学习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&#xff08;Node Package Manager&#xff09;的源管理器&#xff0c;它允许用户轻松地在不同的npm源之间进行切换。在Node.js的生态系统中&#xff0c;nrm 提供了一种方便的方式来管理registry源&#xff0c;这对于那些需要从不同的npm源下载或发布包的开发…...

匿名管道+进程池+命名管道

mkfifo name_pipe 创建管道文件。 命名管道&#xff1a; 路径文件名具有唯一性。 匿名管道&#xff1a; 进程池代码&#xff1a; #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&#xff0c;在用户创建时&#xff0c;会自动给用户创建用户默认的shell。默认的shell就是/bin/bash。要修改shell将其设置为/bin/ksh&#xff0c;有两种方法方法 # 方法一: chsh -s /bin/ksh chsh -s /bin/zsh # 方法二: usermod -s /b…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...