泛型的基础 装箱拆箱
泛型简单介绍
文章目录
- 泛型简单介绍
- 泛型的举例
- 注意点
- 泛型的编译机制
- 基本数据类型和包装类
- 装箱与拆箱
- 一个例子
泛型可以放任何类型的数据,但是只能存放一种数据
泛型的目的:制定当前的容器,需要什么类型的对象,让编译器去检查这个数据类型
泛型的举例
//这里的T是一个占位符,代表当前类是泛型类
class myArray <T>{public T[] arr = (T[])new Object[10];public T getPos(int pos) {return arr[pos];}public void setVal(int pos, T val) {this.arr[pos] = val;}
}public class test {public static void main(String[] args) {//往泛型里面放StringmyArray <String> myArray = new myArray<String>();//泛型就是将数据类型作为参数传进来,之后编译器就会去检查这个类型myArray.setVal(1, "hehe");String s = myArray.getPos(1);System.out.println(s);//往泛型里面放int类型myArray<Integer> myArray1=new myArray<Integer>();myArray1.setVal(2, 23);int a = myArray1.getPos(2);System.out.println(a);}
}
注意点
1、<包装类>就指定了数据类型,说明这个类里面只能放这个数据类型的数据,<>代表一个占位符,表示当前是一个泛型类
2、在new泛型的时候,第二个<>里面的类型可以不写,编译器会自己推导出来的
泛型的编译机制
泛型的编译原理就是:擦除机制
可以在 IDEA里面安装插件(jcalsslib Bytecode viewer)查看泛型的方法的字节码知道,首先要先build一下project来生成最新的 字节码文件
擦除机制 : 在编译过程中,将所有的T都替换成Object的机制
擦除机制是在编译时期的一种机制,在运行的时候,已经没有泛型这个概念了
//写一个泛型类,求出一个数组的最大值
//不要擦除成Object,由于不知道这个数组是什么类型的,所以要使用比较器,只要在T后面实现这个接口就行class Alg<T extends Comparable<T>>{ //T 实现了 Comparable接口public T findMxaVal(T[] array) { //返回值是T,这是一个泛型方法T maxVal = array[0];for (int i = 1; i < array.length; i++) {if (array[i].compareTo(maxVal) > 0) {maxVal = array[i];}}return maxVal;}}
public class TestDemo2 {public static void main(String[] args) {Alg<Integer> alg = new Alg<>();Integer[] array = {12, 34, 1};//这里是引用类型int val = alg.findMxaVal(array);System.out.println(val);}
}
通配符?既有上界又有下界,而泛型只有上界
基本数据类型和包装类
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
int 的包装类 是Integer
char 的包装类是 Character
其余的基本数据类型都是首字母大写
装箱与拆箱
装箱和拆箱也叫做装包 拆包
装箱是指 将基本数据 类型变成包装类
拆箱是指 将包装类变成 基本数据类型
//装箱与拆箱
public static void main(String[] args) {int a = 1;Integer A = a;//自动装箱---底层调用的还是Integer.valueOfInteger B = new Integer(a);//显式装箱Integer C = Integer.valueOf(a);//显式装箱System.out.println(A);System.out.println(B);//打印的结果都是1int b = A;//自动拆箱-A的数据类型是IntegerSystem.out.println(b);int c = A.intValue();//Integer-->intSystem.out.println(c);double d = A.doubleValue();//Integer-->doubleSystem.out.println(d);
}
一个例子
运行以下的代码:
public static void main(String[] args) {Integer a = 120;Integer b = 120;System.out.println(a == b);Integer c = 200;Integer d = 200;System.out.println(c == d);
}
//结果分别是true 和 false
为什么会发生上面的情况?
上面发生了自动装箱,而自动装箱底层调用的是Integer.valueOf
查看Integer.valueOf源码
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)//low 是-128 ,high是127return IntegerCache.cache[i + (-IntegerCache.low)];//所以数组的下标从0到255return new Integer(i);
}
//这段源码就是说,首先会对i进行判断,要是i是在-128 到 127 之间,就返回数组中的元素,否则就创建一个新的对象
所以,上面的c和d取值是200,超过了127,就会分别创建对象,两个的哈希值不一样,所以打印结果是false
泛型的基础 装箱拆箱相关推荐
- Java基础笔记 – 增强的for循环For each循环 自动装箱拆箱 可变参数
1.For each循环:1.1.语法:1.2.For each循环的使用:1.3.嵌套For each循环:1.4.三种循环遍历集合的列举:1.5.增强的for循环的缺点:2.自动装箱/拆箱(Aut ...
- CLR via C# 中关于装箱拆箱的摘录
装箱: 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(boxing)的机制.下面总结了对值类型的一个实例进行装箱操作时在内部发生的事情. 1.在托管堆中分配好内存.分配的内存量是值类型的各 ...
- Java自动装箱/拆箱 - Java那些事儿
昨天Java基本数据类型和引用类型一文中漏了几张图,已经补上,需要的自己回头去看,本系列文章首发于公众号:saysayJava. 在让人疑惑的Java代码 - Java那些事儿 一文中我们说到编译器自 ...
- .Net装箱拆箱编程实例
.Net装箱拆箱编程实例 一 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型. 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来. ...
- 反射、装箱拆箱、ArrayList与Array的区别 - 天生舞男 - 博客园
反射.装箱拆箱.ArrayList与Array的区别 Posted on 2005-09-11 23:11 天生舞男 阅读(125) 评论(0) 编辑 收藏 引用 网摘 所属分类: SPS 1 什么是 ...
- java 自动拆箱_Java中的自动装箱拆箱
Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 //自动装箱 2 Integer total = 90; ...
- 关于装箱拆箱为什么会影响效率
概念 示例 装箱 拆箱 结论 概念 装箱在值类型向引用类型转换时发生,在堆中分配. 拆箱在引用类型向值类型转换时发生. 示例 装箱 public void BoxIn(){object tempObj ...
- 为什么需要java包装类,装箱拆箱,基本类型与字符串之间的转换,java数据类型
为什么需要包装类? 首先,Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,将每个基本数据类型设计一个对应的类进行代表,这种方式增强了Java面向对象的性质. 其次,如果 ...
- C#装箱,拆箱和强制转换(转)
出处:https://www.cnblogs.com/fengjiulin110120/p/6605739.html 关系: 强制转换就包含有装箱拆箱操作,装箱就是把值类型转换成引用类型,反之就是拆箱 ...
最新文章
- folder ground 文件访问
- Java动态代理代码案例:使用jdk自带的Proxy只能对有接口的类进行动态代理
- mysql 交换工资_LeetCode:627.交换工资
- 再回首Java第二天
- JAVA 常用开发快捷键大全
- java怎么实现日程提醒_如何用java和xml实现日程提醒
- grafana的前端技术_Grafana开发环境搭建
- 大数据:技术与应用实践指南(中国工程院院士倪光南倾情作序,雷万云、毛新生、段永朝、安晖联合力荐)
- 解二元一次方程————拓展欧几里得算法
- 有别于普通专线的BGP线路
- Java8 处理日期和时间
- 罗振宇2021跨年演讲5:为什么你要建成自己的“黄鹤楼”?
- svn导出历史版本、指定版本
- 十分钟文档化你的C++代码——DoxyGen
- 抖音创意拍摄玩法让你轻松上热门,抖音分身特效教程。
- YUV420视频上面添加字幕
- 批量添加AD账号(一)
- easyrp-java_EasyPR-Java
- 人工智能伦理风险治理具有复杂性,尚未形成完善的理论架构和治理体系
- android更换导航背景,修改TabHost导航高度和背景颜色,tabhost背景颜色,主要是android使用...