数据结构(JAVA)包装类泛型

文章目录

  • 包装类
    • 基本数据类型和对应的包装类
    • 装箱和拆箱
    • 面试题
  • 泛型
    • 什么是泛型
    • 泛型的语法
    • 泛型类的使用
    • 泛型的使用
    • 裸类型(Raw Type) (仅需了解)
    • 擦除机制
    • 泛型的上界
    • 泛型方法


包装类

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

在这里插入图片描述
注意,除了int基本数据类型的包装类是Integer和char基本数据类型的包装类是Character以外的基本数据类型的包装类都是首字母大写。

装箱和拆箱

装箱:把基本数据类型变成包装类的过程,就叫作装箱。
拆箱:把包装类变成基本数据类型的过程,就叫作拆箱。
装箱分为显示装箱和自动装箱。
拆箱分为显示拆箱和自动拆箱。

显示装箱和自动装箱

    public static void main(String[] args) {int a = 15;Integer a1 = Integer.valueOf(a);//显示装箱Integer a2 = a;//自动装箱}

显示拆箱和自动拆箱

    public static void main(String[] args) {Integer a = 15;int a1 = a.intValue();//显示拆箱int a2 = 15;//自动拆箱}

自动装箱,自动拆箱的原理
自动装箱和自动拆箱的原理都是底层帮助我们调用valueOf 或者 intValue方法;
在这里插入图片描述

面试题

下面的代码的运行结果是什么?

public static void main(String[] args) {Integer a = 127;Integer b = 127;Integer c = 128;Integer d = 128;System.out.println(a == b);System.out.println(c == d);
}

当我们把上述代码运行,发现结果令人惊讶
在这里插入图片描述
为什么呢?明明两个结果都应该是true,但第一个是true 第二个是false?
我们发现这两个都是装箱操作,那么我们装箱是怎么工作的,也就是valueOf的逻辑是什么。
观察valueOf方法,当我们给valueOf方法传入一个值,并且他满足一定范围,返回一个数组值,不满足返回新的对象。
在这里插入图片描述
那这个方法的值范围是多少呢?
在这里插入图片描述
范围是[-128,127]。

泛型

什么是泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的
代码,这种刻板的限制对代码的束缚就会很大。---- 《Java编程思想》
通俗来讲,就是适用于许多许多类型。把想要的数据类型当作参数传递,需要什么类型,就传入什么类型。

泛型的语法

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

类名后的 代表占位符,表示当前类是一个泛型类。
在这里插入图片描述

泛型类的使用

泛型类的语法

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

new后面的<类型实参>中的类型实参可以省略,编译器可以根据上下文推导出类型实参。

泛型的使用

在这里插入图片描述

class MyArray <E>{public Object[] objects = new Object[10];public void setVal(int pos,E val) {objects[pos] = val;}public E getVal(int pos) {return (E)objects[pos];}
}public class Test {public static void main(String[] args) {MyArray<Integer> myArray = new MyArray<>();myArray.setVal(0,12);myArray.setVal(1,13);Integer a = myArray.getVal(1);System.out.println(a);}
}

我们以Integer为例,当我们以Integer类型当作参数传入,那E类型必须是整数类型,不能是其他类型。
如果传入其他类型,编译器会通过自动类型检查发现错误并报错。
在这里插入图片描述
注意<>内只能写类类型,不能写简单类型。

在这里插入图片描述

裸类型(Raw Type) (仅需了解)

裸类型是一个泛型类但没有带着类型实参(为了兼容老版本的api)

擦除机制

擦除机制:就是在编译时,将所有的E替换Object。

泛型的上界

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

class 泛型类名称<类型形参 extends 类型边界> {...
}
class MyArray <E extends Number>{public Object[] objects = new Object[10];public void setVal(int pos,E val) {objects[pos] = val;}public E getVal(int pos) {return (E)objects[pos];}
}

当我们规定E的上界时,此时传入的参数必须是Number或者是Number的子类。
如果不是将会报错。

在这里插入图片描述
示例二

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

写一个泛型方法,求数组中的最大值。

在这里插入图片描述
观察上面的代码,发现在if判断句报错,这是为什么呢?
因为E的类型我们不知道,我们无法比较。
解决方法:让E继承Comparable接口。

class Alg <E extends Comparable<E>> {public E findMax(E[] array) {E max = array[0];for (int i = 1; i < array.length; i++) {if(max.compareTo(array[i]) < 0) {max = array[i];}}return max;}
}

注意<>中的数据类型必须实现了Comparable接口。如果没有将会报错
在这里插入图片描述

泛型方法

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }
class Alg1 {public <E extends Comparable<E>>  E findMax(E[] array) {E max = array[0];for (int i = 1; i < array.length; i++) {if(max.compareTo(array[i]) < 0) {max = array[i];}}return max;}
}

调用泛型方法,有俩种。
1.java通过参数传递,推导出类型。
2.手动添加类型。
在这里插入图片描述

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

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

相关文章

OracleT5-2 Solaris11安装

1、Solaris11安装 在光驱中插入Solaris11的光盘后,在ok提示中boot cdrom {0} ok boot cdrom NOTICE: Entering OpenBoot. NOTICE: Fetching Guest MD from HV. NOTICE: Starting additional cpus. NOTICE: Initializing LDC services. NOTICE: Probing PCI devices. N…

《 C++ 修炼全景指南:十六 》玩转 C++ 特殊类:C++ 六种必备特殊类设计的全面解析

摘要 这篇博客深入探讨了六种 C 特殊类的设计及其技术细节。首先&#xff0c;介绍了如何设计只能在堆上或栈上创建对象的类&#xff0c;通过控制构造函数的访问权限来限定对象的内存分配区域。接着&#xff0c;探讨了如何设计一个不能被拷贝的类&#xff0c;避免资源重复释放的…

玄机平台-应急响应-webshell查杀

首先xshell连接 然后进入/var/www/html目录中&#xff0c;将文件变成压缩包 cd /var/www/html tar -czvf web.tar.gz ./* 开启一个http.server服务&#xff0c;将文件下载到本地 python3 -m http.server 放在D盾中检测 基本可以确认木马文件就是这四个 /var/www/html/shell.p…

Qt通过QProcess调用第三方进程

我们在运行Qt程序时&#xff0c;有时需要调用第三方程序&#xff0c;这时就可以用QProcess类。具体如下&#xff1a; 一. 启用进程之前 我们需要在头文件中定义一个私有变量指针&#xff0c;为了使他能长时间运行&#xff0c;定义为指针。 #include <QProcess> class …

生活中的感悟

喜怒不形于色 以前一直觉得做人要做本我&#xff0c;该笑就笑该怒就怒。但慢慢发现&#xff0c;这样可能不太好。 暂且不谈别人会感知你的真实想法&#xff0c;就单说一点&#xff0c;表情是否会引起别人的误判&#xff1f;表情除了开心和愤怒&#xff0c;还有很多&#xff0…

【存储设备专栏 2.1 -- linux 下 fdisk -l 命令详细介绍】

> 请阅读【嵌入式及芯片开发学必备专栏】< 文章目录 fdisk -l 详细介绍fdisk -l 的详细介绍常用选项 使用举例查找新插入的 USB 设备 fdisk -l 详细介绍 在 Linux 系统中&#xff0c;fdisk 是一个用于磁盘分区的命令行工具。fdisk -l 则用于列出所有可用的磁盘及其分区信…

初识MySQL · 数据库

目录 前言&#xff1a; 数据库 简单使用 存储引擎 前言&#xff1a; 本文也是MySQL的第一篇文章了&#xff0c;新的知识点已经出现&#xff0c;怎么能够停止不前&#xff0c;穿越时空……(迪迦奥特曼乱入哈哈哈)。 言归正传&#xff0c;我们在本文的目标有&#xff1a; …

Flink CDC同步mysql数据到doris

前置参考 flink快速安装&#xff1a;Flink入门-CSDN博客 doris快速安装&#xff1a;Apache Doris快速安装-CSDN博客 Flink CDC简介 Flink CDC 是一个基于流的数据集成工具&#xff0c;旨在为用户提供一套功能更加全面的编程接口&#xff08;API&#xff09;。 该工具使得用户能…

洞察云上风险,主机安全尽在掌握

在实战攻防演练中&#xff0c;主机一直是攻击方的最终目标。作为网络架构中的重要组成部分&#xff0c;主机包含了大量的敏感数据、关键服务和系统资源。同时主机拥有网络资源的访问权限&#xff0c;攻击者通过入侵主机获得权限&#xff0c;进而控制整个网络或系统。因此做好主…

vue2 Canvas 多边形区域绘制组件封装

效果预览&#xff1a; CanvasBox组件 <!-- 区域设置canvas --> <template><div class"all" ref"divideBox"><!-- <div><button click"test">清空</button></div> --><img id"img"…

Ubuntu中MySQL远程登录设置

mysql单独放在一台Ubuntu服务器上&#xff0c;我远程连接不上。可能是安装的时候忘记设置远程登录了。事后补救措施如下&#xff1a; MySQL 绑定地址配置问题 MySQL 可能只绑定了 localhost&#xff0c;无法接受来自外部主机的连接。你需要检查 MySQL 的配置文件 /etc/mysql/…

使用Vscode配置ftp连接远程服务器(上传本地文件)

1.安装插件 扩展商店搜sftp,点击进行安装。 2.配置json文件 crtl+shift+p 输入ftp配置命令 sftp:config {"name": "My Server", //设置名字"host": "localhost"</

腐蚀膨胀预处理

腐蚀&#xff1a;通过减少前景对象&#xff08;例如白色字符&#xff09;的边缘&#xff0c;腐蚀可以用来减小或消除细小的干扰线。如果干扰线较细&#xff0c;腐蚀可以有效地“消除”这些线条&#xff0c;同时保留较粗的字符。 膨胀&#xff1a;在腐蚀之后&#xff0c;膨胀可…

使用 Logistic Regression 识别手写数字-PyTorch

逻辑回归是一种非常常用的统计方法,它允许我们从一组自变量预测二进制输出。本文之前已经介绍了 Logistic 回归的各种属性及其 Python 实现 。现在,我们将了解如何在 PyTorch 中实现这一点,PyTorch 是由 Facebook 开发的一个非常流行的深度学习库。 现在,我们将了解如何使用…

上门按摩系统开发方案源码搭建

上门按摩系统开发方案 一、项目概述 上门按摩系统是一个连接按摩技师和客户的平台&#xff0c;旨在提供便捷、高效的上门按摩服务。通过该系统&#xff0c;客户可以轻松预约合适的按摩技师&#xff0c;并享受个性化的按摩服务。 二、系统功能模块 用户管理模块&#xff1a;…

TCP——Socket

应用进程只借助Socket API发和收但是不关心他是怎么进行传和收的 数据结构 图示Socket连接 捆绑属于隐式捆绑

Redis非关系型数据库操作命令大全

以下是 Redis 的常用操作命令大全&#xff0c;涵盖了键值操作、字符串、哈希、列表、集合、有序集合、发布/订阅、事务等多个方面的操作。 1. 通用键命令 命令说明SET key value设置指定 key 的值GET key获取指定 key 的值DEL key删除指定的 keyEXISTS key检查 key 是否存在E…

数据驱动时代:五款免费报表工具深度解析

在当今数据驱动的时代&#xff0c;报表工具已经成为各类企业进行决策和管理的重要工具。无论是大中型企业还是小微企业&#xff0c;能够快速、高效地生成可视化报表&#xff0c;洞察业务运营情况&#xff0c;已经成为提升竞争力的关键。今天为大家挑选了5款非常优秀的报表软件&…

Autosar软件组件概述

AUTOSAR中的应用软件设计为独立的软件单元&#xff0c;即软件组件类型&#xff08;SwComponentTypes&#xff09;&#xff0c;封装了相关功能和行为的实现&#xff0c;并通过端口原型&#xff08;PortPrototypes&#xff09;&#xff0c;向外部暴露自己。 AUTOSAR 标准应用了设…

std::setw中文不能对齐的问题

从别的博主那 copy过来 记录下 #include <codecvt> #include <locale>class chs_codecvt : public std::codecvt_byname<wchar_t, char, std::mbstate_t> {public:chs_codecvt() : codecvt_byname("zh_CN.GBK") {} };int encoding_diff(string …