数据结构(Java版)第二期:包装类和泛型

news2024/12/23 23:15:39

       

目录

一、包装类

1.1. 基本类型和对应的包装类

1.2. 装箱和拆箱

1.3. 自动装箱和自动拆箱

二、泛型的概念

三、引出泛型

3.1. 语法规则

3.2. 泛型的优点

四、类型擦除 

4.1. 擦除的机制 

五、泛型的上界

5.1. 泛型的上界的定义

5.2. 语法规则 

六、泛型方法

6.1. 定义语法 

6.2. 交换方法的实例

七、通配符


包装类和泛型我们在Java语法中,我们在基本数据类型里面涉及过,但是我们在语法里面用不到,而在数据结构里面我们才会有应用的。 

一、包装类

1.1. 基本类型和对应的包装类

         Java共有8种基本数据类型,Java给这些基本类型都搞了一个类进行表示,来对这些类进行一个封装,这就是包装类。 

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

1.2. 装箱和拆箱

        在Java当中,提供了一些操作,使包装类和内置类型可以相互转换。内置类型转为包装类型称为装箱,包装类型转为内置类型称为拆箱。但这些代码写法已经过时了,我们需要重点掌握的是⾃动装箱和⾃动拆箱。

1.3. 自动装箱和自动拆箱

public class Main {
    public static void main(String[] args) {
        int i = 10;
        Integer ii = i;//自动装箱
        Integer ij = (Integer) i;//自动装箱,后面的(Integer)可有可无

        int j = ii;//自动拆箱
        int k = (int)ii;//自动拆箱,后面的(int)可有可无
    }
}

       我们可以通过javap-c查看字节码⽂件内容,观察装箱和拆箱的操作。我们可以在IDEA里面装一个jclasslib ByteCode Viewer的插件,然后点击View,再点击Show Bytecode With Jclasslib。我们点到main方法,点击code,就可以看到所对应的字节码文件。

 

         我们来看下面的一段代码,此时的a,b,c,d,e都是引用类型变量。当赋值相同时,结果就是true;当赋值不同时,结果就是false。当赋值超出包装类型的范围时,无论赋值相不相等,结果都是false。 

       这是因为Integer里面的常量值放在常量池当中,我们进行赋值,相当于在常量池中进行取值,如果超出这个值,那么就是池内与池外的进行比较,结果就是false。 

public class Main {
    public static void main(String[] args) {
        Integer a = 127;
        Integer b = 127;
        System.out.println(a == b);//true

        Integer c = 128;
        Integer d = 128;
        System.out.println(c == d);//false

        Integer e = 126;
        System.out.println(a == e);//false
    }
}

二、泛型的概念

       很多编程语言都有泛型这样的语法机制。在Java中,写一个类或者是方法,需要声明方法里面的成员或者参数的类型。但也有些情况下,需要一个类或者方法能够多种类型支持。也就是一份代码,支持多种数据类型。

三、引出泛型

3.1. 语法规则

class 泛型名称<参数列表>{
      //这里可以使用类型参数;
}

class ClassName<T1,T2,……,Tn>{
}

        参数列表中要把类中会用的哪些类型列出来,后续使用这个类,创建实例的时候也要同时指定泛型参数的实参。T1,T2相当于类型的形参。

private T[] arrays = new T[];
//这种写法是错误的

        因为T要表示任何类型,new T[]的时候就可能会涉及到该类的构造方法,T是什么类型不知道该怎么办?就得先写成Object[]再进行强转。

T[] arrays = (T[]) new Object[];
class MyArray<T>{
    T[] arrays = (T[]) new Object[10];
    public T get(int index){
        return arrays[index];//获取数组的下标
    }
    public void set(int index,T value){
        arrays[index] = value;//对数组进行赋值
    }
}
//上面的T不用再进行强转了

//对方法的实现
public class Main {
    public static void main(String[] args) {
        MyArray<String> array1 = new MyArray<String>();//里面可以存放字符。代码是灰色的,表示可以不写
        MyArray<Integer> array2 = new MyArray<>();//里面可以存放整数
        MyArray array4 = new MyArray();//裸类型,这种写法是不科学的
        MyArray<int> array3 = new MyArray<>();//error: Type argument cannot be of primitive type
    }
}

3.2. 泛型的优点

       1.代码重用,一份代码,支持多种类型; 2.自动地进行类型转化,编译过程中会自动触发一些类型检查。

四、类型擦除 

4.1. 擦除的机制 

      Java的泛型,本质上是通过Object类进行编译的。编译器生成代码的时候,自动进行类型转化。比如下面的代码中的get方法,我要对T转化成String类型,编译器从数组中拿到的是一个Object类,然后进行自动转化成String类,返回到调用位置。在set方法里面,set String进来,编译器再自动把String转化成Object。

class MyArray<T>{
    T[] arrays = (T[]) new Object[10];
    public T get(int index){
        return arrays[index];
    }
    public void set(int index,T value){
        arrays[index] = value;
    }
}

 下面是一段擦除的代码用例

//擦除前
class MyArray<T>{
    public Object[] arrays = new Object[10];
    public T getPos(int pos){
        return (T)this.arrays[pos];
    }
    public void setVal(int pos,T val){
        this.arrays[pos] = val;
    }
}
//擦除后
class MyArray<T>{
    public Object[] arrays = new Object[10];
    public Object getPos(int pos){
        return this.arrays[pos];
    }
    public void setVal(int pos,T val){
        this.arrays[pos] = val;
    }
}

五、泛型的上界

5.1. 泛型的上界的定义

     描述的是使用泛型,创建泛型实例的时候,传入的参数(类型实参)需要满足什么条件。 

5.2. 语法规则 

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

       这个类型边界相当于是“父类”,后续创建类型实例的类型参数,必须是这个父类的子类。比如我们要写一个算术运算的泛型类,泛型参数必须给数字。

class MyArray<E extends Number>{
     MyArray<Integer> l1;//正常
     MyArray<String> l2;//错误
}

     如果没有指定类型边界E,可以视为E extends Object。

六、泛型方法

6.1. 定义语法 

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

6.2. 交换方法的实例

public class Main {
    //静态的泛型方法需要在static后面用<>声明泛型类型参数
    public static <E> void swap(E[] array,int i,int j){
        E t = array[i];
        array[i] = array[j];
        array[j] = t;
    }
}

七、通配符

     前面的知识都是在定义泛型时涉及到的,通配符是针对泛型实例化的时候涉及到的。

class MyClass<T>{

}
public class Main {
    public static void main(String[] args) {
        MyClass<Integer> obj1 = new MyClass<>();
        MyClass<String> obj2 = new MyClass<>();
        MyClass<Integer> obj3 = new MyClass<>();

        obj1 = obj3;//正常
        obj1 = obj2;//错误
    }
}

     因为Obj1与Obj2类型不相同,所以会报错。那我们能否创建一种引用,能够指向多种泛型参数的对象呢?这时就要用到通配符了。

MyClass<?> obj4 = obj3; 
MyClass<? extends Number> obj5 = obj1;
obj5 = obj2;
//这个代码不符合要求,约定obj5的通配符,只能匹配到Number和它的子类;
//因为通配符只能在泛型实例化时使用

       这里的代码不要和泛型的上界搞混。我们除了可以指定父类,还能指定子类。

MyClass<? super Integer> obj6 = obj1;//此处的通配符只能匹配到Integer和它的父类
obj6 = new MyClass<double>();//double并不是Integer的子类,所以会报错
obj6 = new MyClass<Number>();//Number是Integer的父类。

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

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

相关文章

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…

【CSP CCF记录】201903-1第16次认证 小中大

题目 样例1输入 3 -1 2 4 样例1输出 4 2 -1 样例1解释 4 为最大值&#xff0c;2 为中位数&#xff0c;−1 为最小值。 样例2输入 4 -2 -1 3 4 样例2输出 4 1 -2 样例2解释 4 为最大值&#xff0c;(−13)21为中位数&#xff0c;−2为最小值。 思路 本题两个注意点&#xff0…

P8692 [蓝桥杯 2019 国 C] 数正方形:结论,组合数学

题目描述 在一个 NNNN 的点阵上&#xff0c;取其中 44 个点恰好组成一个正方形的 44 个顶点&#xff0c;一共有多少种不同的取法&#xff1f; 由于结果可能非常大&#xff0c;你只需要输出模 10971097 的余数。 如上图所示的正方形都是合法的。 输入格式 输入包含一个整数 …

Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch客户端在和集群连接时&#xff0c;如何选择特定的节点执行请求的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch客户端在和集群连接时&#xff0c;如何选择特定的节点执行请求的&#xff1f; 100…

【题解】—— LeetCode一周小结46

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结45 11.切棍子的最小成本 题目链接&#xff1a;1547. 切棍子的最…

AI社媒引流工具:解锁智能化营销的新未来

在数字化浪潮的推动下&#xff0c;社交媒体成为品牌营销的主战场。然而&#xff0c;面对海量的用户数据和日益复杂的运营需求&#xff0c;传统营销方法显得力不从心。AI社媒引流王应运而生&#xff0c;帮助企业在多平台中精准触达目标用户&#xff0c;提升营销效率和效果。 1.…

Python 使用 Selenuim进行自动化点击入门,谷歌驱动,以百度为例

一、首先要下载谷歌驱动 1.&#xff08;打开谷歌浏览器 - 设置 - 关于谷歌&#xff0c;查看谷歌浏览器版本&#xff0c;否则不对应无法调用&#xff0c;会提示&#xff1a;selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This versio…

C语言-指针作为函数返回值及二级指针

1、指针作为函数返回值 c语言允许函数的返回值是一个指针&#xff08;地址&#xff09;我们将这样的函数称为指针函数&#xff0c;下面的例子定义一了一个函数strlong&#xff08;&#xff09;&#xff0c;用来返回两个字符串中较长的一个&#xff1a; 1. #include <stdio…

实时数据开发 | 怎么通俗理解Flink容错机制,提到的checkpoint、barrier、Savepoint、sink都是什么

今天学Flink的关键技术–容错机制&#xff0c;用一些通俗的比喻来讲这个复杂的过程。参考自《离线和实时大数据开发实战》 需要先回顾昨天发的Flink关键概念 检查点&#xff08;checkpoint&#xff09; Flink容错机制的核心是分布式数据流和状态的快照&#xff0c;从而当分布…

再次讨论下孤注一掷

在孤注一掷中的黑客技术里面&#xff0c;简单介绍了电影孤注一掷中用的一些"黑科技"&#xff0c;这里继续讨论下&#xff0c;抛弃这些黑科技&#xff0c;即使在绝对公平的情况下&#xff0c;你也一样赢不了赌场 相对论有一个假设就是光速不变&#xff0c;这里也有个…

微信小程序技术架构图

一、视图层1.WXML&#xff08;WeiXin Markup Language&#xff09; 这是微信小程序的标记语言&#xff0c;类似于 HTML。它用于构建小程序的页面结构。例如&#xff0c;通过标签来定义各种视图元素&#xff0c;如<view>&#xff08;类似于 HTML 中的<div>&#xff…

GaussDB 华为高斯数据库

GaussDB 是华为推出的一款企业级分布式数据库&#xff0c;旨在为企业提供高效、可靠、安全的数据库服务。GaussDB 基于华为在数据库领域的多年积累&#xff0c;结合人工智能技术和分布式架构&#xff0c;支持多种场景的数据存储与管理需求&#xff0c;是云计算、大数据、人工智…

redis工程实战介绍(含面试题)

文章目录 redis单线程VS多线程面试题**redis是多线程还是单线程,为什么是单线程****聊聊redis的多线程特性和IO多路复用****io多路复用模型****redis如此快的原因** BigKey大批量插入数据测试数据key面试题海量数据里查询某一固定前缀的key如果生产上限值keys * &#xff0c;fl…

C++从零到满绩——入门基础and类和对象(上)

目录 1>>前言 2>>函数重载 3>>引用 3.1>>引用的概念 3.2>>引用三大特性 3.3>>引用的使用 3.4>>const引用 3.5>>指针与引用的关系 4>>inline内联函数 5>>nullptr 6>>类和对象&#xff08;上&#…

DDPM与DDIM中的采样

在深度生成模型中&#xff0c;采样&#xff08;Sampling&#xff09;指的是根据模型生成新样本的过程。在扩散模型&#xff08;Diffusion Models&#xff09;中&#xff0c;采样的关键是从高斯噪声逐步还原出原始数据。让我们分别探讨 DDPM 和 DDIM 的采样过程&#xff0c;以及…

python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改

Two-Step Vertification required&#xff1a; Please enter the mobile app OTPverification code: 01.因为巡检的服务器要双因子认证登录&#xff0c;也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录&#xff0c;算一次会话…

【Web前端】创建我的第一个 Web 表单

Web 开发中&#xff0c;表单是不可或缺的组成部分。无论是用户注册、登录还是反馈收集&#xff0c;表单都是与用户交互的重要方式。 什么是 Web 表单&#xff1f; Web 表单是一种用于收集用户输入数据的界面元素。它们允许用户在浏览器中输入信息并提交这些信息到服务器。Web …

JavaWeb后端开发知识储备2

目录 1.HttpClient 2.微信小程序开发 3.Spring Cache 1.HttpClient 简单来说&#xff0c;HttpClient可以通过编码的方式在Java中发送Http请求 2.微信小程序开发 微信小程序的开发本质上是前端开发&#xff0c;对于后端程序员来说了解即可 3.Spring Cache Spring Cache 是…

力扣刷题--21.合并两个有序链表

I am the best &#xff01;&#xff01;&#xff01; 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现

开题报告 随着旅游业的快速发展和互联网的普及&#xff0c;越来越多的人选择通过网络平台获取旅游攻略和分享旅行经验。传统的旅游攻略获取方式往往依赖于纸质书籍或零散的在线资源&#xff0c;这种方式不仅信息更新滞后&#xff0c;而且缺乏互动性和个性化推荐。因此&#xf…