包装类+初识泛型

目录

1 .包装类

1.1 基本数据类型对应的包装类

1.2.1装箱

​1.2.2拆箱

 2.初识泛型

2.1什么是泛型

 2.2泛型类

2.3裸类型

 2.4泛型的上界

2.5泛型方法


1 .包装类

基本数据类型所对应的类类型

Java 中,由于基本类型不是继承自 Object ,为了在泛型代码中可以支持基本类型, Java 给每个基本类型都对应了 一个包装类型。

1.1 基本数据类型对应的包装类

基本数据类型
包装类
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean
除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写

1.2 装箱和拆箱

1.2.1装箱

(1)自动装箱
int a=100;
Integer val=a;
System.out.println(val);(2)显示装箱
Integer integer1 = new Integer(a);
System.out.println(integer1);
Integer integer2 = Integer.valueOf(a);
System.out.println(integer2);
自动装箱 Integer val=a;本质就是Integer.valueOf(a)

 1.2.2拆箱

(1)自动拆箱
Integer val=100;
int a=val;
System.out.println(a);(2)显示拆箱
int a2=val.intValue();
System.out.println(a2);

 自动拆箱int a=val本质就是val.intValue()

 而且可以拆箱成各种类型

理解加深 

 

public static void main ( String [] args ) {
Integer a = 127 ;
Integer b = 127 ;
Integer c = 128 ;
Integer d = 128 ;
System . out . println ( a == b );
System . out . println ( c == d );
}

运行结果:

 

 解析:

总结:装箱的整形在-128到127之间返回的引用相同。 


 2.初识泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。

2.1什么是泛型

就是适用于许多许多类型 。从代码上讲,就是对类型实现了参数化。
泛型的主要目的:
就是指定当前的容器,要持有什么类型的对象。让编译 器去做检查。 此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

 2.2泛型类

语法
class 泛型类名称 < 类型形参列表 > {
// 这里可以使用类型参数
}
class ClassName < T1 , T2 , ..., Tn > {
}

泛型类的使用 

泛型类 < 类型实参 > 变量名 ; // 定义一个泛型类引用
new 泛型类 < 类型实参 > ( 构造方法实参 ); // 实例化一个泛型类对象

MyArray<Integer> list = new MyArray<Integer>();  

使用举例:

写一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值。

代码(2-1)如下:

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

 对于泛型的进一步补充:

1. 类名后的 <T> 代表占位符,表示当前类是一个泛型类
【规范】类型形参一般使用一个大写字母表示,常用的名称有:

 

2.,不能new泛型类型的数组

 

代码(2-1)T[] array = (T[])new Object[10];是否就足够好,答案是未必的。

我们可以参考官方代码:

改造 代码(2-1)

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

2.3裸类型

裸类型是一个泛型类但没有带着类型实参,例如 MyArrayList 就是一个裸类型

MyArray list = new MyArray ();

为什么有这样的写法呢?

泛型在编译的过程当中 存在擦除机制(以代码(2-1)为例

所有的E替换为Object 这种机制,我们称为: 擦除机制
Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。

avap -c 查看字节码文件,所有的E都是Object。 

泛型类的使用时我们给的类型实参主要起两个作用:

(1)存储数据的时候,可以帮我们进行自动的类型检查

(2)获取数据的时候,可以帮我们进行类型转换

 2.4泛型的上界

 在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

语法:

写法1.

class 泛型类名称 < 类型形参 extends 类型边界 > {
...
}
public class MyArray < E extends Number > {
...
}
只接受 Number 的子类型作为 E 的类型实参
写法2.
public class MyArray < E extends Comparable < E >> {
...
}

E必须是实现了Comparable接口的

举例:

写一个类,可以传入多种类型的数组,返回其中的最大值。

写法1:

 写法2:

 正确代码:

public class Text2 {public static <E extends Comparable<E>>  E Max(E[]arr) {E ret = arr[0];for (int i = 1; i < arr.length; i++) {if (ret.compareTo(arr[i]) < 0) {ret = arr[i];}}return ret;}

2.5泛型方法

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

示例

public class Text2 {public static <E extends Comparable<E>>  E Max(E[]arr) {E ret = arr[0];for (int i = 1; i < arr.length; i++) {if (ret.compareTo(arr[i]) < 0) {ret = arr[i];}}return ret;}public static void main(String[] args) {Integer[] arr={6,2,3,4,1000,1};System.out.println(Max(arr));}
}

使用示例-可以类型推导  

写在main方法中
Integer [] a = { ... };
Max ( a );
String [] b = { ... };
Max ( b );

 使用示例-不使用类型推导

Integer [] a = { ... };
Util . < Integer > Max ( a );
String [] b = { ... };
Util . < String > Max ( b );

以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot集成Mybatis Plus通过Pagehelper实现分页查询

文章目录 0 简要说明Pagehelper1 搭建环境1.1 项目目录1.2 项目搭建需要的依赖1.3 配置分页插件拦截器1.4 源代码启动类实体类数据层xml映射文件业务层业务层实现类控制层接口配置swagger请求体 2 可能出现的疑问或者问题2.1 关于total属性疑问2.2 分页不生效问题 3 案例说明3.…

分类预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据分类预测

分类预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据分类预测 目录 分类预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据分类预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 Matlab实现基于…

【Docker晋升记】No.2 --- Docker工具安装使用、命令行选项及构建、共享和运行容器化应用程序

文章目录 前言&#x1f31f;一、Docker工具安装&#x1f31f;二、Docker命令行选项&#x1f30f;2.1.docker run命令选项&#xff1a;&#x1f30f;2.2.docker build命令选项&#xff1a;&#x1f30f;2.3.docker images命令选项&#xff1a;&#x1f30f;2.4.docker ps命令选项…

多线程与高并发--------阻塞队列

四、阻塞队列 一、基础概念 1.1 生产者消费者概念 生产者消费者是设计模式的一种。让生产者和消费者基于一个容器来解决强耦合问题。 生产者 消费者彼此之间不会直接通讯的&#xff0c;而是通过一个容器&#xff08;队列&#xff09;进行通讯。 所以生产者生产完数据后扔到…

matlab使用教程(14)—稀疏矩阵的运算

1.运算效率 1.1计算复杂度 稀疏运算的计算复杂度与矩阵中的非零元素数 nnz 成比例。计算复杂度在线性上还与矩阵的行大小 m 和列大小 n 相关&#xff0c;但与积 m*n&#xff08;零元素和非零元素总数&#xff09;无关。相当复杂的运算&#xff08;例如对稀疏线性方程求解&…

RabbitMQ 事务

事务简介 就像我们了解的MySQL中的事务一样&#xff0c;RabbiMQ的事务也具备原子性和一致性&#xff0c;并且RabbiMQ的事务是针对消息从生产者发送到RabbitMQ中提供的支持&#xff0c;因此不同事务可以同时给同一个队列发送信息。   可通过channel.txSelect&#xff0c;chann…

Android侧滑栏(一)可缩放可一起移动的侧滑栏

在实际的各类App开发中&#xff0c;经常会需要做一个左侧的侧滑栏&#xff0c;类似于QQ这种。 今天这篇文章总结下自己在开发中遇到的这类可以跟随移动且可以缩放的侧滑栏。 一、实现原理 使用 HorizontalScrollView 实现一个水平方向的可滑动的View&#xff0c;左布局为侧滑…

MySQL多表关联查询

目录 1. inner join&#xff1a; 2. left join&#xff1a; 3. right join&#xff1a; 4.自连接 5.交叉连接&#xff1a; 6、联合查询 7、子查询 1. inner join&#xff1a; 代表选择的是两个表的交差部分。 内连接就是表间的主键与外键相连&#xff0c;只取得键值一致…

Grafana展示k8s中pod的jvm监控面板/actuator/prometheus

场景 为保障java服务正常运行&#xff0c;对服务的jvm进行监控&#xff0c;通过使用actuator组件监控jvm情况&#xff0c;使用prometheus对数据进行采集&#xff0c;并在Grafana展现。 基于k8s场景 prometheus数据收集 配置service的lable&#xff0c;便于prometheus使用labl…

【ES6】深入理解ES6(1)

一、块级作用域绑定 var声明及变量提升机制 二、字符串和正则表达式 字符串&#xff08;String&#xff09;是JavaScript6大原始数据类型。其他几个分别是Boolean、Null、Undefined、Number、Symbol&#xff08;es6新增&#xff09;。 更好的Unicode支持 1. UTF-16码位 字…

【Archaius技术专题】「Netflix原生态」动态化配置服务之微服务配置组件变色龙

前提介绍 如果要设计开发一套微服务基础架构&#xff0c;参数化配置是一个非常重要的点&#xff0c;而Netflix也开源了一个叫变色龙Archaius的配置中心客户端&#xff0c;而且Archaius可以说是比其他客户端具备更多生产级特性&#xff0c;也更灵活。*在NetflixOSS微服务技术栈…

《Java-SE-第三十四章》之Optional

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水平很有限&…