Java 泛型概念相关面试题

问:Java 的泛型是什么?有什么好处和优点?JDK 不同版本的泛型有什么区别?

答:泛型是 Java SE 1.5 的新特性,泛型的本质是参数化类型,这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。在 Java SE 1.5 之前没有泛型的情况的下只能通过对类型 Object 的引用来实现参数的任意化,其带来的缺点是要做显式强制类型转换,而这种强制转换编译期是不做检查的,容易把问题留到运行时,所以 泛型的好处是在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率,避免在运行时出现 ClassCastException。

JDK 1.5 引入了泛型来允许强类型在编译时进行类型检查;JDK 1.7 泛型实例化类型具备了自动推断能力,譬如 List<String> list = new ArrayList<String>(); 可以写成 List<String> llist = new ArrayList<>(); 了,JDK 具备自动推断能力。下面几种写法可以说是不同版本的兼容性了:

//JDK 1.5 推荐使用的写法

List<String> list =new ArrayList<String>();

//JDK 1.7 推荐使用的写法

List<String> llist =new ArrayList<>();

//可以使用,但不推荐,是为了兼容老版本,IDE 会提示警告,可以通过注解屏蔽警告

List<String> list =new ArrayList();

//可以使用,但不推荐,是为了兼容老版本,IDE 会提示警告,可以通过注解屏蔽警告

List list =new ArrayList<String>();

问:Java 泛型是如何工作的?什么是类型擦除?

答:泛型是通过类型擦除来实现的,编译器在编译时擦除了所有泛型类型相关的信息,所以在运行时不存在任何泛型类型相关的信息,譬如 List<Integer> 在运行时仅用一个 List 来表示,这样做的目的是为了和 Java 1.5 之前版本进行兼容。泛型擦除具体来说就是在编译成字节码时首先进行类型检查,接着进行类型擦除(即所有类型参数都用他们的限定类型替换,包括类、变量和方法),接着如果类型擦除和多态性发生冲突时就在子类中生成桥方法解决,接着如果调用泛型方法的返回类型被擦除则在调用该方法时插入强制类型转换。

问:Java 泛型类、泛型接口、泛型方法有什么区别?

答:泛型类是在实例化类的对象时才能确定的类型,其定义譬如 class Test<T> {},在实例化该类时必须指明泛型 T 的具体类型。

泛型接口与泛型类一样,其定义譬如 interface Generator<E> { E dunc(E e); }。

泛型方法所在的类可以是泛型类也可以是非泛型类,是否拥有泛型方法与所在的类无关,所以在我们应用中应该尽可能使用泛型方法,不要放大作用空间,尤其是在 static 方法时 static 方法无法访问泛型类的类型参数,所以更应该使用泛型的 static 方法(声明泛型一定要写在 static 后返回值类型前)。泛型方法的定义譬如 <T> void func(T val) {}。

问:Java 如何优雅的实现元组?

答:元组其实是关系数据库中的一个学术名词,一条记录就是一个元组,一个表就是一个关系,纪录组成表,元组生成关系,这就是关系数据库的核心理念。很多语言天生支持元组,譬如 Python 等,在语法本身支持元组的语言中元组是用括号表示的,如 (int, bool, string) 就是一个三元组类型,不过在 Java、C 等语言中就比较坑爹,语言语法本身不具备这个特性,所以在 Java 中我们如果想优雅实现元组就可以借助泛型类实现,如下是一个三元组类型的实现:

Triplet<A,B,C>{

private A a;

private B a;

private C a;

public Triplet(A a,B b,C c){

this.a =a;

this.b =b;

this.c =c;

}

}

欢迎加入学习交流群569772982,大家一起学习交流。
时间: 2024-08-01 09:16:45

Java 泛型概念相关面试题的相关文章

面试题_关于Java泛型的面试题

1. Java中的泛型是什么 ? 使用泛型的好处是什么? 这是在各种Java泛型面试中,一开场你就会被问到的问题中的一个,主要集中在初级和中级面试中.那些拥有Java1.4或更早版本的开发背景的人 都知道,在集合中存储对象并在使用前进行类型转换是多么的不方便.泛型防止了那种情况的发生.它提供了编译期的类型安全,确保你只能把正确类型的对象放入 集合中,避免了在运行时出现ClassCastException. 2. Java的泛型是如何工作的 ? 什么是类型擦除 ? 这是一道更好的泛型面试题.泛型是

java泛型常见面试题

背景:泛型这个知识点平时用的不多,但是在面试的时候很容就被问到,所以还是要准备一些基础的知识储备. 面试旧敌之 Java 泛型 :主要概念及特点 “泛型” 意味着编写的代码可以被不同类型的对象所重用. 泛型是在JDK1.5之后出现的. 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数. 可以看到,使用 Object 来实现通用.不同类型的处理,有这么两个缺点: 每次使用时都需要强制转换成想要的类型 在编译时编译器并不知道类型转换是否正常,运行时才知道,不安全 根据<Java 编程

2.java泛型基础

Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JDK 5中的新集合类框架中.对于泛型概念的引入,开发社区的观点是褒贬不一.从好的方面来说,泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误,因为编译器可以在编译时刻就发现很多明显的错误.而从不好的地方来说,为了保证与旧有版本的兼容性,Java泛型的实现上存在着一些不够优雅的地

赢在面试之Java泛型篇(十二)

139. Java中的泛型是什么 ? 使用泛型的好处是什么? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数. 好处: 1.类型安全,提供编译期间的类型检测 2.前后兼容 3.泛化代码,代码可以更多的重复利用 4.性能较高,用GJ(泛型JAVA)编写的代码可以为java编译器和虚拟机带来更多的类型信息,这些信息对java程序做进一步优化提供条件. 140,Java的泛型是如何工作的 ? 什么是类型擦除 ?如何工作? 1.类型检查:在生成字节

JAVA 泛型意淫之旅(一)

泛型基础 自定义泛型 自定义泛型类型 类型变量的限制 自定义泛型方法 后续介绍 JAVA 泛型意淫之旅(二) JAVA 泛型意淫之旅(三) 泛型基础 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时的类型安全检测机制.该机制允许程序员在强类型程序设计语言中编写代码时,使用一些以后才指定的类型,在实例化时作为参数指明这些类型. 下面看一个简单的例子,如果我们需要创建一个只包含字符串的集合,没有泛型,我们会这样做 ArrayList strList = new

第11讲-Java泛型和文件操作

1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1.泛型 1.2.2.文件操作 2.具体内容 2.1.Java泛型 2.1.1.为什么需要泛型 我们发现在List中,底层是Object[ ]数组,那么也就是说,List可以存储任意对象类型.但是在实际开发中,我们一般一个List只存储一种类型,所以LIst就无法保证数据类型的约束. 第二点,我们存储的假如是String,那么我们希望取出来的数据类型也是String,没有泛型的时候,无论存什么,取出来的数据类型都是Object.我们希望存什

Java泛型中的PECS原则

今天在写代码的时候使用到了这样一个方法签名: public void foo(Map<String, String> map); 在写这个参数的时候正好在想一些关于泛型的东西,于是: public void foo(Map<? extends String, ? extends String> map); 这两种写法有什么区别呢?记得以前和同学讨论过这个问题,但后来没有记下来,渐渐又淡忘了.今天又去翻了好多资料,总算找到一些可以参考的,赶紧记在这里方便以后温故知新啦.好了,言归正传

Java泛型的协变

在上篇<Java泛型的基本使用>这篇文章中遗留下面问题,即将子类型也能加入到父类型的泛型中.要实现这样的功能必须借助于协变. 实验准备 如今在上篇文章展示的Decorator类型的基础上,添加一些代码,如代码清单1所看到的. 代码清单1 /** * * 描 述:Exp2使用br/> * 作 者:jiaan.gja<br/> * 历 史: (版本号) 作者 时间 凝视 <br/> * @param itemList */ public void doDecorate

2017.4.5 Java 泛型

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数. 假定我们有这样一个需求:写一个排序方法,能够对整形数组.字符串数组甚至其他任何类型的数组进行排序,该如何实现? 答案是可以使用 Java 泛型. 使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序.然后,调用该泛型方法来对整型数组.浮点数数组.字符串数组等进行排