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

news2024/10/25 4:12:00

包装类

在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.coloradmin.cn/o/2222943.html

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

相关文章

洞察前沿趋势!2024深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛技术公开课指南

在当前信息技术与“互联网”深度融合的背景下&#xff0c;金融行业的转型升级是热门话题&#xff0c;创新与发展成为金融科技主旋律。随着区块链技术、人工智能技术、5G通信技术、大数据技术等前沿科技的飞速发展&#xff0c;它们与金融领域的深度融合&#xff0c;正引领着新型…

模型的部署:服务端与客户端建立连接(Flask)

目录 一、服务端部署&#xff08;使用Flask&#xff09; 1.安装Flask 2.加载模型&#xff08;这里以识别图片的类型模型为例&#xff09; 3.定义API端点 4.运行Flask应用 二、客户端请求 1.安装HTTP客户端库 2.发送请求 请求成功示例&#xff1a; 监控与日志 总结 在…

物联网消息队列Emqx日志配置及日志追踪以及Centos7上的rc.local开机不执行、git提交的小问题

一、物联网消息队列Emqx日志配置及日志追踪 EMQX支持将日志输出到控制台或者日志文件&#xff0c;或者同时使用两者。使用 Docker 部署 EMQX&#xff0c;默认只能通过 docker logs 命令查看 EMQX 日志。EMQX 的默认日志级别为 warning&#xff0c;默认在单日志文件超过10MB(log…

nginx 隐藏版本号与WEB服务器信息

nginx 隐藏版本号与WEB服务器信息 1.安装相关软件2.下载软件包解压并进入3.修改C文件4.编译配置./configure --prefix/usr/local/nginx5.编译安装make && make install5.1.错误处理15.2.错误处理25.2.编译安装make && make install 6.修改nginx配置文件,http节…

【Vue】Vue3.0(十四)接口,泛型和自定义类型的概念及使用

上篇文章&#xff1a; 【Vue】Vue3.0&#xff08;十三&#xff09;中标签属性ref&#xff08;加在普通标签上、加在组件标签上&#xff09;、局部样式 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&…

从0开始深度学习(20)——延后初始化和自定义层

一般情况下&#xff0c;模型参数在被创建时就被立即初始化了&#xff0c;但如果使用了延后初始化技术&#xff0c;就能在首次传入数据后&#xff0c;再初始化参数&#xff0c;旨在输入维度未知的情况下&#xff0c;预定义灵活的模型&#xff0c;动态推断各个层的参数大小。 有时…

robosense 激光雷达安装

官方github 1、ROBOSENSE 驱动安装并运行 1、改雷达型号 2、修改网口地址 3、改变点的类型 https://github.com/RoboSense-LiDAR/rslidar_sdk/blob/main/doc/howto/05_how_to_change_point_type.md 2、ROBOSENSE 点云转换成 velodyne git clone https://github.com/HVikto…

Linux 部署 Harbor 镜像仓库详解

文章目录 安装 Docker安装 Harbor访问 Harbor 安装 Docker 本次部署流程使用的是1台阿里云ECS&#xff1a; Ubuntu 22.04&#xff0c;2核4G开放 9999 端口号 首先需要做的是在当前服务器上&#xff0c;安装好 Docker&#xff0c;参考链接如下&#xff1a; https://blog.csdn.n…

算法(四)前缀和

前缀和也是一个重要的算法&#xff0c;一般用来快速求静态数组的某一连续区间内所有数的和&#xff0c;效率很高&#xff0c;但不支持修改操作。分为一维前缀和、二维前缀和。 重要的前言&#xff01; 不要死记模板&#xff0c;具体题目可能是前缀和、前缀乘积、后缀和、后缀乘…

qt 构建、执行qmake、运行、重新构建、清除

qt右键功能有 构建、执行qmake、运行、重新构建、清除&#xff0c;下面简单介绍一下各个模块的作用。 1. 执行qmake qmake是一个工具&#xff0c; 它根据pro文件生成makefile文件&#xff0c;而makefile文件中则定义编译与连接的规则。pro文件中定义了头文件&#xff0c;源文件…

【C++干货篇】——C/C++内存管理

【C干货篇】——C/C内存管理 文章目录 【C干货篇】——C/C内存管理1.C/C内存分布1.1静态区/数据段&#xff1a;1.2常量区/代码段&#xff1a;1.3栈&#xff1a;1.4堆&#xff1a;1.5. 内存映射区&#xff1a; 2.C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free…

[笔记] 关于CreateProcessWithLogonW函数创建进程

函数介绍 https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-createprocesswithlogonw BOOL CreateProcessWithLogonW([in] LPCWSTR lpUsername,[in, optional] LPCWSTR lpDomain,[in] …

【lca,树上差分】P3128 [USACO15DEC] Max Flow P

题意 给定大小为 n ( 2 ≤ n ≤ 5 1 0 4 ) n(2 \leq n \leq 5 \times 10^4) n(2≤n≤5104) 的树&#xff0c;并给定 m ( 1 ≤ m ≤ 1 0 5 ) m(1 \leq m \leq 10^5) m(1≤m≤105) 条树上的路径&#xff08;给定两个端点&#xff0c;容易证明两个点树上路径唯一&#xff09;&…

分布式-单元化架构1

一 两地三中心 1.1 两地三中心* 两地指的是两个城市&#xff1a;同城&#xff0c;异地。三中心指的是三个数据中心&#xff1a;生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统&#xff0c;双中心具备相当的业务处理能力&#xff0c;…

【MySQL】索引的机制、使用

在学习索引知识之前&#xff0c;我们可以先了解一下什么是索引。实际上&#xff0c;索引就是数据库中一个或多个列存储的结构&#xff0c;能够支持数据库管理系统在不扫描整张表的情况下也能查询到数据行&#xff0c;能够大大提升查询效率。举个例子&#xff0c;我们想要找到一…

技术成神之路:设计模式(二十二)命令模式

相关文章&#xff1a;技术成神之路&#xff1a;二十三种设计模式(导航页) 介绍 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;允许将请求&#xff08;命令&#xff09;封装为对象&#xff0c;从而使您可以使用不同的请求、队列或记录请求日…

硬件基础知识补全计划【一】电阻

一、电阻理论 1.1 电流定义 电流&#xff1a;电流的强弱用电流强度来描述&#xff0c;电流强度是单位时间内通过导体某一横截面的电荷量&#xff0c;简称电流&#xff0c;用I表示。1 秒内有 6.241509310^18 个元电荷通过横截面的电流&#xff0c;定义为 1 安 (A)。 电压&…

【C++】在Windows中使用Boost库——实现TCP、UDP通信

目录 一、编译Boost库 二、TCP服务端 三、TCP客户端 四、UDP连接 一、编译Boost库 1. 先去官网下载Boost库源码 2. 点击下载最新的版本 下载Windows环境的压缩包&#xff0c;然后解压 3. 在解压后的目录路径下找到“bootstrap.bat” 打开控制台&#xff0c;在“bootstrap.…

Linux LCD 驱动实验

LCD 是很常用的一个外设&#xff0c;在裸机篇中我们讲解了如何编写 LCD 裸机驱动&#xff0c;在 Linux 下LCD 的使用更加广泛&#xff0c;再搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。本章我们就来学习一下如何在 Linux 下驱动 LCD 屏幕。 Framebuffer 设备 先来…

ShardingSphere 分库分表入门实战

分库分表 需求分析 如果我们的平台发展迅速&#xff0c;用户量激增&#xff0c;从数据库层面去思考&#xff0c;哪个表的数据会最大呢&#xff1f; 回顾一下我们的数据库设计&#xff1a; 1&#xff09;app 应用表 显然不会&#xff0c;成百上千的应用已经多&#xff0c;但…