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

一、包装类

1、什么是包装类

        将基础类型包装成的类就是包装类。由于基础类型不是继承 Object 类的类,所以在泛型不能直接支持基础类型,为了解决这个问题,就需要把基础类型转换为对应的包装类

基础类型对应的包装类
基础类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

2、装箱和拆箱

装箱:基础类型转换为包装类。

拆箱:包装类转换为基础类型。

以下为过时的写法

3、自动装箱和拆箱

        我们现在用的都是自动装箱、拆箱,第一种方式是最好的。

        用 javap -v 命令反汇编字节码文件,可以看到编译器会自动添加 valueOf (装箱)和 intValue(拆箱) 方法。

4、包装类的常量缓冲池

        同是比较有相同内容的对象的地址,结果却不同:

        这是因为 Integer 有一个常量池机制,当加载 Integer 类时,就会自动把 -128 ~ 127 范围的对象(常用的数值)放到常量池中:

        因此,i8、i9 引用都是存放的常量池中 127 对象的地址,而 i10、i11 引用分别存放不同的堆中新创建的对象的地址:

:128 并没有超过 Integer 的取值范围,它的范围大概是 -21亿 ~ 21 亿。

包装类的缓冲值范围
包装类缓冲值范围
Byte-128 ~ 127
Short-128 ~ 127
Integer-128 ~ 127
Long-128 ~ 127
Float
Double
Character0 ~ 127
Booleantrue 和 false

二、泛型

1、什么是泛型

        一般的类和方法只能固定接收、返回一种类型的数据,但有时我们希望接收、返回很多种类型的数据。比如写一个加法器,里面的数据可以是整型、浮点型,如果使用方法重载,方法里的步骤相同,只是数据类型不同,造成代码的冗余。使用泛型可以解决这个问题,相当于将数据类型参数化,可以给同一个类或方法灵活地指定任意类型

2、使用 Object 类

        如果我们需要实现一个数组类,这个类中的数组成员可以存放任意类型的元素,并且有 set、get 指定位置的元素的方法。可以使用 Object 类,因为它是任意类的父亲,通过任意类型向上转型为 Object 类实现:

 

        但是这种方法有个缺点,一是获取值时需要手动强制类型转换;二是无法确定一种类型,即让类或方法在使用时持有一种类型,而不是同时拥有任意类型。而泛型不需要手动强制类型转换,并且在创建对象时就将某一种类型作为参数传入,指定其类型编译器对其进行类型检查。既能让类指定不同的类型,又能给对象指定一种类型。

3、泛型的使用

        将上面的类改写成泛型:

  •  <T> 表示该类为泛型类,类型形参常用的名称有:

  • MyArray 中仍用 Object[] 类型创建对象,因为 T 只是泛型类的标志,它并没有实际的构造函数

  • 在定义引用时,已确定为 String 类, 因此 new 对象时可根据上下文推导类型省略为 <>
  • 优点:编译器自动进行类型转换、类型检查;一份代码支持多种类型。

4、裸类型

        泛型参数不指定,默认 T 为 Object,它只是为了兼容老版本,不建议使用:

        我们学习泛型,重点不在定义泛型类,而在泛型类的实例化,后续使用 java 中的集合类时,会经常用到泛型的实例化

5、如何编译泛型——擦除机制

        编译器先将泛型类型擦除,再替换为 Object 或边界类型。set 中把指定类型转为 Object (向上转型),get 中强制转换 Object 为指定类型(针对泛型类)。

        最后针对子类重写泛型父类的方法,避免没有真正覆盖父类方法,编译器会自动生成桥接方法。

擦除前:

public class Node<T> {T data;public void setData(T data) {this.data = data;}
}
public class StringNode extends Node<String> {@Overridepublic void setData(String data) {super.setData(data);}
}

擦除后:

public class Node {Object data;public void setData(Object data) {this.data = data;}
}public class StringNode extends Node {// 形参中,子类的 String 与父类替换后的 Object 不一致// 未成功覆盖@Overridepublic void setData(String data) { super.setData(data);}
}

自动生成桥接方法:

public class StringNode extends Node {// 子类与父类的方法签名一致@Overridepublic void setData(Object data) {setData((String) data);}
}

6、泛型上界

        对泛型的类型范围的上界进行约束

        在实现计算器时,使用泛型上界,可以限制类型为数字。若没有 extends,默认为 extends Object。

7、泛型方法

        将泛型写到方法名后,返回值类型前,让返回值类型、参数列表都能使用该泛型

        泛型方法的使用,类型推导见上文 “泛型的使用” :

8、通配符

        使泛型类引用能接收所有类型的泛型类对象:

三、总结

        泛型的重点在泛型类对象怎么实例化,为后续集合类的使用做铺垫。而怎么定义泛型类、怎么定义泛型方法、擦除机制、泛型上界、通配符等相比较下就不那么重要了。

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

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

相关文章

C++11线程

C11提供了线程库&#xff0c;下面我们来看一下如何使用。 线程的创建 头文件 要创建一个线程需要包一个线程头文件:#include <thread> 我们先来看看thread支持的构造方式。 支持默认构造&#xff0c;直接使用thread创建一个空的线程对象。 也支持带参的构造&#x…

Golang 并发机制-3:通道(channels)机制详解

并发编程是一种创建性能优化且响应迅速的软件的强大方法。Golang&#xff08;也称为 Go&#xff09;通过通道&#xff08;channels&#xff09;这一特性&#xff0c;能够可靠且优雅地实现并发通信。本文将揭示通道的概念&#xff0c;解释其在并发编程中的作用&#xff0c;并提供…

笔记:使用ST-LINK烧录STM32程序怎么样最方便?

一般板子在插件上&#xff0c; 8脚 3.3V;9脚 CLK;10脚 DIO;4脚GND ST_Link 19脚 3.3V;9脚 CLK;7脚 DIO;20脚 GND 烧录软件&#xff1a;ST-LINK Utility&#xff0c;Keil_5; ST_Link 接口针脚定义&#xff1a; 按定义连接ST_Link与电路板&#xff1b; 打开STM32 ST-LINK Uti…

网络测试工具

工具介绍&#xff1a; 这是一个功能完整的网络测速工具&#xff0c;可以测试网络的下载速度、上传速度和延迟。 功能特点&#xff1a; 1. 速度测试 - 下载速度测试 - 上传速度测试 - Ping延迟测试 - 自动选择最佳服务器 2. 实时显示 - 进度条显示测试进度 - 实时显示测试状…

java每日精进1.31(SpringSecurity)

在所有的开发的系统中&#xff0c;都必须做认证(authentication)和授权(authorization)&#xff0c;以保证系统的安全性。 一、基础使用 1.依赖 <dependencies><!-- 实现对 Spring MVC 的自动化配置 --><dependency><groupId>org.springframework.bo…

17.2 图形绘制8

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 17.2.10 重绘 先看以下例子&#xff1a; 【例 17.28】【项目&#xff1a;code17-028】绘制填充矩形。 private void button1_Clic…

自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import precision_score, recall_score, f1_score# 数据准备 class1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4,…

neo4j入门

文章目录 neo4j版本说明部署安装Mac部署docker部署 neo4j web工具使用数据结构图数据库VS关系数据库 neo4j neo4j官网Neo4j是用ava实现的开源NoSQL图数据库。Neo4作为图数据库中的代表产品&#xff0c;已经在众多的行业项目中进行了应用&#xff0c;如&#xff1a;网络管理&am…

Java基础——分层解耦——IOC和DI入门

目录 三层架构 Controller Service Dao ​编辑 调用过程 面向接口编程 分层解耦 耦合 内聚 软件设计原则 控制反转 依赖注入 Bean对象 如何将类产生的对象交给IOC容器管理&#xff1f; 容器怎样才能提供依赖的bean对象呢&#xff1f; 三层架构 Controller 控制…

智慧园区系统集成解决方案引领未来城市管理的智能化转型

内容概要 在现代城市管理的背景下&#xff0c;“智慧园区系统集成解决方案”正扮演着越来越重要的角色。这种解决方案不仅仅是技术上的创新&#xff0c;更是一种全新的管理理念&#xff0c;它旨在通过高效的数据整合与分析&#xff0c;优化资源配置&#xff0c;提升运营效率。…

99.24 金融难点通俗解释:MLF(中期借贷便利)vs LPR(贷款市场报价利率)

目录 0. 承前1. 什么是MLF&#xff1f;1.1 专业解释1.2 通俗解释1.3 MLF的三个关键点&#xff1a; 2. 什么是LPR&#xff1f;2.1 专业解释2.2 通俗解释2.3 LPR的三个关键点&#xff1a; 3. MLF和LPR的关系4. 传导机制4.1 第一步&#xff1a;央行调整MLF4.2 第二步&#xff1a;银…

【VM】VirtualBox安装CentOS8虚拟机

阅读本文前&#xff0c;请先根据 VirtualBox软件安装教程 安装VirtualBox虚拟机软件。 1. 下载centos8系统iso镜像 可以去两个地方下载&#xff0c;推荐跟随本文的操作用阿里云的镜像 centos官网&#xff1a;https://www.centos.org/download/阿里云镜像&#xff1a;http://…

家居EDI:Hom Furniture EDI需求分析

HOM Furniture 是一家成立于1977年的美国家具零售商&#xff0c;总部位于明尼苏达州。公司致力于提供高品质、时尚的家具和家居用品&#xff0c;满足各种家庭和办公需求。HOM Furniture 以广泛的产品线和优质的客户服务在市场上赢得了良好的口碑。公司经营的产品包括卧室、客厅…

【VUE案例练习】前端vue2+element-ui,后端nodo+express实现‘‘文件上传/删除‘‘功能

近期在做跟毕业设计相关的数据后台管理系统&#xff0c;其中的列表项展示有图片展示&#xff0c;添加/编辑功能有文件上传。 “文件上传/删除”也是我们平时开发会遇到的一个功能&#xff0c;这里分享个人的实现过程&#xff0c;与大家交流谈论~ 一、准备工作 本次案例使用的…

VLN视觉语言导航基础

0 概述 视觉语言导航模型旨在构建导航决策模型 π π π&#xff0c;在 t t t时刻&#xff0c;模型能够根据指令 W W W、历史轨迹 τ { V 1 , V 2 , . . . , V t − 1 } \tau\{V_1,V_2,...,V_{t-1}\} τ{V1​,V2​,...,Vt−1​}和当前观察 V t { P t , R t , N ( V t ) } V_…

Flux的三步炼丹炉——fluxgym(三):矩阵测试

前面两篇文章给大家介绍了如何准备素材和怎么炼丹&#xff0c;现在我们拿到训练完成后的多个Lora怎么才能确定哪个才是我们需要的、效果最好的呢&#xff1f;答案就是使用xyz图表测试&#xff0c;也称为矩阵测试&#xff0c;通过控制控制变量的方法对Lora模型批量生图&#xff…

利用Muduo库实现简单且健壮的Echo服务器

一、muduo网络库主要提供了两个类&#xff1a; TcpServer&#xff1a;用于编写服务器程序 TcpClient&#xff1a;用于编写客户端程序 二、三个重要的链接库&#xff1a; libmuduo_net、libmuduo_base、libpthread 三、muduo库底层就是epoll线程池&#xff0c;其好处是…

文件读写操作

写入文本文件 #include <iostream> #include <fstream>//ofstream类需要包含的头文件 using namespace std;void test01() {//1、包含头文件 fstream//2、创建流对象ofstream fout;/*3、指定打开方式&#xff1a;1.ios::out、ios::trunc 清除文件内容后打开2.ios:…

C++编程语言:抽象机制:模板(Bjarne Stroustrup)

目录 23.1 引言和概观(Introduction and Overview) 23.2 一个简单的字符串模板(A Simple String Template) 23.2.1 模板的定义(Defining a Template) 23.2.2 模板实例化(Template Instantiation) 23.3 类型检查(Type Checking) 23.3.1 类型等价(Type Equivalence) …

无人机图传模块 wfb-ng openipc-fpv,4G

openipc 的定位是为各种模块提供底层的驱动和linux最小系统&#xff0c;openipc 是采用buildroot系统编译而成&#xff0c;因此二次开发能力有点麻烦。为啥openipc 会用于无人机图传呢&#xff1f;因为openipc可以将现有的网络摄像头ip-camera模块直接利用起来&#xff0c;从而…