【数据结构】包装类简单认识泛型-Java

包装类

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

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

基本数据类型包装类
ByteByte
shortShort
int

Integer

longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

装箱和拆箱

什么是装箱:把基本数据类型变为包装类类型的过程

  public static void main1(String[] args) {Integer a=10;Integer i=Integer.valueOf(a);//显示装箱Integer i2=10;Double d =Double.valueOf(a);

什么是拆箱:把包装类型变为基本类型的过程

 public static void main2(String[] args) {Integer a =10;int b=a;//自动拆箱int c=a.intValue();double d=a.doubleValue();System.out.println(a);System.out.println(b);System.out.println(c);System.out.println(d);}

面试题(阿里巴巴)

判断以下代码的结果

小tips:装箱调用的值不一样

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

什么是泛型

一般的类和方法,只能使用具体的类型,要么是具体的类型,要么是自定义的类,如果要编写可以应用于多种类型 的代码,这种刻板的限制对代码的束缚就会很大

通俗讲,泛型就是适用于许多许多类型,从代码上讲,就是对类型实现了参数化(可以直接传入类型)

引出泛型

【实例1】

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

实例代码:

class MyArray{public Object[] array=new Object[10];public void setvalue(int pos,Object val){array[pos]=val;}public Object getVaL(int pos){return array[pos];}}public class Test {public static void main(String[] args) {MyArray myArray=new MyArray();myArray.setvalue(0,10);myArray.setvalue(1,"hello");String str=(String) myArray.getVaL(1);System.out.println(str);//或者 Object str= myArray.getVaL(1);}
}
解析:

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

  1. 任何类型的数据都可以存放
  2. 1号下标本身就是字符串,但是编译报错,必须进行强制类型转换

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

语法

class 泛型类型<类型 形参列表>{
这里可以使用类型参数
}class ClassName<T1,T2,...,Tn>{}
实例代码:

//<E>是一个占位符,表示当前类是一个泛型
class MyArray<E>{public Object[] array=new Object[10];public void setvalue(int pos,E val){array[pos]=val;}public E getVaL(int pos){return (E) array[pos];}}public class Test {public static void main(String[] args) {MyArray <Integer> myArray=new MyArray<Integer>();//相当于给系统提供了一个限制:myArray只能是整数myArray.setvalue(0,10);myArray.setvalue(1,20);Integer a =myArray.getVaL(1);//自动类型转换System.out.println(a);System.out.println("==========");MyArray<String> myArray1 =new MyArray<>();myArray1.setvalue(0,"hello");myArray1.setvalue(1,"abc");String str=myArray1.getVaL(0);//System.out.println(str);// myArray.setvalue(1,"hello");//自动类型检查}
}
解析:

泛型存在的最大意义:可以指定放什么类型的数据,输入数据的时候会自动类型检查,取的时候会自动类型转换,把类型作为参数进行传递

类名后的<T>代表占位符,表示当前类是一个泛型类(泛型必须是包装类)

了解:【规范】类型 形参一般使用一个大写字母表示,常用的名称有:
  • E表示Element
  • K表示Key
  • V表示Value
  • N表示Number
  • T表示Type
  • S,U,V等等 第二,第三,第四个类型

泛型类的使用

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

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

类型推导(Type Inference)

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

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

裸类型(Raw Type)

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

MyArray  myArray=new MyArray();

注意: 我们不要自己去使用裸类型,裸类型是为了兼容老版本 API 保留的机制

【实例1】代码:
public static void main(String[] args) {MyArray  myArray=new MyArray();//相当于给系统提供了一个限制:myArray只能是整数myArray.setvalue(0,10);myArray.setvalue(1,20);myArray.setvalue(1,"fadd");Integer a =(Integer)myArray.getVaL(1);//自动类型转换System.out.println(a);}

实例1代码解析:

小结:

  1. 泛型是将数据类型参数化,进行传递(参数化意思就是可以当做参数被传递)
  2. 使用<T>表示当前类是一个泛型类
  3. 泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换

泛型如何编译的

泛型是编译时期的一种机制,在运行的时候,没有泛型的概念【JVM当中没有泛型的概念】

擦除机制

编译完成以后,生成的字节码中,<E>被擦除为Object类了

【实例1】代码
 public static void main(String[] args) {/* Test test=new Test();System.out.println(test);*/MyArray <Integer> myArray=new MyArray<Integer>();MyArray<String> myArray1 =new MyArray<>();System.out.println(myArray);System.out.println(myArray1);}
代码解析:

泛型的上界

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

语法

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

【实例1】

public class MyArray<E extends Number>{...
}
复杂示例
public class MyArray<E extends Comparable<E>>{...
}

E必须是实现了Comparable接口的 

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

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

相关文章

wordcloud 字体报错

wordcloud 字体报错 词云库报错&#xff1a;Only supported for TrueType fonts字体文件问题pillow版本的问题wordcloud版本问题&#xff08;我的最终解决方案&#xff09; 词云库报错&#xff1a;Only supported for TrueType fonts 字体文件问题 解决方法 写绝对路径 &…

【故障解决】麒麟系统2403用户帮助手册点击无反应的解决方法

往期好文&#xff1a;【系统配置】命令行修改统信UOS的grub启动延时 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于如何解决麒麟系统2403版本中用户帮助手册点击无反应问题的文章。很多使用麒麟系统的小伙伴可能遇到过点击“用户帮助手册”后没有任何响应的情况…

【Linux学习】(3)Linux的基本指令操作

前言 配置Xshell登录远程服务器Linux的基本指令——man、cp、mv、alias&which、cat&more&less、head&tail、date、cal、find、grep、zip&tar、bc、unameLinux常用热键 一、配置Xshell登录远程服务器 以前我们登录使用指令&#xff1a; ssh 用户名你的公网…

gorm.io/sharding改造:赋能单表,灵活支持多分表策略(下)

背景 分表组件改造的背景&#xff0c;我在这篇文章《gorm.io/sharding改造&#xff1a;赋能单表&#xff0c;灵活支持多分表策略&#xff08;上&#xff09;》中已经做了详细的介绍——这个组件不支持单表多个分表策略&#xff0c;为了突破这个限制做的改造。 在上一篇文章中&…

机器学习基础:算法如何让 AI 自我学习

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 AI工具集1&#xff1a;大厂AI工具【共23款…

vue3+vue-baidu-map-3x 实现地图定位

文档地址&#xff1a;一个是2一个是3 https://dafrok.github.io/vue-baidu-map/#/zh/index vue-baidu-map-3x 1.首先要到百度地图开放平台上建一个账号&#xff0c;如果有百度账号可以直接登录百度地图-百万开发者首选的地图服务商,提供专属的行业解决方案 2.点击控制台&am…

ThreadLocal内存泄漏面试题

一、ThreadLocal内部结构 首先更好的说明ThreadLocal内存泄露的场景&#xff0c;以及具体的原因&#xff0c;先来了解下ThreadLocal的内部结构&#xff0c;如图1所示。 可以看到&#xff0c;ThreadLocal对象是存储在每个Thread线程内部的ThreadLocalMap中的&#xff0c;并且在…

行列式-常山赵子龙

终于知道这类题怎么写了 两个条件都要用到 要计算&#xff0c;减少直觉

【加密系统】华企盾DSC服务台提示:请升级服务器,否则可能导致客户端退回到旧服务器的版本

华企盾DSC服务台提示&#xff1a;请升级服务器&#xff0c;否则可能导致客户端退回到旧服务器的版本 产生的原因&#xff1a;控制台版本比服务器高导致控制台出现报错 解决方案 方法&#xff1a;将控制台回退到原来的使用版本&#xff0c;在控制台负载均衡查看连接该服务器各个…

图像分割-DeepLab

DeepLabV3源码链接&#xff1a;https://github.com/bubbliiiing/deeplabv3-plus-pytorch&#xff08;打不开私信我获取&#xff09; 一、简介 一般的模型如Unet一般用于医学领域&#xff0c;小目标&#xff0c;如细胞分割。 为了增大感受野&#xff08;从而更好的获得全局特征…

LeetCode 18.四数之和

LeetCode 18.四数之和 C 思路&#x1f9d0;&#xff1a; 由题意得&#xff0c;四个数组里面的整数相加需要得到target这个目标值&#xff0c;且结果不能重复&#xff0c;那么我们可以用排序双指针的方式进行解答&#xff0c;将该数组变为升序数组&#xff0c;然后固定左边两个数…

建站工具Halo

建站工具Halo 项目及文档快速体验启动成功 类似wordpress的建站工具&#xff0c;使用java技术栈Springboot开发&#xff0c;对java开发者友好。 项目及文档 https://github.com/halo-dev/halo 快速体验 为了快速体验&#xff0c;直接使用docker compose部署。也可在源码基础…

人工智能+医学

医学影响的内型&#xff1a;(X光片、计算机断层扫描、磁共振成像、超声波&#xff09; ITK snap医学图像读取 医学影像领域常见任务: 图像分类、语义分割、疾病预测、目标检测、图像配准、图像生成(应用少)、图像增强、生成放射学报告。 需要有很强的可解释…

指针进阶(三)(C 语言)

目录 一、回调函数二、快速排序函数 qsort1. qsort() 函数原型2. 使用 qsort() 函数 三、仿照 qsort 函数设计一个可以排序任意类型数组的冒泡函数1. 函数原型2. 函数设计思路 一、回调函数 在 C 语言中&#xff0c;回调函数是一种通过函数指针调用的函数&#xff0c;也就是一…

Spring Boot驱动的植物健康监测革命

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理植物健康系统的相关信息成为必然。开发合适…

软件测试学习笔记丨Selenium学习笔记:常用页面信息对比方法expected_conditions

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22514 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

开拓鸿蒙测试新境界,龙测科技引领自动化测试未来

在当今科技舞台上&#xff0c;鸿蒙 OS 以非凡先进性强势登场&#xff0c;打破传统操作系统格局&#xff0c;为软件测试领域带来全新机遇与艰巨挑战。 一、鸿蒙 OS 的辉煌崛起 &#xff08;一&#xff09;壮丽发展历程与卓越市场地位 鸿蒙 OS 的发展如波澜壮阔的史诗。2023 年…

JavaScript进阶:手写代码挑战(一)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript手写代码篇 #1024程序员节&#xff5c;征文# 在现代Web开发中&#xff0c…

中国移动机器人将投入养老场景;华为与APUS共筑AI医疗多场景应用

AgeTech News 一周行业大事件 华为与APUS合作&#xff0c;共筑AI医疗多场景应用 中国移动展出人形机器人&#xff0c;预计投入养老等场景 作为科技与奥富能签约&#xff0c;共拓智能适老化改造领域 天与养老与香港科技园&#xff0c;共探智慧养老新模式 中山大学合作中国…

[Python学习日记-53] Python 中的正则表达式模块 —— re

[Python学习日记-53] Python 中的正则表达式模块 —— re 简介 re 模块 练习 简介 我们在编程的时候经常会遇到想在一段文字当中找出电话号码、身份证号、身高、年龄之类的信息&#xff0c;就像下面的数据一样 # 文件名&#xff1a;美丽学姐联系方式.txt 姓名 地区 …