Java泛型高频面试题(含答案)_第1页
Java泛型高频面试题(含答案)_第2页
Java泛型高频面试题(含答案)_第3页
Java泛型高频面试题(含答案)_第4页
Java泛型高频面试题(含答案)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java泛型高频面试题(含答案)一、基础概念类(初级必问)1.什么是泛型?为什么要使用泛型?参考答案:泛型是JavaJDK5引入的参数化类型机制,允许在定义类、接口、方法时使用不确定的类型参数,在使用时再指定具体类型。核心作用有三点:1.编译期类型检查:将类型转换异常从运行期提前到编译期,避免类型转换异常;2.消除强制类型转换:代码更简洁,减少冗余代码;3.实现代码通用复用:一套代码适配多种数据类型,无需为不同类型重复定义方法和类。2.泛型的本质是什么?什么是类型擦除?参考答案:泛型的本质是编译期语法糖,仅在编译阶段生效。类型擦除是指:Java编译器在编译带有泛型的代码时,会擦除所有泛型类型参数,将泛型类型还原为原始类型(RawType),并在对应的位置插入强制类型转换代码。程序运行时,JVM不存在泛型类型信息。常见擦除规则:1.无边界泛型<T>擦除为Object;2.有上界泛型<TextendsNumber>擦除为上界类型Number;3.有下界泛型不会改变擦除后的原始类型。3.什么是原始类型(RawType)?开发中为什么不建议使用?参考答案:原始类型是指不带任何泛型参数的泛型类/接口,比如直接写List、Map,而非List<String>、Map<K,V>。不建议使用的原因:1.丢失泛型的类型校验能力,编译期无法检查类型,容易引发运行期类型转换异常;2.需要手动强制类型转换,代码冗余且存在风险;3.不符合代码规范,无法适配泛型的通用特性,可读性和可维护性差。二、通配符与边界类(中级高频)4.泛型通配符?、<?extendsT>、<?superT>的区别和使用场景?参考答案:1.无边界通配符?代表任意未知类型,只能读取数据(读取后为Object类型),无法写入除null外的任何数据。适用于只遍历、不修改的场景,比如打印集合所有元素。2.上界通配符<?extendsT>代表T及T的子类类型,只能读、不能写。因为无法确定具体子类类型,写入会引发类型安全问题。适用于获取数据的场景(生产者场景)。3.下界通配符<?superT>代表T及T的父类类型,可以写、读取只能转为Object。可以存入T及子类对象,保证写入类型安全。适用于存入数据的场景(消费者场景)。5.请解释PECS原则参考答案:PECS是泛型通配符的核心使用原则,全称ProducerExtends,ConsumerSuper。1.生产者(只读取数据):使用<?extendsT>,对外提供数据;2.消费者(只写入数据):使用<?superT>,接收外部数据;3.既读又写:不使用通配符,直接指定确定泛型类型<T>。举例:集合工具类Collections.copy方法,源集合用extends(读),目标集合用super(写),完全遵循PECS原则。6.List<Object>和List<?>、List<?extendsObject>有什么区别?参考答案:1.List<Object>:确定泛型类型,只能存储Object类型及任意对象,可读可写,类型完全确定;2.List<?>:无边界通配符,代表任意未知类型,只能读取数据,无法写入非null数据;3.List<?extendsObject>:效果和List<?>基本一致,所有类型都继承Object,同样只读不写;核心区别:List<Object>是确定类型,支持写入;另外两者是通配符未知类型,禁止写入,仅用于数据读取。三、泛型方法与泛型类(实操考点)7.泛型类和泛型方法的区别?静态方法为什么不能使用类上的泛型参数?参考答案:区别:1.泛型类:在类定义时声明泛型参数,整个类的非静态方法、成员变量均可使用该参数,类型在创建对象时确定;2.泛型方法:在方法返回值前单独声明泛型参数,仅当前方法生效,类型在方法调用时确定,优先级高于类泛型。静态方法不能使用类泛型的原因:类的泛型参数依赖于对象实例化时指定,而静态方法属于类、不属于对象,类加载时无需创建对象,此时泛型类型尚未确定,因此静态方法无法直接使用类定义的泛型参数。如需使用,必须定义静态泛型方法。8.如何定义一个通用的泛型工具方法?举例说明参考答案:泛型方法需要在返回值前声明<T>标识泛型类型,示例通用集合转数组方法:java

//通用泛型方法:返回集合中第一个元素

publicstatic<T>TgetFirstElement(List<T>list){

if(list==null||list.isEmpty()){

returnnull;

}

returnlist.get(0);

}关键点:必须声明独立的泛型标识<T>,方法类型与传入参数类型绑定,实现任意类型通用。四、核心难点与坑点(面试深挖)9.泛型为什么不支持继承转型?List<String>不是List<Object>的子类?参考答案:从继承关系来看,String是Object的子类,但List<String>不是List<Object>的子类,二者无继承关系。原因:为了保证泛型类型安全。如果允许List<String>向上转为List<Object>,就可以通过父类引用向集合存入Integer、Double等非字符串对象,破坏原有集合的类型约束,运行读取时必然报错类型转换异常。简单说:泛型参数不具备协变性,数组具备协变性(String[]是Object[]子类),这也是数组容易出现存储异常的原因。10.泛型数组为什么不能直接创建?newT[]为什么报错?参考答案:无法直接创建泛型数组(T[]),核心原因是类型擦除+数组类型校验机制冲突。1.编译后T会被擦除为Object或对应上界类型,运行时无法确定数组真实元素类型;2.Java数组在运行时会严格校验元素类型,若允许创建泛型数组,会导致类型校验失效,出现类型安全问题;解决方案:使用ArrayList<T>替代泛型数组,或通过Array.newInstance()反射创建泛型数组。11.解释泛型的协变、逆变、不变参考答案:以父子类Animal(父)、Cat(子)为例:1.不变(默认):List<Cat>、List<Animal>无任何继承关系,不能互相转换,普通泛型集合都是不变;2.协变(extends):List<?extendsAnimal>,支持子类型向父类型转换,只读,适合生产者;3.逆变(super):List<?superCat>,支持父类型向子类型转换,可写入,适合消费者。五、代码改错与实操题(笔试常考)12.找出以下代码的问题并修正java

publicclassGenericTest{

publicstaticvoidmain(String[]args){

List<String>strList=newArrayList<>();

List<Object>objList=strList;

objList.add(123);

System.out.println(strList.get(0));

}

}参考答案:问题:List<String>不能赋值给List<Object>,二者无继承关系,编译直接报错。若强行允许,会导致字符串集合存入数字,破坏类型安全。修正方案:如需兼容父子类型,使用协变通配符:java

List<?extendsObject>objList=strList;注:修改后objList无法写入数据,只能读取,保证类型安全。13.类型擦除会导致什么方法重写冲突?举例说明参考答案:类型擦除后会出现方法签名冲突,导致无法正常重写。示例冲突代码:java

classParent{

publicvoidshow(Objectobj){}

}

classChildextendsParent{

//编译报错:擦除后方法签名和父类完全一致

publicvoidshow(Stringstr){}

}原理:子类泛型方法擦除后签名与父类方法重复,Java不允许同一个类中存在两个完全相同的方法签名,引发重写冲突。六、框架源码延伸题(高阶面试)14.说说ArrayList、HashMap中泛型的作用,以及擦除后的源码变化参考答案:1.ArrayList<E>:底层数组编译后擦除为Object[],add、get方法的泛型参数全部擦除为Object,get方法返回时自动插入强制类型转换代码;2.HashMap<K,V>:键值对类型擦除为Object,底层Node节点的key、value均为Object类型,编译期通过泛型约束传入类型,运行时统一为Object;核心:所有集合框架的泛型,仅在编译期做类型校验,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论