Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据结构-1.初始包装类与泛型

数据结构-1.初始包装类与泛型

作者头像
用户11369350
发布于 2024-11-19 10:48:05
发布于 2024-11-19 10:48:05
590
举报

本节目标:学习包装类与泛型为阅读java集合源码打下基础.

1.包装类

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

1.1基本数据类型对应包装类

基本数据类型

包装类

byte

Byte

short

Short

int

Integer

float

Float

double

Double

char

Character

boolean

Boolean

long

Long

除了Integer和Character,其余基本数据类型的包装类都是首字母大写

1.2.装箱和拆箱

int num = 10;

Integer a = num;//自动装箱

Integer b = (Integer) num;//自动装箱

int c = a;//自动拆箱

int d = (int)b;//自动拆箱

//装箱操作,新建一个Integer类型对象,将i的值放入对象的某个属性中

Integer num1 = Integer.valueOf(num);//显示装箱

Integer num2 = new Integer(num);//显示装箱

//拆箱操作,将Integer对象中的值取出,放到一个基本数据类型中

int num3 = num1.intValue();//显示装箱

1.3面试题:下列代码输出什么,为什么?

Integer a = 127;

Integer b = 127;

Integer c = 128;

Integer d = 128;

System.out.println(a == b);//1

System.out.println(c == d);//2

1输出:true

2输出:false

为什么?

由于对Integer类型的变量进行赋值,本质上就是在调用valueOf(int i)方法,所以对其进行分析:

2.泛型

2.1什么是泛型

《 Java 编程思想》对泛型的介绍:一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类.如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。

泛型是在 JDK1.5 引入的新的语法,通俗讲,泛型: 就是适用于许多许多类型 。从代码上讲,就是对类型实现了参数化。

2.2引出泛型

实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值?

我们以前学过的数组,只能存放指定类型的元素,例如: int[] array = new int[10]; String[] strs = new String[10];

所有类的父类默认为 Object 类。数组是否可以创建为 Object?

class MyArray {

public Object[] array = new Object[10];

public Object getPos(int pos) {

return this.array[pos];

}

public void setArray(int pos,Object val) {

this.array[pos] = val;

}

}

public class Test {

public static void main(String[] args) {

MyArray myArray = new MyArray();

myArray.setArray(0,1);

myArray.setArray(1,"hahaha");

String ret = myArray.getPos(1);//编译报错,需要强制类型转换

System.out.println(ret);

}

}

以上代码实现后发现:

1.任何类型数据都可以存放

2. 1下标本身就是字符串,赋值给字符串变量却编译报错,必须强制类型转换

虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种数据类型。而不是同时持有这么多类型。所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译 器去做检查。 此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

2.3语法

class 泛型类名称 < 类型形参列表 > {

// 这里可以使用类型参数

}

class ClassName < T1 , T2 , ..., Tn > {

}

class 泛型类名称 < 类型形参列表 > extends 继承类 /* 这里可以使用类型参数 */ {

// 这里可以使用类型参数

}

class ClassName < T1 , T2 , ..., Tn > extends ParentClass < T1 > {

// 可以只使用部分类型参数

}

//<T>:表示当前类是一个泛型类

class MyArray<T> {

//写法一:

//public Object[] array = new Object[10];

//写法二:

//public T[] array = new T[10];//不能new泛型类型的数组.还是new Object类型数组然后将其转换为T类型数组.

public T[] array = (T[]) new Object[10];

public T getPos(int pos) {

return (T) this.array[pos];

}

public void setArray(int pos,T val) {

this.array[pos] = val;

}

}

public class Test {

public static void main(String[] args) {

MyArray<String> myArray = new MyArray<String>();

myArray.setArray(0,1);//编译报错,不能在myArray数组中放int类型的数据

myArray.setArray(1,"hahaha");

MyArray<Integer> myArray1 = new MyArray<Integer>();

myArray1.setArray(0,1);

myArray1.setArray(1,"hhhh");//编译报错,不能在myArray1数组中放String类型的数据

}

}

3.泛型类的使用

泛型类<类型实参> 变量名; // 定义一个泛型类引用

new 泛型类<类型实参>(构造方法实参 ); // 实例化一个泛型类对象

示例:

MyArray<String> myArray = new MyArray<String>();

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

编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写

如:

MyArray<String> myArray = new MyArray<>();

裸类型: 裸类型是一个泛型类但没有带着类型实参,例如 MyArrayList 就是一个裸类型

MyArray list = new MyArray();//没有<>

小结:

1. 泛型是将数据类型参数化,进行传递

2. 使用 <T> 表示当前类是一个泛型类。

3. 泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换

4.泛型是如何编译的?

4.1擦除机制

通过命令: javap -c 查看字节码文件,发现所有的 T都是Object。

在编译的过程当中,将所有的 T 替换为 Object 这种机制,我们称为: 擦除机制 。

那为什么, T[] ts = new T[5]; 是不对的,编译的时候,替换为 Object ,不是相当于: Object[] ts = new Object[5]吗?

4.2泛型类型实例化,建议:

尽量不要这么写:public T[] array = (T[])new Object[10];

public Object[] array = new Object[10];//建议这么写

5.泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

5.1语法

class 泛型类名称 < 类型形参 extends 类型边界 > {

...

}

示例:

public class MyArray<E extends Number> {

...

}

只接受 Number 的子类型作为 E 的类型实参

MyArray < Integer > l1 ; // 正常,因为 Integer 是 Number 的子类型

MyArray < String > l2 ; // 编译错误,因为 String 不是 Number 的子类型

如果没有指定类型边界 E ,可以视为 E extends Object

应用泛型上界的代码示例:

class Alg<T extends Comparable<T>> {

public T getMax(T[] array) {

T max = array[0];

for (int i = 0; i < array.length; i++) {

if(array[i].compareTo(max) > 0) {

//if的条件不能写成array[i] > max 两个引用类型的变量不能直接比较大小

max = array[i];

}

}

return max;

}

}

public class Test {

public static void main(String[] args) {

Alg<Integer> alg = new Alg<>();

Integer[] array = {1,13,51,71,19};

Integer ret = alg.getMax(array);

System.out.println(ret);

}

}

6.泛型方法

6.1定义语法

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

6.2使用示例:

public class Test {

public static void main(String[] args) {

Alg alg = new Alg();

Integer[] array = {1,13,51,71,19};

Integer ret = alg.<Integer>getMax(array);<Integer>可以省略

System.out.println(ret);

}

}

class Alg {

public<T extends Comparable<T>> T getMax(T[] array) {

//如果将方法修饰成静态方法,调用时不用实例化对象.

T max = array[0];

for (int i = 0; i < array.length; i++) {

if(array[i].compareTo(max) > 0){

max = array[i];

}

}

return max;

}

}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
包装类和泛型
在Java中,由于基本;类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。
用户11070251
2024/04/11
1200
【数据结构】包装类和泛型
除了int的包装类是Integer,char的包装类是Character,其他的基本类型对应的包装类都是将首字母大写。
用户11162265
2024/08/05
940
【数据结构】包装类和泛型
知识改变命运——【数据结构】包装类&简单认识泛型
在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了 一个包装类型。
用户11319080
2024/10/17
690
知识改变命运——【数据结构】包装类&简单认识泛型
《JavaSE》---21.<简单认识Java的集合框架&包装类&泛型>
其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索 retrieve 、 管理 manipulate ,即平时我们俗称的增删查改 CRUD 。
用户11288958
2024/09/24
1640
《JavaSE》---21.<简单认识Java的集合框架&包装类&泛型>
【Java】什么是泛型?什么是包装类
Java是一个面向对象的编程语言,但其基本数据类型(如int、char、boolean等)并不直接支持面向对象的特性。为了弥补这一不足,Java为每种基本数据类型设计了一个对应的类,这些类统称为包装类(Wrapper Class)。包装类均位于java.lang包中。
椰椰椰耶
2024/10/15
1240
【Java】什么是泛型?什么是包装类
【数据结构】包装类&泛型
小编在这里设置了一个上界comparable,可以进行comparaTo方法的调用,当然改为整型也是可以的。 
用户11288949
2024/09/24
950
【数据结构】包装类&泛型
数据结构之初识泛型
注意:在看泛型之前可以,回顾一下,包装类,包装类就是服务泛型的 :初识JAVA中的包装类,时间复杂度及空间复杂度-CSDN博客
用户11305962
2024/10/09
770
数据结构之初识泛型
【Java】泛型
🍊 泛型(Generics)是Java编程语言中的一个强大的特性,它提供了 编译时类型安全检测机制,这意味着可以在编译期间检测到非法的类型。泛型的使用减少了程序中的强制类型转换和运行时错误的可能性。
IsLand1314
2024/10/21
1390
【Java】泛型
【数据结构】泛型
泛型:其实就是对类型的进行参数化 问题:实现一个类,类中有一个数组,使得数组中可以存放任意类型的数据 我们可以把数组定义为Object.因为所有类都默认继承于Object。
xxxflower
2023/04/16
2720
【数据结构】泛型
【AI驱动的泛型数据结构:智能计算的核心】
ImAileen
2024/12/21
1080
【AI驱动的泛型数据结构:智能计算的核心】
Java学习【深入探索包装类和泛型】
在Java的学习中,包装类和泛型是两个重要的概念,它们不仅丰富了Java的数据类型,还提高了代码的可读性和安全性。下面,我们将深入探讨这两个主题。
2的n次方
2024/10/15
830
Java学习【深入探索包装类和泛型】
泛型的初步认识(1)
假设有个泛型类如上,在使用该泛型类时,我们通过实例化该泛型类对象去指定具体的类型来替换泛型参数。
E绵绵
2024/04/20
990
泛型的初步认识(1)
深入理解Java包装类与泛型的应用
在Java中,装箱(boxing)是指将基本数据类型(如int, char, double等)转换为对应的包装类对象(如Integer, Character, Double等)的过程。相反,拆箱(unboxing)是指将包装类对象转换回基本数据类型的过程。
学无止尽5
2024/11/29
1760
深入理解Java包装类与泛型的应用
泛型-详解
上一篇已经认识了泛型的基本使用,详情可以见: 《JAVA SE》认识泛型 接下来将详解泛型~~
VIBE
2022/12/02
3750
细说 Java 泛型及其应用
当获取列表中的第二个元素时,会报错,java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String。这是常见的类型转换错误。
aoho求索
2019/05/07
7170
泛型的初步认识(2)
💥个人主页:E绵绵的博客 💥所属专栏:JAVA知识点专栏 JAVA题目练习 c语言知识点专栏 c语言题目练习
E绵绵
2024/04/21
920
泛型的初步认识(2)
【JAVASE】探索 Java 泛型:开启通用编程的奥秘
Java泛型是Java 5引入的一个新特性,它允许在编译时定义类型参数,使代码更加灵活和可重用。通过使用泛型,你可以编写一个类或方法,该类或方法可以处理多种数据类型,而不仅仅是特定的数据类型。
小舒不服输
2024/01/30
1450
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。
冷环渊
2021/11/29
3.6K0
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
java 泛型全解 - 绝对最详细
对于java的泛型我一直属于一知半解的,平常真心用的不多。直到阅读《Effect Java》,看到很多平常不了解的用法,才下定决心,需要系统的学习,并且记录下来。
程序狗
2021/12/20
4.1K0
Java 泛型(Generic)
Java在1.5之后加入了泛型的概念。泛型,即“参数化类型”。泛型的本质是为了参数化类型(将类型参数化传递)(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
HLee
2021/04/26
9330
Java 泛型(Generic)
相关推荐
包装类和泛型
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档