Java 泛型高频面试题及详细实战答案_第1页
Java 泛型高频面试题及详细实战答案_第2页
Java 泛型高频面试题及详细实战答案_第3页
Java 泛型高频面试题及详细实战答案_第4页
Java 泛型高频面试题及详细实战答案_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

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

文档简介

Java泛型高频面试题及详细实战答案一、基础认知类(初级必问)1.什么是Java泛型?为什么要引入泛型?答案:泛型是JavaJDK5引入的参数化类型机制,简单说就是把数据类型作为参数传递,让类、方法、接口可以适配任意数据类型,同时固定编译期类型约束。引入泛型的核心目的有三个:1.避免强制类型转换:未使用泛型时,集合存储元素默认是Object类型,取值必须强转,代码冗余且繁琐;2.编译期类型校验:所有类型错误会在编译阶段暴露,而不是运行时报ClassCastException,提升代码安全性;3.代码复用:一套代码可以适配多种数据类型,不用为不同类型重复编写冗余方法和类。实战对比:PlainText

//无泛型,需要强转,存在类型风险

Listlist=newArrayList();

list.add("test");

Integernum=(Integer)list.get(0);//运行时报错

//有泛型,编译校验,无需强转

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

list.add("test");

Stringstr=list.get(0);//直接取值2.泛型的本质是什么?泛型是在编译期生效还是运行期?答案:泛型的核心本质是编译期类型擦除。泛型只在编译阶段生效,Java编译器会在编译时校验泛型类型合法性,校验通过后,会将所有泛型标识(T、E、?等)全部擦除,还原为原始类型(RawType),运行期JVM中不存在泛型信息。简单理解:编译时打假类型约束,运行时回归原始Object类型。举例:List<String>和List<Integer>编译后,Class文件中都是List类型,运行期获取的Class对象完全相同。3.什么是原始类型(RawType)?开发中为什么不建议使用?答案:原始类型就是不带任何泛型参数的泛型类/接口,比如直接写List、Map,而不是List<String>、Map<K,V>。不建议使用的原因:1.丢失泛型的类型校验能力,回归Object存储,容易出现类型转换异常;2.代码可读性极差,无法直观判断集合存储的元素类型;3.编译器会给出unchecked未检查警告,不符合代码规范。二、核心语法类(中级高频)4.泛型类、泛型方法、泛型接口的区别?各自使用场景?答案:1.泛型类定义在类名上的泛型,整个类全局生效,类中所有方法、成员变量都可以使用该泛型类型。场景:工具类、通用封装类,适配全局统一的未知类型。PlainText

publicclassResult<T>{

privateTdata;//全局通用泛型

}2.泛型方法定义在方法上的泛型,仅当前方法生效,优先级高于类泛型,可独立于类泛型存在。场景:工具类中通用静态方法、单个方法需要独立适配类型,不想影响整个类。PlainText

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

returnlist.get(0);

}3.泛型接口定义在接口上的泛型,实现类可指定具体类型、或延续泛型。场景:通用回调接口、通用数据处理接口(如JDK的List、Comparator)。5.泛型通配符?是什么?和T有什么区别?答案:?是无界通配符,代表任意未知类型;T是类型参数,代表一个确定的、可复用的类型。核心区别:1.T需要在方法/类上显式声明(<T>),?无需声明,直接使用;2.T是确定类型,可以复用、赋值、定义变量;?是未知类型,无法复用;3.用法场景不同:T用于定义泛型(声明类型),?用于使用泛型(限制类型)。通俗举例:<T>相当于定义“本次方法统一用类型T”,全程固定;?相当于“随便什么类型都行,但我不知道具体类型”。6.上界通配符<?extendsT>和下界通配符<?superT>的区别?答案:这两个是受限通配符,用于限制泛型的类型范围,解决泛型无法多态的问题。1.上界通配符<?extendsT>含义:只能是T类型或T的子类特点:只读不写。可以读取元素(向上转型为T),无法添加任何元素(编译器无法确定具体子类类型,为了安全禁止写入)。场景:只读取数据的场景,如遍历、查询数据。2.下界通配符<?superT>含义:只能是T类型或T的父类特点:只写少读。可以写入T及子类元素(向下兼容),读取数据只能当做Object类型。场景:写入、填充数据的场景。记忆口诀:extends只读,super只写7.什么是PECS原则?实际开发怎么用?答案:PECS是泛型通配符的核心使用原则,来自《EffectiveJava》:ProducerExtends,ConsumerSuper1.生产者(只输出数据、读取数据):使用<?extendsT>2.消费者(只接收数据、写入数据):使用<?superT>3.既读又写:不使用通配符,直接使用确定泛型<T>实战场景:集合工具类Collections的copy方法,就是典型的PECS应用:PlainText

//源集合读取数据(生产者):extends

//目标集合写入数据(消费者):super

publicstatic<T>voidcopy(List<?superT>dest,List<?extendsT>src)三、难点坑点类(中高级面试高频)8.泛型为什么不支持协变?和数组的协变有什么区别?答案:数组是协变的:String[]是Object[]的子类,可以直接向上转型。泛型是不协变的:List<String>不是List<Object>的子类,无法直接赋值。数组协变的坑(为什么泛型禁止协变):PlainText

//数组协变,编译通过,运行报错

Object[]arr=newString[1];

arr[0]=123;//ArrayStoreException,运行期才报错数组协变存在安全隐患,类型错误只能运行期发现。而泛型为了保证编译期类型安全,直接禁止协变,从根源杜绝此类问题。如果需要实现协变效果,只能通过<?extendsObject>通配符实现。9.泛型类型擦除会带来哪些问题?答案:类型擦除是泛型的底层原理,但也带来了4个经典问题,面试高频:1.无法获取泛型的真实类型运行期泛型信息被擦除,无法通过反射直接获取T的具体类型,这也是为什么普通泛型无法newT()的原因。2.泛型数组无法直接创建不能直接newT[]、newList<String>[],只能通过反射创建或使用通配符数组。3.方法签名擦除冲突编译后泛型被擦除,会导致两个方法签名一致,编译报错:PlainText

//擦除后都是test(List),冲突

publicvoidtest(List<String>list){}

publicvoidtest(List<Integer>list){}4.静态方法无法使用类泛型类泛型是实例化时确定的,静态方法属于类,优先于对象加载,无法获取类的泛型参数。10.为什么不能用基本类型作为泛型参数?比如List<int>?答案:核心原因:泛型擦除后会统一转为Object类型,而基本类型不继承Object。Java中基本类型(int、long、boolean等)是独立类型,没有父类,无法向上转型为Object。因此泛型只能使用引用类型,必须使用对应的包装类:List<Integer>、List<Long>。补充:JDK自动装箱拆箱只是语法糖,底层泛型存储的依然是包装类对象。11.什么是泛型嵌套?List<List<String>>和List<List<?>>有什么区别?答案:1.List<List<String>>:外层集合的元素必须是精准的String类型集合,类型严格固定,只能存入List<String>。2.List<List<?>>:外层集合的元素可以是任意类型的集合,可以存入List<String>、List<Integer>等,兼容性更强,但无法写入内层集合数据。四、进阶实战面试题12.如何解决运行期无法获取泛型类型的问题?答案:普通泛型会被擦除,但子类继承父类泛型时,会保留泛型信息(泛型固化),可以通过反射获取,这也是Spring、Mybatis通用Mapper的底层原理。核心实现方式:通过子类继承带泛型的父类,获取Type类型:PlainText

//父类泛型

publicclassBaseDao<T>{}

//子类固化泛型,保留类型信息

publicclassUserDaoextendsBaseDao<User>{

//可通过反射获取T为User类型

}13.泛型方法的类型推断机制是什么?答案:Java编译器会根据方法入参、返回值接收类型自动推断泛型T的具体类型,无需手动指定。JDK7之后的菱形语法、泛型方法大多依靠类型推断。当入参和返回值类型冲突时,编译器会推断为公共父类类型,推断失败则编译报错。14.说说泛型在实际框架中的应用答案:1.集合框架:List

温馨提示

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

评论

0/150

提交评论