泛型

计算机语言之java基础知识二

不想你离开。 提交于 2020-02-01 16:17:20
语法糖 问:Java 中语法糖原理、解语法糖? 答: 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法。语法糖的存在主要是方便开发人员使用。但其实,Java 虚拟机并不支持这些语法糖,这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。Java 中最常用的语法糖主要有泛型、变长参数、条件编译、自动拆装箱、内部类等。 语法糖:switch 支持 String 与枚举、泛型、自动装箱与拆箱、方法变长参数、枚举、内部类、条件编译、 断言、数值字面量、for-each、try-with- 问:resource、Lambda 表达式? 答:从 Java 7 开始,Java 语言中的语法糖在逐渐丰富,其中一个比较重要的就是 Java 7 中switch开始支持String。泛型需要在编译阶段通过类型擦除的方式进行解语法糖,虚拟机中没有泛型,只有普通类和普通方法,所有泛型类的类型参数在编译时都会被擦除,泛型类并没有自己独有的Class类对象。比如并不存在List<String>.class或是List<Integer>.class,而只有List.class。枚举类型不能被继承。内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念。 static 问:”static

Java—Collection,List,泛型,数据结构

落爺英雄遲暮 提交于 2020-02-01 06:14:53
Java—Collection,List,泛型,数据结构 1.集合概述 ArratList LinkList HashSet LinkedHashSet HashMap LinkedHashMap 以上集合类的基本功能都是一样的,存储和管理大量对象引用。 每个集合类采用的不同的数据结构存储元素,不同的数据结构直接导致对集合操作(增删改查)的性能不一样。 ArrayList内部采用的是数组存储元素,增删慢,查询快。 常见数据结构:数组,栈,队列,树,哈希表,链表…… Java 集合体系图: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1qIKVr0p-1577022526586)(d:\Users\Administrator\Desktop\,。.png)] Collection接口中的方法: 增: public boolean add ( E e ) ; //把给定的对象添加到当前集合中。 删: public boolean remover ( E e ) ; //把给定的对象在当前集合中删除 //删除时,使用的是equelse方法,比较内容,自创的引用类型需要重写equelse方法。 //只删除匹配的第一个 public void clear ( ) ; //清空集合 改: [ 无 ] 查 : public boolean contains (

Java----泛型

元气小坏坏 提交于 2020-02-01 03:11:25
##泛型 1、泛型定义及好处 Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常. 泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型 /*创建集合,使用泛型* 好处:1、避免了类型转换的麻烦,存储什么类型,取出什么类型* 2、把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错)** 弊端:泛型是什么类型,就只能存储什么类型的数据** */泛型好处与坏处代码示例: package Collection.FanXing.demo01; import java.util.ArrayList; import java.util.Iterator; public class Demo01Generic { public static void main(String[] args) { demo02(); } /*创建集合,使用泛型 * 好处:1、避免了类型转换的麻烦,存储什么类型,取出什么类型 * 2、把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错) * * 弊端:泛型是什么类型,就只能存储什么类型的数据 * * */ private static void demo02() { ArrayList<String> list = new

JAVA 系列——>泛型

时间秒杀一切 提交于 2020-02-01 02:24:39
在前面学习集合时,我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升 成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200112143324393.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Mzk3NjUz,size_16,color_FFFFFF,t_70) 程序在运行时发生了问题java.lang.ClassCastException。 为什么会发生类型转换异常呢? 我们来分析下:由于 集合中什么类型的元素都可以存储。导致取出时强转引发运行时 ClassCastException。 怎么来解决这个问题呢? Collection虽然可以存储各种对象,但实际上通常Collection只存储同一类型对象。例如都是存储字符串对象。因此 在JDK5之后,新增了泛型(Generic)语法,让你在设计API时可以指定类或方法支持泛型,这样我们使用API的时候 也变得更为简洁,并得到了编译时期的语法检查。 **泛型:**可以在类或方法中预支地使用未知的类型。

泛型动态循环队列的实现——Java

岁酱吖の 提交于 2020-01-31 11:39:41
队列的基本功能 public interface Queue < E > { void enqueue ( E e ) ; //元素入队 E dequeue ( ) ; //元素出队 E getFront ( ) ; //查看队头 int getSize ( ) ; //存储了多少数据 boolean isEmpty ( ) ; } 如何实现 使用数组存储数据,front存储队头元素的下标,tail存储队尾元素下一个元素的下标,元素入队,tial前移,元素出队,front前移。 front=tail时队列为空,front在tail前一格时队列满。(浪费了tail所指的空间,目的是更容易区分空和满两种情况,这样:队列容量=数组长度-1)。 代码 public class ArrayQueue < E > implements Queue < E > { private E [ ] data ; private int front , tail ; //指向队首元素 private int size ; //指向队尾元素下一个位置,即下一个元素的位置 public ArrayQueue ( int capacity ) { //*泛型类构造函数类名后不加<> data = ( E [ ] ) new Object [ capacity + 1 ] ; //数组长度比容量大1 front

泛型动态栈的实现——Java

安稳与你 提交于 2020-01-31 05:34:33
栈的功能 将栈的基本功能定义在接口中,使栈类实现接口即可。 public interface Stack < E > { int getSize ( ) ; //存储了多少数据 boolean isEmpty ( ) ; void push ( E e ) ; //顶部放入元素 E pop ( ) ; //取出并返回顶部元素 E peek ( ) ; //返回顶部元素 } 栈的实现 在动态泛型数组Array类基础上实现。 Array类: /* 动态泛型数组 支持所有类元素的存储 */ public class Array < E > { //数组中使用类型E 泛型 private int size ; private E [ ] datas ; //构造函数,capacity初始容量,默认为2 public Array ( int capacity ) { //datas=new E[capacity];//E类型不能直接new datas = ( E [ ] ) new Object [ capacity ] ; //java中E[]不能直接new,由Object转化转化为E[]子类 } public Array ( ) { datas = ( E [ ] ) new Object [ 2 ] ; } //查看数据数量 public int getSize ( ) {

泛型的深入研究——面试时说出能加分

亡梦爱人 提交于 2020-01-31 04:05:06
我们可以在定义集合时设置泛型这样的约束,也可以在定义类和方法时加上泛型,这样能提升类和方法的灵活性。此外我们还可以在定义泛型时加上继承和通配符。在平时的培训中,我曾发现初学者对一些复杂的泛型(其实也不复杂,只不过是较少用)感到困惑。这里就通过一些案例展示泛型在项目里的常见用法。 1 泛型可以作用在类和接口上 泛型作用在类上的案例,比如在项目里,我们需要定义一个仓库类(WareHouse),会用一个列表来表示仓库里存放的东西。在定义仓库类时,我们可以通过泛型来指定列表里能容纳的数据类型。请看如下的GenericClass. java 例子。 1 //省略import集合包的代码 2 //请注意在定义类时,直接加上了泛型T 3 class WareHouse<T>{ 4 private List<T> productList;//请注意这里的泛型是T,和第3行一致 5 public List<T> getProductList() 6 {return productList; } 7 public void setProductList(List<T> productList) 8 {this.productList = productList;} 9 //构造函数 10 public WareHouse() 11 {productList = new ArrayList<T>();}

scala快速入门系列【泛型】

北战南征 提交于 2020-01-31 02:12:37
本篇作为scala快速入门系列的第三十五篇博客,为大家带来的是关于 泛型 的内容。 文章目录 泛型 定义一个泛型方法 泛型类 上下界 上界 下界 协变、逆变、非变 非变 协变 逆变 泛型 scala和Java一样,类和特质、方法都可以支持泛型。我们在学习集合的时候,一般都会涉及到泛型。 那如何自己定义泛型呢? 定义一个泛型方法 在scala中,使用方括号来定义类型参数。 语法 示例 用一个方法来获取任意类型数组的中间的元素 – 不考虑泛型直接实现(基于Array[Int]实现) – 加入泛型支持 参考代码 不考虑泛型的实现 加入泛型支持 泛型类 scala的类也可以定义泛型。接下来,我们来学习如何定义scala的泛型类。 语法 定义一个泛型类,直接在类名后面加上方括号,指定要使用的泛型参数 指定类对应的泛型参数后,就使用这些类型参数来定义变量了 示例 实现一个Pair泛型类 Pair类包含两个字段,而且两个字段的类型不固定 创建不同类型泛型类对象,并打印 上下界 需求: 我们在定义方法/类的泛型时,限定必须从哪个类继承、或者必须是哪个类的父类。此时,就需要使用到 上下界 。 上界 使用 <: 类型名表示给类型添加一个上界,表示泛型参数必须要从该类(或本身)继承。 语法 示例 定义一个Person类 定义一个Student类,继承Person类 定义一个demo泛型方法

HashMap--comparableClassFor方法及Type体系

独自空忆成欢 提交于 2020-01-30 23:43:12
https://www.jianshu.com/p/7649f86614d3 https://www.jianshu.com/p/e8eeff12c306 HashMap在存储树化过程中,通过比较key的hash值来决定作为左子树还是右子树。hash值大于当前节点的hash值时作为当前节点的右节点;小于时作为左节点;相等时看key是否实现了Comparable接口,决定能够基于compareTo 比较,如果仍未比较出大小,就需要进行仲裁了,仲裁方法为 tieBreakOrder。 看该元素键是否实现了Comparable接口,用到了comparableClassFor方法来获取该元素键的Class。 static Class<?> comparableClassFor(Object x) { // 先判断是否是Comparable类型的 if (x instanceof Comparable) { Class<?> c; Type[] ts, as; Type t; ParameterizedType p; // 对String类型特判,如果是String类型直接返回该对象的Class类 // 所以大多数人都建议在使用HashMap时key使用String类型 if ((c = x.getClass()) == String.class) // bypass checks

泛型的深入研究——面试时说出能加分

孤人 提交于 2020-01-30 09:47:44
我们可以在定义集合时设置泛型这样的约束,也可以在定义类和方法时加上泛型,这样能提升类和方法的灵活性。此外我们还可以在定义泛型时加上继承和通配符。在平时的培训中,我曾发现初学者对一些复杂的泛型(其实也不复杂,只不过是较少用)感到困惑。这里就通过一些案例展示泛型在项目里的常见用法。 1 泛型可以作用在类和接口上 泛型作用在类上的案例,比如在项目里,我们需要定义一个仓库类(WareHouse),会用一个列表来表示仓库里存放的东西。在定义仓库类时,我们可以通过泛型来指定列表里能容纳的数据类型。请看如下的GenericClass.java例子。 1 //省略import集合包的代码 2 //请注意在定义类时,直接加上了泛型T 3 class WareHouse<T>{ 4 private List<T> productList;//请注意这里的泛型是T,和第3行一致 5 public List<T> getProductList() 6 {return productList; } 7 public void setProductList(List<T> productList) 8 {this.productList = productList;} 9 //构造函数 10 public WareHouse() 11 {productList = new ArrayList<T>();}