包装类与泛型

news2024/12/23 16:32:07

泛型与包装类密切相关,在学习泛型前先了解了解包装类吧

包装类

包装类是对应着各种基本数据类型进行包装后产生的引用数据类型 ,是基本数据类型的plus版本。

为什么要设计包装类

因为 Java是一个面向对象的编程语言,但是Java中的八种基本数据类型却是不面向对象的,为了使用方便和解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八种基本数据类型对应的类统称为包装类(Wrapper Class),包装类均位于java.lang包。

包装类的用处

对于包装类说,用途主要包含两种:

  1. 作为基本数据类型对应的类 类型存在,方便涉及到对象的操作。
  2. 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。

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

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

除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。

2、包装类的使用

(1)装箱和拆箱

装箱:建立包装类对象,将对应基本数据类型放入对象属性中

int i=10;
Integer i1=Integer.valueOf(i);
Integer i2=new Integer(100);

拆箱:将包装类对象的属性值取出放入对应基本数据类型中

int j=i1.intValue();

自动装箱和自动拆箱

int i = 10;
Integer ii = i; // 自动装箱
Integer ij = (Integer)i; // 自动装箱
int j = ii; // 自动拆箱
int k = (int)ii; // 自动拆箱

(2)类内部常用方法

包装类作为类,有非常多的方法。下面以int-Integer为例,

        //parseInt方法: 数字字符串类型转成int类型
        String s="123";
        int i = Integer.parseInt(s);
        System.out.println("字符类型转成整型:"+i);
        //toString方法:int类型转成数字字符串类型
        int ii=123;
        String s2 = Integer.toString(ii);
        System.out.println("int类型转成数字字符串类型:"+s2);

细说valueOf ( ) 源码分析

public static Integer valueOf(int i) {
     assert IntegerCache.high>= 127;
     if (i >= IntegerCache.low&& i <= IntegerCache.high)
     return IntegerCache.cache[i+ (-IntegerCache.low)];
     return new Integer(i); 
}

注意方法体中,在返回之前对 int 作判断,IntegerCache.low=-128,IntegerCache.high=127.

127 >=  i >= -128,直接返回数组下标为i-(-128)的值,而不在这个范围时,返回新的对象

来两道常见面试题练练手吧

1、Java中 int 和 Intrger 的区别

  1. int 是基本类型,直接存数值;而integer引用数据类型。
  2. Int的声明不需要实例化,且变量声明后的初始值为0;Integer的是一个类,初始值为null,需要进行实例化,才能对变量数据进行处理。
  3. Integer类是int的包装类,实际开发中Integer被看成一个对象,可以进行数据转换等操作。

2、代码输出结果是? 

Integer a=100;
Integer b=100;
System.out.println(a==b);

Integer m=200;
Integer n=200;
System.out.println(m==n);

答案是   true    false 

泛型

1、概述

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。----- 来源《 Java 编程思想》对泛型的介绍。
泛型是在 JDK1.5 引入的新的语法,通俗讲,泛型: 就是适用于许多许多类型从代码上讲,就是对类型实现了参数化。 那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式,然后在使用/调用时传入具体的类型)。

泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

2、引出泛型

举个例子

 class MyArray {
            public Object[] array = new Object[10];

            public Object getPos(int pos) {
                return this.array[pos];
            }

            public void setVal(int pos, Object val) {
                this.array[pos] = val;
            }
        }

        MyArray myArray = new MyArray();
        myArray.setVal(0, 10);
        myArray.setVal(1, "hello");//字符串也可以存放

        String ret1=myArray.getPos(1);//error
        String ret2=(String) myArray.getPos(1);//运行正确

        System.out.println(myArray.array[0]);//打印10
        System.out.println(myArray.array[1]);//打印hello

 MyArray类中定义一个数组,类型为Object。

  • 在调用getPos与setPos时,参数既可以传入Integer类型也可以传入String等包装类。
  • 调用getPos取出结果,必须先强制类型转换。
虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种数据类 型。而不是同时持有这么多类型。所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译 器去做检查。 此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

3、语法

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

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

代码举例

public class Test {
    public static void main(String[] args) {
        MyArray<Integer> myArray = new MyArray<>();
        myArray.set(0, 20);
        myArray.set(1, "hello");//error
        int ret=myArray.get(0);
        System.out.println(ret);
    }
}
public class MyArray <E>{
        Object[]arr=new Object[10];

        void set(int pos,E val){
            arr[pos]=val;
        }
       E get(int pos){
            return (E) arr[pos];
        }
}
类名后的 <T> 代表占位符,表示当前类是一个泛型类。
了解: 【规范】类型形参一般使用一个大写字母表示,常用的名称有:
E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type
S, U, V 等等 - 第二、第三、第四个类型

4、泛型的上界

占位符后extends 类(泛型的上界)表示参数既可以放父类,也可以放当前类的子类。 

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

class 泛型类名称 < 类型形参列表 > extends 继承类 /* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}
public class Test {
    public static void main(String[] args) {
        MyArray<People> myArray = new MyArray<>();
        People p1=new People();
        Student s1=new Student();
        myArray.set(0,p1);
        myArray.set(1,s1);
    }
}
public class MyArray <E extends People>{
        Object[]arr=new Object[10];

        void set(int pos, E val){
            arr[pos]=val;
        }
       E get(int pos){
            return (E) arr[pos];
        }
}
public class People {

}
public class Student extends People{

}

5、擦除机制

那么,泛型到底是怎么编译的?这个问题,也是曾经的一个面试问题。泛型本质是一个非常难的语法,要理解好他 还是需要一定的时间打磨。
在编译的过程当中,将所有的 T 替换为 Object 这种机制,我们称为: 擦除机制
Java 的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。
有关泛型擦除机制的文章截介绍:   https://zhuanlan.zhihu.com/p/51452375

6、泛型方法

方法限定符 < 类型形参列表 > 返回值类型 方法名称 ( 形参列表 ) { ... }
public class Util {
            //静态的泛型方法 需要在static后用<>声明泛型类型参数
            public static <E> void swap(E[] array, int i, int j) {
                E t = array[i];
                array[i] = array[j];
                array[j] = t;
            }
        }

包装类与泛型学习到这里。

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

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

相关文章

科普文:微服务之Spring Cloud Alibaba组件熔断过载保护器Sentinel

一、什么是Sentinel Sentinel是阿里开源的项目&#xff0c;提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 官网&#xff1a;Home alibaba/Sentinel Wiki GitHub 2012年&#xff0c;Sentinel诞生于阿里巴巴&#xff0c;其主要目标是流量控制。…

浅谈几个常用OJ的注册方式

众所周知&#xff0c;好的OJ是成功的一半&#xff0c;但是有些英文OJ的注册很让人伤脑筋。 CodeForces 点进官网 戳这里 然后就会进入这个页面 在这一页里面里填写好信息即可 最后&#xff0c;一个邮件就会发到你的邮箱上&#xff0c;点击其中的链接即可激活账号 AtCoder …

软件测试生命周期、BUG描述与处理策略指南

软件测试的生命周期 需求分析&#xff1a;需求是否完整、是否正确 测试计划&#xff1a;确定由谁测试、测试的起止时间、设计哪些模块 测试设计、测试开发&#xff1a;写测试用例&#xff08;手工、自动化测试用例&#xff09;、编写测试工具 执行测试用例 测试评估&…

从文本到图像:深度解析向量嵌入在机器学习中的应用

简介 向量嵌入是机器学习领域中一项极具吸引力且实用的技术&#xff0c;它为多种应用提供了基础支撑&#xff0c;包括自然语言处理&#xff08;NLP&#xff09;、推荐系统和搜索算法。无论是推荐引擎、语音助手还是语言翻译器&#xff0c;这些系统的背后都可能运用了向量嵌入技…

ventoy和微pe可以共存吗?ventoy和pe共存使用教程

Ventoy新一代多系统启动U盘解决方案。国产开源U盘启动制作工具&#xff0c;支持Legacy BIOS和UEFI模式&#xff0c;理论上几乎支持任何ISO镜像文件&#xff0c;支持加载多个不同类型的ISO文件启动&#xff0c;无需反复地格式化U盘&#xff0c;插入U盘安装写入就能制作成可引导的…

将网络变压器(Ethernet Transformer)从千兆单口设计改为百兆双口设计涉及几个关键步骤和注意事项

变压器选型&#xff1a; 确保选用的变压器支持1000BASE-T到100BASE-TX的转换。通常&#xff0c;这种变压器会有额外的电气特性&#xff0c;如抑制和隔离等&#xff0c;以确保数据传输的可靠性和稳定性。 端口连接&#xff1a; 对于千兆单口设计&#xff0c;通常会有一对输入和输…

maya动画时间轴在哪里调出来?

在Maya动画制作中&#xff0c;时间轴是控制动画节奏和时间的关键工具。但初学者常困惑于时间轴的隐藏问题。本文将指导你如何找回并利用Maya的时间轴&#xff0c;确保你的动画制作流程顺畅无阻。 maya动画时间轴调出来方法 1、登录 Maya 软件&#xff0c;在显示设置中调出时间…

Day16_2--Servlet学习之过滤器+session实现防跳墙

Servlet过滤器Fileter是一个小型的web组件&#xff0c;它们通过拦截请求和响应&#xff0c;以便查看、提取或以某种方式操作客户端和服务器之间交换的数据&#xff0c;实现“过滤”的功能。Filter通常封装了一些功能的web组件&#xff0c;过滤器提供了一种面向对象的模块化机制…

使用生成式对抗网络(GAN)生成动漫人物图像

【图书推荐】《PyTorch深度学习与企业级项目实战》-CSDN博客 《PyTorch深度学习与企业级项目实战&#xff08;人工智能技术丛书&#xff09;》(宋立桓&#xff0c;宋立林)【摘要 书评 试读】- 京东图书 (jd.com) 如今AI艺术创作能力越来越强大&#xff0c;Google发布的ImageGe…

算法板子:BFS(广度优先搜索)——迷宫问题,求从迷宫的起点到终点的最短路径; 八数码问题,求从初始布局到最终布局x最少移动多少次

目录 1. 核心思想在于bfs函数2. 代码中用到的数组的含义解释3. 迷宫问题&#xff08;1&#xff09;求从(0,0)点到(4,4)点的最短路径是多少——bfs函数&#xff08;2&#xff09;打印最短路径——在bfs函数的基础上多了一个print函数a. 思想b. 代码 4. 八数码问题——bfs函数 1.…

科普文:微服务之Spring Cloud Alibaba消息队列组件RocketMQ工作原理

概叙 本文探讨 RocketMQ 的事务消息原理&#xff0c;并从源码角度进行分析&#xff0c;以及事务消息适合什么场景&#xff0c;使用事务消息需要注意哪些事项。 同时详细介绍RocketMQ 事务消息的基本流程&#xff0c;并通过源码分析揭示了其内部实现原理&#xff0c;尽管事务消…

【avue+vue2+elementui】删除、rules、页面跳转、列表数据过长、日期dayjs

这里写目录标题 一、删除二、rules三、页面跳转四、列表数据过长截断五、日期 dayjs一、删除 🍃API/*** 删除.* @param {*} data * @returns 返参*/ export const deleteOrder = (data) => {return request({url: /api/Order/deleteOrder,method: post,data}) }HTML🍃左…

常见病症之中医药草一枝黄花

常见病症之中医药草一枝黄花 1. 源由2. 一枝黄花植物描述药用部分主要成分药理作用使用方法注意事项 3. 常用方剂3.1 一枝黄花汤3.2 一枝黄花解毒汤 4. 着凉感冒主要方剂加味处方使用方法注意事项 5. 补充资料 1. 源由 注&#xff1a;仅供参考&#xff0c;建议在中医师指导下使…

Unity【入门】小项目坦克大战

文章目录 1、开始场景1、场景装饰RotateObj 2、开始界面BasePanelBeginPanel 3、设置界面GameDataMgrSettingPanel 4、音效数据逻辑MusicData 5、排行榜界面RankPanel 6、排行榜数据逻辑RankInfo 7、背景音乐BKMusic 2、游戏场景1、游戏界面GamePanel 2、基础场景搭建CubeObjQu…

如何使用极狐GitLab CI/CD Component Catalog?【上】

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

SQL进阶技巧:Hive如何巧解和差计算的递归问题?【应用案例2】

目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 有如下数据:反应了每月的页面浏览量 现需要按照如下规则计算每月的累计阅读量,具体计算规则如下: 最终结果如下: 1 数据准备 with data as( select 2024-01 as month ,2 as pv union all select 2024-02 …

使用MongoDB构建AI:Jina AI将突破性开源嵌入模型变为现实

Jina AI创立于2020年&#xff0c;总部位于德国柏林&#xff0c;主要从事提示工程和嵌入模型业务&#xff0c;已迅速成长为多模态AI领导者。Jina AI积极推动开源和开放研究&#xff0c;致力于弥合先进AI理论与开发者及数据科学家构建的AI驱动型真实世界应用程序之间的差距。目前…

卷积神经网络 - 池化(Pooling)篇

序言 在深度学习的广阔领域中&#xff0c;卷积神经网络&#xff08; CNN \text{CNN} CNN&#xff09;以其卓越的特征提取能力&#xff0c;在图像识别、视频处理及自然语言处理等多个领域展现出非凡的潜力。而池化&#xff08; Pooling \text{Pooling} Pooling&#xff09;作为…

智慧水务项目(四)django(drf)+angular 18 配置REST_FRAMEWORK

一、说明 建立了几个文件 二、一步一步来 1、建立json_response.py 继承了 Response&#xff0c; 一共三个函数&#xff0c;成功、详情&#xff0c;错误 from rest_framework.response import Responseclass SuccessResponse(Response):"""标准响应成功的返回…

springboot共享汽车租赁管理系统-计算机毕业设计源码99204

目 录 第 1 章 引 言 1.1 选题背景及意义 1.2 研究前期调研 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系统…