泛型简单介绍

文章目录

  • 泛型简单介绍
    • 泛型的举例
      • 注意点
    • 泛型的编译机制
    • 基本数据类型和包装类
    • 装箱与拆箱
      • 一个例子

泛型可以放任何类型的数据,但是只能存放一种数据

泛型的目的:制定当前的容器,需要什么类型的对象,让编译器去检查这个数据类型

泛型的举例

//这里的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

泛型的基础 装箱拆箱相关推荐

  1. Java基础笔记 – 增强的for循环For each循环 自动装箱拆箱 可变参数

    1.For each循环:1.1.语法:1.2.For each循环的使用:1.3.嵌套For each循环:1.4.三种循环遍历集合的列举:1.5.增强的for循环的缺点:2.自动装箱/拆箱(Aut ...

  2. CLR via C# 中关于装箱拆箱的摘录

     装箱: 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(boxing)的机制.下面总结了对值类型的一个实例进行装箱操作时在内部发生的事情. 1.在托管堆中分配好内存.分配的内存量是值类型的各 ...

  3. Java自动装箱/拆箱 - Java那些事儿

    昨天Java基本数据类型和引用类型一文中漏了几张图,已经补上,需要的自己回头去看,本系列文章首发于公众号:saysayJava. 在让人疑惑的Java代码 - Java那些事儿 一文中我们说到编译器自 ...

  4. .Net装箱拆箱编程实例

    .Net装箱拆箱编程实例 一 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型. 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来. ...

  5. 反射、装箱拆箱、ArrayList与Array的区别 - 天生舞男 - 博客园

    反射.装箱拆箱.ArrayList与Array的区别 Posted on 2005-09-11 23:11 天生舞男 阅读(125) 评论(0) 编辑 收藏 引用 网摘 所属分类: SPS 1 什么是 ...

  6. java 自动拆箱_Java中的自动装箱拆箱

    Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 //自动装箱 2 Integer total = 90; ...

  7. 关于装箱拆箱为什么会影响效率

    概念 示例 装箱 拆箱 结论 概念 装箱在值类型向引用类型转换时发生,在堆中分配. 拆箱在引用类型向值类型转换时发生. 示例 装箱 public void BoxIn(){object tempObj ...

  8. 为什么需要java包装类,装箱拆箱,基本类型与字符串之间的转换,java数据类型

    为什么需要包装类? 首先,Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,将每个基本数据类型设计一个对应的类进行代表,这种方式增强了Java面向对象的性质. 其次,如果 ...

  9. C#装箱,拆箱和强制转换(转)

    出处:https://www.cnblogs.com/fengjiulin110120/p/6605739.html 关系: 强制转换就包含有装箱拆箱操作,装箱就是把值类型转换成引用类型,反之就是拆箱 ...

最新文章

  1. folder ground 文件访问
  2. Java动态代理代码案例:使用jdk自带的Proxy只能对有接口的类进行动态代理
  3. mysql 交换工资_LeetCode:627.交换工资
  4. 再回首Java第二天
  5. JAVA 常用开发快捷键大全
  6. java怎么实现日程提醒_如何用java和xml实现日程提醒
  7. grafana的前端技术_Grafana开发环境搭建
  8. 大数据:技术与应用实践指南(中国工程院院士倪光南倾情作序,雷万云、毛新生、段永朝、安晖联合力荐)
  9. 解二元一次方程————拓展欧几里得算法
  10. 有别于普通专线的BGP线路
  11. Java8 处理日期和时间
  12. 罗振宇2021跨年演讲5:为什么你要建成自己的“黄鹤楼”?
  13. svn导出历史版本、指定版本
  14. 十分钟文档化你的C++代码——DoxyGen
  15. 抖音创意拍摄玩法让你轻松上热门,抖音分身特效教程。
  16. YUV420视频上面添加字幕
  17. 批量添加AD账号(一)
  18. easyrp-java_EasyPR-Java
  19. 人工智能伦理风险治理具有复杂性,尚未形成完善的理论架构和治理体系
  20. android更换导航背景,修改TabHost导航高度和背景颜色,tabhost背景颜色,主要是android使用...

热门文章

  1. HDU 2544 最短路(最短路入门)
  2. 最短路 (Dijstra) 最短路
  3. maven 的使用
  4. python 创建线程
  5. Python学习笔记(八)—切片(slicing)
  6. Linux内核源码下载方式
  7. 数学建模【微分方程模型(介绍、分析方法、数值模拟、传染病问题的建模和分析、经济增长模型、人口增长预测和控制模型)】
  8. HttpClient 设置cookie的问题
  9. JAVA中关于日志的介绍
  10. js对大数据量的处理