数据结构——(java版)包装类与泛型

文章目录

  • 一 包装类
    • 1.1 包装类的概念
    • 1.2 装箱/装包
    • 1.3 拆箱/拆包
    • 1.4 一个面试题:
  • 二 泛型
    • 2.1 什么是泛型?
    • 2.2 泛型的使用
    • 2.3 泛型的上界
    • 2.4 泛型实现Comparable接口
    • 2.5 擦除机制
    • 另外:


一 包装类

1.1 包装类的概念

在java中基本数据类型并不继承于Object,为了在泛型代码中支持基本数据类型,对每一个基本数据类型都对应了一个包装类。
在这里插入图片描述

 如图所示,除int类型与char类型外,其余的包装类名均是数据类型名首字母大写!

1.2 装箱/装包

     装箱是指将基本数据类型的值转换成包装类类型
     进行装箱的方法:valueOf
        int a = 10;
        //装箱成Integer类型
        Integer i = Integer.valueOf(a);
        System.out.println(i);
        Integer i2 = 10;    //隐式装箱
        System.out.println(i2);

在这里插入图片描述
隐式装箱的原理:
在这里插入图片描述
如图所示:第一个valueOf方法是我们自己调用的
而第二个valueOf方法是系统默认调用的,即在隐式装箱时,系统默认调用了valueOf方法!

 能否装箱成Double封装类?
        int a = 10;
        Double double1 = Double.valueOf(a);

在这里插入图片描述

总结:即使不是对应的包装类,也可以进行装箱。

1.3 拆箱/拆包

 拆箱即将数据从包装类类型转换成基本数据类型
拆箱的方法:intValue()方法
   Integer a3 = 10;
        int i1 =  a3.intValue();    //拆箱
        int i2 = a3;                //自动拆箱
// 观察本质实现,实际上是调用了intValue()方法.
        System.out.println(i1);
        System.out.println(i2);

在这里插入图片描述
隐式拆箱的原理:
在这里插入图片描述
第一个intValue方法是显式装箱,第二个intValue方法是隐式装箱,系统自动调用intValue方法!

1.4 一个面试题:

  判断下面两个布尔表达式的值是什么?
        Integer a4  = 100;
        Integer a5  = 100;
        System.out.println(a4==a5);
        Integer a6  = 200;
        Integer a7 = 200;
        System.out.println(a6==a7);

在这里插入图片描述

为什么会出现这个结果?
要查看原理,就要看valueOf方法是怎样实现的!

在这里插入图片描述
代码解析:
如果传入的实参i值 在IntegerCache.low这个值与IntegerCache.high这个值范围之内,就返回
IntegerCache.cache这个数组中相应数组元素的内容。

如果不在这个范围之内,就新创建一个对象并返回。

在这里插入图片描述

二 泛型

2.1 什么是泛型?

对于一般的方法与变量,只能使用具体的类型:自定义类型与基本数据类型,但是如果要写适用于多种类型的代码,这种刻板的方式对代码的束缚就很大,我们可以通过泛型来解决这个问题,本质就是将类型参数化!

2.2 泛型的使用

举例:创建一个有数组成员的类:创建两个方法,一个为数组赋值,一个获取数组的值!

1 .我们似乎可以不使用泛型,通过Object类使用一段代码接收所有类型的数据!

//普通类
class MyArray{

    public Object [] arrays = new Object[10];
    //为数组设置值!
    public void setValue(int pos, Object o ){
        arrays[pos] = o;
    }
    public Object getValue(int pos){
        return  arrays[pos];
    }
}
public class Test {

 public static void main(String[] args) {
  MyArray myArray = new MyArray();
        myArray.setValue(0,10);
        myArray.setValue(1,"hello");
        System.out.println(myArray.getValue(0));
        System.out.println(myArray.getValue(1));
    }
}

在这里插入图片描述

 但是这种一个数组中存储多种不同类型数据的方式太乱
 我们可以通过指定参数类型来限制数据类型。
  1. 通过泛型类使用泛型
//泛型类:
//<E>可以看作一个占位符,代表将传入的类型
//在类名后面加<>,
class MyArray<E> {

    //创建一个数组
    public Object[] arrays = new Object[10];
    public E [] arrays2 = (E[])new Object[5] ;  //也可以这样创建一个数组!!!
    //不能直接实例化E!
    //为数组设置值!
    public void setValue(int pos, E o) {   //限定传入的参数类型
        arrays[pos] = o;
    }

    public Object getValue(int pos) {
        return (E) arrays[pos];                //将返回的数据强制转换成指定的数据类型
    }

}
public class Test {

    public static void main(String[] args) {
       MyArray<Integer> myArray = new MyArray<>();
        myArray.setValue(0,10);
       // myArray.setValue(1,"zhangsan");//只能传入整型值!
        System.out.println(myArray.getValue(0));

}

}

在这里插入图片描述
在这里插入图片描述

  1. 使用泛型方法而不是泛型类!
class MyArray {

    //创建一个数组
    public  Object[] arrays = new Object[10];
    //为数组设置值!
    public  <E> void setValue(int pos, E o) {   //限定传入的参数类型
        arrays[pos] = o;
    }
    public   <E> Object getValue(int pos) {
        return (E) arrays[pos];                //将返回的数据强制转换成指定的数据类型
    }

}
public class Test {

    public static void main(String[] args) {
       MyArray myArray = new MyArray();
       //在将<>放在调用的方法名之前,进行传参
     myArray.<Integer>setValue(0,5);
        System.out.println(myArray.<Integer>getValue(0));
     }

}

在这里插入图片描述

3.2 使用静态方法,这样可以不创建对象也可以调用方法!

class MyArray {

    //创建一个数组
    public  static  Object[] arrays = new Object[10];
    //为数组设置值!
    public  static <E> void setValue(int pos, E o) {   //限定传入的参数类型
        arrays[pos] = o;
    }
    public  static  <E> Object getValue(int pos) {
        return (E) arrays[pos];                //将返回的数据强制转换成指定的数据类型
    }

}
public class Test {

    public static void main(String[] args) {
      MyArray.<Integer>setValue(0,2);
     }

}

2.3 泛型的上界

//泛型的上界是指:泛型中指定的类型必须是一个类本身或者这个类的子类,此时这个类即泛型的上界。
class Person<E extends Number>{  
}

此时E代表的类型,必须是Number类本身或者Number的子类。
如果E 继承的是接口,则E代表的类型必须实现了此接口!

2.4 泛型实现Comparable接口

1. 泛型类型的变量不能够直接相互用关系运算符进行比较,因为不能确定是什么类型,所以需要实现Comparable口的类型
   
2. Object类中并没有实现Comparable接口,所以自定义的类中必须自己去实现Comparable接口!
 
3. 包装类自己已经实现了自动类接口
class Alg<E extends Comparable<E>> { 
    public E max(E[] arrays ){
          E max =  arrays[0];
        for (int i = 1; i < arrays.length ; i++) {
            if(max.compareTo(arrays[i])<0){
                max = arrays[i];
            }
        }
        return max;
    }
}
public class Test {
   public static void main(String[] args) {
        //泛型类实现Comparable接口:
        Integer [] arrays = {1,5,4,2,3,8,9,6};
   //Integer实现了comparable接口
        Alg<Integer> alg = new Alg<>();

        System.out.println(alg.max(arrays));

}

在这里插入图片描述
如果换成Person类:
在这里插入图片描述
此时报错:是因为Person类没有实现Comparable接口,不符合作为实参的条件!
在这里插入图片描述

2.5 擦除机制

在这里插入图片描述

另外:

在泛型类中,<>中的类型不参与类型的组成!

        MyArray<Integer>myArray1 = new MyArray<>();
        MyArray<String> myArray2  = new MyArray<>();
        System.out.println(myArray1);
        System.out.println(myArray2);

在这里插入图片描述
结果表明,与并没有参与到类型的组成中去,myArray1与myArray2的类型依然是
MyArray类型!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中国自动气象站:现代气象观测的中流砥柱

引言 气象观测是人类认识和预报天气的重要手段。在现代科技的推动下&#xff0c;自动气象站成为气象观测的重要工具&#xff0c;为天气预报、防灾减灾和气候研究提供了宝贵的数据支持。本文将介绍中国自动气象站的发展历程、技术特点及其在气象观测中的重要作用。 中国自动气象…

【Linux】信号(一)

信号我们将从信号产生&#xff0c;信号的保存&#xff0c;信号处理分别进行讲解~ 至少大思路是这样。开始之前还要进行一些基础知识的铺垫。 目录 从生活中提炼一些结论&#xff1a;信号概念的一些储备&#xff1a;信号产生&#xff1a;一、kill指令&#xff1a;二、键盘组合键…

BP 客户主数据-国际贸易条款发生更改

Issue &#xff1a;ECC升级S4后 1&#xff09;客户主数据扩产线时(LHGX03)&#xff0c;国贸条件2变更记录查询时&#xff0c;所扩产线&#xff08;30 1C&#xff09;无变更记录&#xff0c;未变更产线&#xff08;10 1C/1H/1M&#xff09;确认变更记录 20230108新增&#xff1…

生命在于学习——Python人工智能原理(3.2)

三、深度学习 &#xff08;二&#xff09;人工神经网络 人工神经网络是模仿人类大脑神经系统工作原理所创建的数学模型&#xff0c;有并行的分布处理能力、高容错性和自我学习等特征。 1、感知器 感知器由Frank Roseblatt于1957年提出&#xff0c;是一种广泛使用的线性分类…

Matlab解决矩阵微分方程建模(代码开源)

#用matlab解决施密特正交规范化矩阵之后&#xff0c;我又想到矩阵的微分方程计算量真的太大了&#xff0c;来回转化让我头大&#xff0c;于是我尝试了一下用matlab建立模型来解决这类问题。 代码部分如下&#xff1a;注解还挺清晰的&#xff1a; %%%解微分方程组%eg&#xff…

多目标优化-NSGA-II

文章目录 一、前置知识NSGA-II帕累托前沿 二、算法流程1.NSGA2.NSGA-II 一、前置知识 1.NSGA(非支配排序遗传算法):旨在同时优化多个冲突的目标函数&#xff0c;寻找帕累托前沿上的解集。 什么是多个冲突的目标: 比如你看上了一辆车&#xff0c;你既想要它便宜&#xff0c;又…

一个思维狂赚20万+?揭秘电商平台隐藏的流量认知!

你想要的流量&#xff0c;资源&#xff0c;人脉&#xff0c;都已经有人为你准备&#xff0c;你只需要找到拥有这些资源的人。对于流量和信息&#xff0c;也是一样&#xff0c;你想找的客户和产品&#xff0c;都已经有人为你准备在淘宝、拼多多等电商平台&#xff0c;你只需要找…

掌握Postman,轻松调试POST与GET接口:详细安装与实战教程,让你的API测试更高效

0.前言 在确保数据接口的稳定性和可访问性方面&#xff0c;使用专业的接口测试工具至关重要。这些工具不仅简化了测试流程&#xff0c;还提供了无需编写额外代码即可轻松调用和调试接口的能力&#xff0c;从而大大提高了测试效率和准确性。 0.1 Postman 背景介绍 用户在开发或…

遭遇Device Association Service占用CPU和内存过高异常

1.异常描述 在蓝牙设备搜索和配对过后&#xff0c;系统界面卡住了&#xff0c;查找了下任务管理器&#xff0c;发现有一个主机服务占用了过多的CPU和内存&#xff0c;且不断的在增长。截图如下&#xff1a; 百度查了下&#xff0c;Device Association Service是一个Win10系统服…

HCIP-Datacom-ARST自选题库_10_多种协议多选【24道题】

1.如图所示&#xff0c;PE1和PE2之间通过LoopbackO接口建立MP-BGP邻居关系&#xff0c;在配完成之后&#xff0c;发现CE1和CE2之间无法互相学习路由&#xff0c;下列哪些选项会造成该问题的出现? PE1或PE2未在BGP-VPNV4单播地址族视图使能邻居A PE1或PE2上的VPN实例参数配置错…

JVM的内存结构

JVM 内存结构 方法区: 方法区主要用于存储虚拟机加载的类信息、常量、静态变量&#xff0c;以及编译器编译后的代码等数据。 程序计数器 由于在JVM中&#xff0c;多线程是通过线程轮流切换来获得CPU执行时间的&#xff0c;因此&#xff0c;在任一具体时刻&#xff0c;一个CP…

2.1.3 采用接口方式使用MyBatis

实战概述&#xff1a;使用MyBatis的接口方式进行数据库操作 环境准备 确保项目中已经集成了MyBatis框架。 创建用户映射器接口 在net.huawei.mybatis.mapper包中创建UserMapper接口。定义方法findById(int id)用于按编号查询用户。定义方法findAll()用于查询全部用户。定义方法…

[沫忘录]MySQL InnoDB引擎

[沫忘录]MySQL InnoDB引擎 逻辑存储结构 InnoDB采用 “表、段&#xff0c;区&#xff0c; 页、行” 这样的层级结构进行存储。 **表空间(tablespace)**ibd文件&#xff0c;主要用于存储记录、索引等数据&#xff0c;一个mysql实例可有多个表空间&#xff0c;甚至能通过innodb…

代理IP科普:IP黑名单与IP白名单的机制与作用

在IP代理使用中&#xff0c;我们经常听到黑名单与白名单两个名词&#xff0c;它们不仅提供了强大的防御机制&#xff0c;还可以灵活应对不同的安全威胁。本文将详细探讨IP黑名单和白名单在网络安全中的双重屏障作用。 一、IP黑名单和白名单定义 IP黑名单与IP白名单是网络安全中…

WPF中Window的外观实现及常用属性

文章目录 1. 概要2. Window的外观2.1 Window的外观组成2.2 Window的实现2.3 Window外观配置2.4 Window 的其他常用属性1. AllowsTransparency 2. WindowStartupLocation3. ShowInTaskbar4. ShowActivated5. SizeToContent6. Topmost7. WindowStyle 1. 概要 和 Android 类似, W…

C语言笔记第13篇:自定义类型(联合union和枚举enum)

1、联合体 1.1 联合体类型的声明 像结构体一样&#xff0c;联合体也是由一个或多个成员构成&#xff0c;这些成员可以是不同的类型。 但是编译器只为最大的成员分配足够的内存空间&#xff0c;联合体的特点是所有成员共用一块内存空间&#xff0c;所以联合体也叫&#xff1a…

计算机发展史 | 从起源到现代技术的演进

computer | Evolution from origins to modern technology 今天没有参考资料哈哈 PPT&#xff1a;&#xff08;评论区&#xff1f;&#xff09; 早期计算工具 算盘 -算盘是一种手动操作的计算辅助工具&#xff0c;起源于中国&#xff0c;迄今已有2600多年的历史&#xff0c;是…

【Python】常见的第三方库及实例

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 库介绍 Python是通过模块来体现库&#xff0…

数据结构--双向链表

目录 一.链表的分类 二.双向链表的结构 三.双向链表的实现 1.初始化 2.尾插与头插 3.尾删与头删 4.在指定位置之后插入数据 查找函数 5.删除指定节点 6&#xff0c;销毁链表 四.完整代码 List.h List.c 一.链表的分类 链表的结构⾮常多样&#xff0c;以下情况组合起…

C++第三方库【httplib】断点续传

什么是断点续传 上图是我们平时在浏览器下载文件的场景&#xff0c;下载的本质是数据的传输。当出现网络异常&#xff0c;浏览器异常&#xff0c;或者文件源的服务器异常&#xff0c;下载都可能会终止。而当异常解除后&#xff0c;重新下载文件&#xff0c;我们希望从上一次下载…