包装类初识泛型

一.包装类

在Java中, 基本类型不继承于Object类. 所以为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型.(包装类型相当于引用类型)

1.基本类型对应的包装类

  • byte -- Byte
  • short -- Short
  • int -- Integer
  • long -- Long
  • float -- Float
  • double -- Double
  • char -- Character
  • boolean -- Boolean

我们可以从中找到规律: 除了int和char, 其余基本类型的包装类都是首字母大写.

2.装箱和拆箱

(1) 装箱: 就是把基本类型变成包装类型. 装箱需要调用Integer类的valueOf方法, 装箱有两种方式:手动装箱和自动装箱 (显式装箱和隐式装箱)

int a = 10;

Integer ii = Integer.valueOf(a); // 手动装箱(显式装箱)

Integer ii2 = a; //自动装箱(隐式装箱)

(2) 拆箱: 就是把引用类型(包装类型)变成基本类型.拆箱需要用到intValue方法,拆箱也有两种方式:手动拆箱和自动拆箱 (显式拆箱和隐式拆箱)

Integer ii = 10;

int a = ii.intValue(); //手动拆箱(显式拆箱)

int a = ii; //自动拆箱(隐式拆箱)

[面试题] :

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

        System.out.println(a == b);
        System.out.println(c == d);
    }

问, 上述代码输出什么?

答案:

为什么输出true和false呢?  我们可以看到, 四行代码进行的操作都是装箱.装箱操作会调用valueOf方法, 我们查看valueOf的源码:

从中可以看到 , 如果i是在[low, high)这个范围之内(对于Integer来说, low = -128, high = 127), 那么就是去cache数组中取值返回; 相反,如果i不在这个范围内, 就会实例化一个Integer类的对象返回.

此时我们在看这个代码: a和b在这个范围内, 那么a,b都是从这个数组中取值.又因为a和b的值相等,所以a,b是从数组的同一位置取值的. 所以a,b的包装类值相等 ;  而c,d不在这个范围内,所以c,d是都是新实例化的对象, c和d是两个不同的对象, 地址肯定不相同,所以c,d的包装类值不等.

二.泛型

1.泛型的概念

一般的类和方法,只能使用基本类型和引用类型,这种刻板的限制对代码的束缚就很大. 所以Java引入了"泛型"这个语法. 泛型: 就是适用于许多类型. (泛型实现了类型的参数化 -- 可以传指定类型的参数).

首先我们先看一个代码示例:

我们可以看到,上述代码的问题是: (1) 这个数组中任何类型的数据都能存放.  (2) 用String类的对象接收"hello"时,需要强转(因为在这里"hello"是Object类型的)   但是, 更多情况下,我们还是更希望数组中只存放一种类型的数据.此时就要用到泛型.

所以,泛型的主要目的就是: 指定当前容器(类 / 方法)要持有什么类型的对象,并以参数形式传递此类型(需要什么类型,就传入什么类型), 让编译器去做检查.

注意: 类型参数传的必须是引用类型(包装类型), 不能是基本类型!!!

2.泛型类

语法形式:

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

代码示例:

 

泛型类的使用示例:

 运行结果:

 

3.泛型方法

泛型方法: 即方法的返回值以参数方式指定

代码示例:

注意事项: 引用类型对象的大小比较,是不能直接使用 ">", "<" 的, 需要重写Object类的CompareTo方法, 再调用CompareTo方法对两者进行比较.

4.泛型的上界

泛型的上界, 就是对泛型表示类型的范围做出了限制.

例如:

此行代码表示: 传进来的类型参数E 必须是继承于Comparable接口的.

 

上述代码表示: 传进来的类型参数T 必须是继承于Number类的. 

以上就是本篇博客的全部内容啦,如果喜欢小编的文章,可以点赞,评论,收藏~

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

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

相关文章

Vue2 基础学习-案例实践

数据管理信息的增删改查的实践 主要应用&#xff1a; 数据插值&#xff1a; {{xxx}}双向绑定&#xff1a;v-model点击事件函数&#xff1a;click列表xxx的增删改实现 xxx.push(row) 增加xxx.splice(id,1) 删除 一行{x,y} xxx[id]; 编辑 <!DOCTYPE html> <html la…

蓝桥杯 2019 省A 糖果 动态规划/二进制

#include <bits/stdc.h> // 包含标准库中的所有头文件 using namespace std;int main() {int n,m,k; // 定义变量n&#xff08;糖果包数&#xff09;、m&#xff08;口味数&#xff09;、k&#xff08;每包糖果的个数&#xff09;cin>>n>>m>>k; // 输入…

[lesson31]完善的复数类

完善的复数类 完善的复数类 复数类应该具有的操作 运算&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/比较&#xff1a;&#xff0c;!赋值&#xff1a;求模&#xff1a;modulus 利用操作符重载 统一复数与实数的运算方式统一复数与实数的比较方式 注意事项 C规定赋…

Day 25 组合(优化)216.组合总和III 17.电话号码的字母组合

组合&#xff08;优化&#xff09; 先给出组合问题的回溯部分代码&#xff1a; vector<vector<int>> result; // 存放符合条件结果的集合vector<int> path; // 用来存放符合条件结果void backtracking(int n, int k, int startIndex) {if (path.size() k) …

洛谷P1305 新二叉树

Java 代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();char arr[][] new char[n][3];for (int i 0; i < n; i) {String strsc.next();char arr1[]str.toCharArray()…

【计算机考研】跨考计算机,需要准备多久才来得及?

9个月跨考计算机&#xff0c;如果选择是408的话&#xff0c;时间稍微有点紧张&#xff0c;前期感觉不大&#xff0c;后期数学408堆在一起会感觉很难受... 很多确定考408的同学都是一开始先从数据结构开始复习的&#xff0c;这样到了中后期觉得自己时间不够了再去转自命题也来得…

UE5数字孪生系列笔记(四)

场景的切换 创建一个按钮的用户界面UMG 创建一个Actor&#xff0c;然后将此按钮UMG添加到组件Actor中 调节几个全屏的背景 运行结果 目标点切换功能制作 设置角色到这个按钮的位置效果 按钮被点击就进行跳转 多个地点的切换与旋转 将之前的目标点切换逻辑替换成旋转的逻…

使用webpack5+TypeScript+npm发布组件库

一、前言 作为一只前端攻城狮&#xff0c;没有一个属于自己的组件库&#xff0c;那岂不是狮子没有了牙齿&#xff0c;士兵没有了武器&#xff0c;姑娘没有了大宝SOD蜜&#xff0c;你没有了我.... 言归正传&#xff0c;下面将给大家介绍如何通过webpack5编译一个TS组件发布到NPM…

Cannot find runner for app ——Android Studio

问题 在修改build.gradle(:app)文件或者其他操作后&#xff0c;出现了无法运行的问题&#xff1a; Cannot find runner for app 如图运行按钮不可点击。 解决方案 点击【File】下的【Sync Project with Gradle Files】同步完成后&#xff0c;一般就可运行了。

树形侧边栏(展开、全选、切换名称)

父文件&#xff1a; index.vue <template><div class"h-full p20px bg-#f5f5f5"><ContentWrap class"w-260px h-[calc(100vh-200px)] min-h-700px"><TenantTree select"tentantSelect" /></ContentWrap></div&…

ExtendSim花生酱加工厂模型

该模型展示了ExtendSim可靠性模块与ExtendeSim离散速率技术相结合的协同作用。 在花生酱加工厂的最初阶段&#xff0c;花生经过烘烤和冷却。冷却后的花生经过热烫或水烫去外皮。这些经过漂白的花生进入过程的混合部分&#xff0c;在研磨机中用盐、葡萄糖和氢化油稳定剂将其粉碎…

链表基础3——单链表的逆置

链表的定义 #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; Node* createNode(int data) { Node* newNode (Node*)malloc(sizeof(Node)); if (!newNode) { return NULL; } newNode->data …

【七 (1)指标体系建设-构建高效的故障管理指标体系】

目录 文章导航一、故障概述1、故障&#xff1a;2、故障管理&#xff1a; 二、指标体系概述1、指标2、指标体系 三、指标体系构建难点1、管理视角2、业务视角3、技术视角 四、指标体系构建原则1、与战略目标对齐2、综合和平衡3、数据可获得性4、可操作性5、具体和可衡量6、参与和…

Windows10为Git Bash添加文件传输命令rsync(详细图文配置)

文章目录 1. 安装git bash2. 下载所需要的4个包3. 下载解压包的软件4. 复制每个包下面的usr到git安装目录下4.1 所遇问题4.2 解决 5. 安装完成6. 需要注意 Windows上要使用 rsync命令上传或下载文件&#xff0c;需要使用git bash&#xff0c;git bash没有rsync&#xff0c;需要…

盘点2024年最新可用免费云服务器

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人开始使用云服务器来满足各种业务需求。云服务器作为云计算的核心服务之一&#xff0c;以其弹性扩展、按需付费等特点受到广泛关注。本文将为大家盘点2024年最新可用免费云服务器&#xff0c;助力大家轻松上云&#xf…

Problem #8 [Easy]

This problem was asked by Google. A unival tree (which stands for “universal value”) is a tree where all nodes under it have the same value. Given the root to a binary tree, count the number of unival subtrees. For example, the following tree has 5 un…

【c 语言】声明了一个指针,会给指针分配内存吗?

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

借力社交裂变,Xinstall助你实现用户快速增长

在数字化时代&#xff0c;社交裂变已成为品牌获取新用户、扩大影响力的关键手段。然而&#xff0c;如何有效利用社交裂变&#xff0c;实现用户快速增长&#xff0c;却是许多品牌面临的挑战。今天&#xff0c;我们将为大家介绍一个强大的社交裂变引擎——Xinstall&#xff0c;它…

状态模式【行为模式C++】

1.概述 状态模式是一种行为设计模式&#xff0c; 让你能在一个对象的内部状态变化时改变其行为&#xff0c; 使其看上去就像改变了自身所属的类一样。 2.结构 State(抽象状态类)&#xff1a;定义一个接口用来封装与上下文类的一个特定状态相关的行为&#xff0c;可以有一个或多…

【Linux C | 多线程编程】线程同步 | 互斥量(互斥锁)介绍和使用

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 本文未经允许…