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

[ 数据结构 ] 泛型 (上)

目录

一. 包装类

1.基本数据类型对应的 包装类

包装类的主要用途

2. 装箱和拆箱

①装箱操作 :

②拆箱操作 : 

③自动装箱与拆箱 : 

④缓存机制 : 

二. 泛型

1.语法

三 .泛型类的使用

1.语法

2.类型推导

四.泛型的使用

1.擦除机制

2.泛型的通配符

3 泛型方法

①语法

②示例 (swap)


一. 包装类

在Java中 , 由于基本类型不是继承自Object , 为了在泛型代码中可以支持基本类型 , Java给每个基本类型都对应了一个包装类型

1.基本数据类型对应的 包装类

基本数据类型包装类
byte

Byte

shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

包装类的主要用途

  • 将基本数据类型转换为对象 包装类允许基本数据类型以对象的形式存在 , 便于在集合(如ArrayList , HashMap)中是使用
  • 提供实用方法  包装类提供了许多实用方法 例如 Integer.parseInt()Double.toString() 等
  • 支持自动装箱与拆箱  Java5 引入了自动装箱和自动拆箱的功能 , 简化了基本数据类型与包装类之间的切换

2. 装箱和拆箱

①装箱操作 :

  • 将 基本类型对象 转换为 包专类型对象
  • 例如 : 创建一个Interger类型对象 , 将 i 的值放入对象的某个属性当中

②拆箱操作 : 

  • 将 包装类型对象 转换为 基本类型对象
  • 例如 : 将Interger 对象中的值取出 , 放到一个基本数据类型中

③自动装箱与拆箱 : 

Java 5 引入了 自动装箱 和 拆箱 功能,简化了基本数据类型与包装类之间的转换。

    public static void main(String[] args) {int i = 10;//装箱操作Integer ii = Integer.valueOf(i);//显式装箱Integer io = new Integer(i);//显式装箱Integer ia = 12;//自动装箱Integer is = i;//自动装箱Integer ib = (Integer) i;//自动装箱//拆箱操作int jv = ii.intValue();//显式拆箱int ja = ii;//自动拆箱int js = (int)ii;//自动拆箱}

④缓存机制 : 

IntegerShortByteCharacterLong在-128到127之间有缓存,直接使用 == 比较可能返回true

即对象若在 -128到127 之间 , 则第二次使用就会有缓存 , 不用 new 新的对象

    public static void main(String[] args) {Integer a = 127;Integer b = 127;Integer c = 128;Integer d = 128;System.out.println(a.equals(b));//trueSystem.out.println(c.equals(d));//trueSystem.out.println(a == b);//true(-128到127之间有缓存)System.out.println(c == d);//false}

二. 泛型

泛型是Java中引入的一种类型参数化机制,允许在类、接口或方法中使用类型参数

简单来说 : 泛型 :就是 适用于许多类型 .

从代码上讲 , 就是对类型是是实现了参数化

泛型的主要目的 : 指定当前的容器, 要持有什么类型的对象 

1.语法

class 泛型类名称<类型形参列表> {// 这里可以使用类型参数
}class ClassName<T1, T2, ..., Tn> {  
}
class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {// 这里可以使用类型参数
}class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {// 可以只使用部分类型参数
}


例子 : 实现一个类 , 类中包含一个数组成员 , 使得数组中可以存放任何类型的数据

import java.util.Arrays;//实现一个类 , 类中包含一个数组成员 , 使得数组中可以存放任何类型的数据
class MyArray<T>{public Object[] array = new Object[10];public T getArray(int pos) {return  (T)this.array[pos];}public void setArray(T val,int pos) {this.array[pos] = val;}@Overridepublic String toString() {return   Arrays.toString(array) ;}
}
        public static void main(String[] args) {MyArray<Integer> myArray1 = new MyArray<Integer>();myArray1.setArray(10,0);myArray1.setArray(12,1);//myArray1.setArray("aa",2);//自动类型检查Integer ret = myArray1.getArray(0);System.out.println(myArray1);MyArray<String> str = new MyArray<String>();str.setArray("shs",3);System.out.println(str);}

代码注释

①类名后的 <T> 代表占位符 , 表示当前类是一个泛型类

② 类型后加入 <Integer> 等 , 用来指定当前类型

③代码编译报错 , 此时因为 当前指定类型为 <Integer> ,在此处存放元素时会帮助我们进行类型检查


三 .泛型类的使用

  •  泛型类是使用泛型特性定义的类,即在类声明中引入了类型参数
  • 泛型类是泛型的一种具体应用形式

1.语法

泛型类<类型实参> 变量名; // 定义一个泛型类引用
new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象
MyArray<Integer> list = new MyArray<Integer>();

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


2.类型推导

当便以其可以根据上下文推导出类型实参时 , 可以省略类型实参的填写

MyArray<Integer> list = new MyArray<>(); // 可以推导出实例化需要的类型实参为 Integer

四.泛型的使用

1.擦除机制

  • 在编译过程中 , 将所有 T 替换为 Object 这种机制,称为 : 擦除机制
  • Java的泛型是通过类型擦除实现的,即在编译后泛型类型信息会被擦除,替换为原始类型(如Object)或边界类型。例如,Box<String>在运行时会被擦除为Box
Box<String> stringBox = new Box<>();
Box<Integer> integerBox = new Box<>();
// 编译后,两者的类类型相同,均为Box

Java的泛型机制是在编译级别实现的 , 编译器生成的字节码在运行期间并不包含泛型的类型信息


2.泛型的通配符

泛型通配符 ? 用于表示未知类型,通常用于方法参数或变量声明中

  • <?>:无界通配符,表示任何类型。
  • <? extends T>:上界通配符,表示T或其子类。
  • <? super T>:下界通配符,表示T或其父类。

3 泛型方法

①语法

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }

②示例 (swap)

//静态的泛型方法 需要在static后用 <> 声明泛型类型参数public static <E> void swap(E[] array,int i,int j){E t = array[i];array[i] = array[j];array[j] = t;} 

http://www.xdnf.cn/news/17751.html

相关文章:

  • 云蝠智能 VoiceAgent 在不良资产处理中的技术应用与实践
  • VUE3中的内置 API
  • 2025_07_安装Jmeter,创建一个登录请求
  • 力扣top100(day02-05)--二叉树 02
  • 1.4.2 嵌入(embedding)模式:让人工智能大模型为你的产品或业务助力
  • ACWing 算法基础课-数据结构笔记
  • imx6ull-驱动开发篇22——Linux 时间管理和内核定时器
  • Linux系统文件完整性检查工具AIDE在生产环境中推送钉钉告警
  • [SpringBoot2] Redis使用消息队列实现邮件通知的流程说明
  • CacheBlend:结合缓存知识融合的快速RAG大语言模型推理服务
  • 小白挑战一周上架元服务——ArkUI04
  • Docker使用----(安装_Windows版)
  • 树结构无感更新及地图大批量点位上图Ui卡顿优化
  • Spring AI Alibaba - 聊天机器人快速上手
  • 机器学习——DBSCAN
  • 读《精益数据分析》:UGC平台的数据指标梳理
  • Go面试题及详细答案120题(0-20)
  • 【工具】通用文档转换器 推荐 Markdown 转为 Word 或者 Pdf格式 可以批量或者通过代码调用
  • 【前端:Html】--3.进阶:图形
  • c#联合Halcon进行OCR字符识别(含halcon-25.05 百度网盘)
  • 解决H616用网络的IP地址连不上
  • 考研复习-计算机组成原理-第五章-CPU
  • MySQL User表入门教程
  • 计算机视觉(7)-纯视觉方案实现端到端轨迹规划(思路梳理)
  • 从爬虫新手到DrissionPage实践者的技术旅程
  • MCU中的液晶显示屏LCD(Liquid Crystal Display)控制器
  • Unity UnityWebRequest常用操作
  • 使用pyqt5实现可勾选的测试用例界面
  • 99、【OS】【Nuttx】【构建】cmake 配置实操:问题解决
  • 【模型剪枝2】不同剪枝方法实现对 yolov5n 剪枝测试及对比