Java包装类和泛型的知识点详解

目录

1 包装类

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

1.2 装箱和拆箱

1.3 自动装箱和自动拆箱

2 什么是泛型

3 引出泛型

3.1 语法                                                                                          

4 泛型类的使用                                                                             

5 泛型如何编译的

5.1 擦除机制                                                                                           

6 泛型的上界

6.1 语法

6.2 示例

  6.3 复杂示例

7 泛型方法

7.1 定义语法

7.2 示例

7.3 使用示例-可以类型推导

7.4 使用示例-不使用类型推导


1 包装类

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

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

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

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

1.2 装箱和拆箱


1.3 自动装箱和自动拆箱 
int i = 10;// 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中
Integer ii = Integer.valueOf(i);Integer ij = new Integer(i);// 拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中
int j = ii.intValue();

1.3 自动装箱和自动拆箱

int i = 10;Integer ii = i;   // 自动装箱          
Integer ij = (Integer)i;     // 自动装箱
int j = ii;                 // 自动拆箱
int k = (int)ii;        // 自动拆箱   

2 什么是泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。----- 来源《Java编程思想》对泛型的介绍。 泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化.

3 引出泛型

实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个 下标的值? 比特就业课 思路: 1. 我们以前学过的数组,只能存放指定类型的元素,例如:int[] array = new int[10]; String[] strs = new String[10]; 2. 所有类的父类,默认为Object类。                                                                                                                                                                                                                                                                                                                 

class MyArray {public Object[] array = new Object[10];public Object getPos(int pos) {return this.array[pos];}public void setVal(int pos,Object val) {this.array[pos] = val;}}public class TestDemo {public static void main(String[] args) {MyArray myArray = new MyArray();myArray.setVal(0,10);myArray.setVal(1,"hello");//字符串也可以存放String ret = myArray.getPos(1);//编译报错System.out.println(ret);}}

   问题:以上代码实现后 发现

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

2. 1号下标本身就是字符串,但是确编译报错。必须进行强制类型转换 虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种数据类 型。

而不是同时持有这么多类型。所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译 器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。                                                                                                                                              

3.1 语法                                                                                          

class MyArray<T> {public T[] array = (T[])new Object[10];//1public T getPos(int pos) {return 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<>();//2myArray.setVal(0,10);myArray.setVal(1,12);int ret = myArray.getPos(1);//3System.out.println(ret);myArray.setVal(2,"bit");//4}}

代码解释:

1. 类名后的代表占位符,表示当前类是一个泛型类

了解: 【规范】类型形参一般使用一个大写字母表示,

常用的名称有:

E 表示 Element

K 表示 Key

V 表示 Value

N 表示 Number

T 表示 Type

S, U, V 等等 - 第二、第三、第四个类型                                                                                             2. 注释1处,不能new泛型类型的数组                                                                                                3. 注释2处,类型后加入 指定当前类型

4. 注释3处,不需要进行强制类型转换

5. 注释4处,代码编译报错,此时因为在注释2处指定类当前的类型,此时在注释4处,编译器会在存放元素的时 候帮助我们进行类型检查。    

4 泛型类的使用                                                                             

4.1 语法                                                                                                                                             

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

5 泛型如何编译的

5.1 擦除机制                                                                                           

那么,泛型到底是怎么编译的?这个问题,也是曾经的一个面试问题。泛型本质是一个非常难的语法,要理解好他 还是需要一定的时间打磨。 比特就业课 通过命令:javap -c 查看字节码文件,所有的T都是Object。                                                                                                                            在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制。

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

6 泛型的上界

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

6.1 语法

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

6.2 示例

public class MyArray<E extends Number> {...}
MyArray<Integer> l1;        // 正常,因为 Integer 是 Number 的子类型
MyArray<String> l2;     // 编译错误,因为 String 不是 Number 的子类型
error: type argument String is not within bounds of type-variable EMyArrayList<String> l2;^where E is a type-variable:E extends Number declared in class MyArrayList

了解: 没有指定类型边界 E,可以视为 E extends Object

  6.3 复杂示例

 public class MyArray<E extends Comparable<E>> {...}

E必须是实现了Comparable接口的

示例:

用泛型来求最大值

class Alg  <T extends Comparable<T>>{public T findMaxVal(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;}
}
public class fanxing {public static void main(String[] args) {Integer[]array ={1,2,5,8,9};Alg <Integer> alg=new Alg<>();System.out.println(alg.findMaxVal(array));}
}

7 泛型方法

7.1 定义语法

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

7.2 示例

 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;}}

7.3 使用示例-可以类型推导

 Integer[] a = { ... };swap(a, 0, 9);String[] b = { ... };swap(b, 0, 9);

7.4 使用示例-不使用类型推导

 Integer[] a = { ... };Util.<Integer>swap(a, 0, 9);String[] b = { ... };Util.<String>swap(b, 0, 9);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「每日跟读」英语常用句型公式 第9篇

「每日跟读」英语常用句型公式 第9篇 1. Go-to ___ 第一选择___ What’s your go-to snack when you’re hungry? (你饿的时候第一选择的零食是什么&#xff1f;) Who’s your go-to friend for advice? (你第一选择的朋友是谁来寻求建议&#xff1f;) Which is your go-t…

Python实现BOA蝴蝶优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

智慧矿山视频智能监控与安全监管方案

一、行业背景 随着全球能源需求的日益增长&#xff0c;矿业行业作为国民经济的重要支柱&#xff0c;其发展日益受到广泛关注。然而&#xff0c;传统矿山管理模式的局限性逐渐显现&#xff0c;如生产安全、人员监管、风险预警等方面的问题日益突出。因此&#xff0c;智慧矿山智…

Python嵌入式片上系统逻辑电路分析调制物理信号

&#x1f3af;要点 数学公式分解和Python绘图计算解析&#xff1a;&#x1f3af;信号取样&#xff1a;&#x1f58a;取样和绘图单个周期内的正弦信号&#xff0c;&#x1f58a;修改样本密度接近图示弯曲峰值、&#x1f58a;构造分段线性插值、&#x1f58a;绘制线性插值填充误…

降本增效,赋予利润弹性,李子园努力践行“以投资者为本”理念降本增效,业绩稳步提升

4月9日&#xff0c;李子园发布2023年年度报告&#xff0c;披露了2023年业绩及经营数据。 2023年&#xff0c;李子园实现营业收入约14.1亿元&#xff0c;同比增长0.6%&#xff1b;实现归属于上市公司股东的扣非净利润约2.19亿元&#xff0c;同比增长16.75%。 数据显示&#xff…

Dubbo 序列化

Dubbo 序列化 1、什么是序列化和反序列化 序列化&#xff08;serialization&#xff09;在计算机科学的资料处理中&#xff0c;是指将数据结构或对象状态转换成可取用格式&#xff08;例如存成文件&#xff0c;存于缓冲&#xff0c;或经由网络中发送&#xff09;&#xff0c;…

SVN客户端异常问题处理

1、如遇svn服务端异常&#xff08;所有用户登录不上&#xff09; &#xff08;1&#xff09;登录192.168.**.**服务器&#xff0c;找到E:\仓库所在盘\VisualSVN-GlobalWinAuthz.ini &#xff08;2&#xff09;先备份VisualSVN-GlobalWinAuthz.ini文件 &#xff08;3&#xf…

Python-06-选择结构、循环

目录 1、选择结构 1.1 多分支结构语法结构 2、循环结构 2.1 遍历循环for的语句结构&#xff1a; 2.2 遍历字符串 1、选择结构 1.1 多分支结构语法结构 if 表达式1: #语句块1 elif 表达式2: #语句块2 elif 表达式n: #语句块n scoreeval(input(请输入您…

内网穿透的应用-如何使用Docker本地部署Dify LLM结合内网穿透实现公网访问本地开发平台

文章目录 1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 本文主要介绍如何在Linux Ubuntu系统以Docker的方式快速部署Dify,并结合cpolar内网穿透工具实现公网远程访问本地Dify&#xff01; Dify 是一款…

注意力机制篇 | YOLOv8改进之清华开源ACmix:自注意力和CNN的融合 | 性能速度全面提升

前言:Hello大家好,我是小哥谈。混合模型ACmix将自注意力机制和卷积神经网络进行整合,使其同时具有自注意力机制和卷积神经网络的优点。这是清华大学、华为和北京人工智能研究院共同发布在2022年CVPR中的论文。ACmix结合了自注意力机制和卷积神经网络的优势,以提高模型的性能…

上市公司探索式创新词频数据(1991-2022年)

数据来源&#xff1a;上市公司年报 时间跨度&#xff1a;1991-2022年 数据范围&#xff1a;上市公司 数据数量&#xff1a;51610条 数据指标及样例数据&#xff1a; 探索 搜索 变化 冒险 试验 灵活性 发掘 革新 年份股票代码公司名称总词频对数探索搜索变化冒险试验灵…

记录Http访问服务接口出现 301 Moved Permanently

记录Http访问服务接口出现 301 Moved Permanently 一、项目背景 ​ 在A服务中 需要通过远程调用 B服务接口 获取数据。A项目与B项目部署在不同的服务接口中。 请求接口响应界面 ​ 在调用B项目的接口时&#xff0c;响应的数据一直为 301 Moved Permanently Html代码&#x…

docker容器重启故障

docker容器重启故障 强杀docker进程后&#xff0c;重启docker。docker中的容器无法启动并报错 docker restart XXXXXXX Error response from daemon: Cannot restart container XXXXXXX: container ‘XXXXXXXXXXXXXXXX’: already exists 原因&#xff1a;旧容器未安全退出 解…

原生js 在b.html 读取a.html文件内容,并添加到b.html的部分位置

1、第一种方式XMLHttpReques t var xhr new XMLHttpRequest(); xhr.open("GET", "a.html", true); xhr.onreadystatechange function () {if (xhr.readyState 4 && xhr.status 200) {var content xhr.responseText;// 将内容添加到 b.html …

Vue3 使用ElementUI 显示异常

element提供的样例不能正常显示&#xff0c;需要进行配置 1.npm install element-plus --save 2.main.js // main.ts import { createApp } from vue import ElementPlus from element-plus //全局引入 import element-plus/dist/index.css import App from ./App.vue const …

道可云文旅元宇宙平台:全面赋能文旅产业数字化转型

随着科技的迅猛发展&#xff0c;元宇宙、人工智能和虚拟数字人等技术逐渐成为推动社会进步的重要力量。在这一背景下&#xff0c;道可云文旅元宇宙平台以其独特的创新理念和前沿技术&#xff0c;为数字文博领域带来了革命性的变革。 道可云文旅元宇宙平台运用先进的元宇宙、人…

了解google的SerpApi是个啥

SerpApi是一个实时API&#xff0c;可以访问Google搜索结果。它为客户处理代理、解决验证码问题&#xff0c;并解析所有丰富的结构化数据。这个API让用户可以轻松地获取Google搜索结果&#xff0c;而无需直接与Google搜索进行交互&#xff0c;也不需要处理复杂的爬虫和验证码问题…

[2024年4月最新]Python安装教程

一、Python下载 1、进入Python官网 官网地址&#xff1a;https://www.python.org 2、点击【Downloads】展开后点击【Windows】跳转到下载python版本页面&#xff0c;选择"Stable Releases"稳定版本&#xff0c;我下载的是Python 3.10.10版本&#xff0c;所以找到【…

JavaScript教程(四)--- 函数

函数 函数是 JavaScript 中的基本组件之一。JavaScript 中的函数类似于过程——一组执行任务或计算值的语句。但要成为函数&#xff0c;这个过程应该接受输入并返回与输入存在某些明显关系的输出。要使用一个函数&#xff0c;你必须将其定义在你希望调用它的作用域内。 定义函…

[xboard]real6410-6.1 移植kernel 5.4.272

文章目录 获取源码方法一方法二方法三了解S3C6410内核相关1 设备文件2 mach-文件3 plat-文件配置real6410编译镜像测试问题1获取源码 方法一 进入官网,如下界面,点击http, 再依次