Java面试题(八)—— 泛型

1、Java中的泛型是什么 ? 使用泛型的好处是什么?

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

好处:

       ①类型安全,提供编译期间的类型检测

       ②前后兼容

       ③泛化代码,代码可以更多的重复利用

       ④性能较高,用GJ(泛型JAVA)编写的代码可以为java编译器和虚拟机带来更多的类型信息,这些信息对java程序做进一步优化提供条件。

2、Java的泛型是如何工作的 ? 什么是类型擦除 ?如何工作?

①类型检查:在生成字节码之前提供类型检查

②类型擦除:所有类型参数都用他们的限定类型替换,包括类、变量和方法(类型擦除)

③如果类型擦除和多态性发生了冲突时,则在子类中生成桥方法解决

④如果调用泛型方法的返回类型被擦除,则在调用该方法时插入强制类型转换

类型擦除:

        所有类型参数都用他们的限定类型替换:比如T->Object   ? extends BaseClass->BaseClass

如何工作:泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。

3、你可以把List<String>传递给一个接受List<Object>参数的方法吗?

对任何一个不太熟悉泛型的人来说,这个Java泛型题目看起来令人疑惑,因为乍看起来String是一种Object,所以 List<String>应当可以用在需要List<Object>的地方,但是事实并非如此。真这样做的话会导致编译错误。如果你再深一步考虑,你会发现Java这样做是有意义的,因为List<Object>可以存储任何类型的对象包括String, Integer等等,而List<String>却只能用来存储Strings。

List<Object> objectList;

List<String> stringList;

objectList = stringList; //compilation error incompatible types

4、如何阻止Java中的类型未检查的警告?

如果你把泛型和原始类型混合起来使用,例如下列代码,java 5的javac编译器会产生类型未检查的警告,例如

List<String> rawList = newArrayList()

注意: Hello.java使用了未检查或称为不安全的操作;

这种警告可以使用@SuppressWarnings(“unchecked”)注解来屏蔽。

5、Java中List<Object>和原始类型List之间的区别?

原始类型和带参数类型<Object>之间的主要区别是,在编译时编译器不会对原始类型进行类型安全检查,却会对带参数的类型进行检查,通过使用Object作为类型,可以告知编译器该方法可以接受任何类型的对象,比如String或Integer。

这道题的考察点在于对泛型中原始类型的正确理解。它们之间的第二点区别是,你可以把任何带参数的类型传递给原始类型List,但却不能把List<String>传递给接受 List<Object>的方法,因为会产生编译错误。

6、编写一段泛型程序来实现LRU缓存?

LinkedHashMap可以用来实现固定大小的LRU缓存,当LRU缓存已经满了的时候,它会把最老的键值对移出缓存。

LinkedHashMap提供了一个称为removeEldestEntry()的方法,该方法会被put() 和putAll()调用来删除最老的键值对。当然,如果你已经编写了一个可运行的JUnit测试,你也可以随意编写你自己的实现代码。

7、Array中可以用泛型吗?

Array事实上并不支持泛型,这也是为什么Joshua Bloch在Effective Java一书中建议使用List来代替Array,因为List可以提供编译期的类型安全保证,而Array却不能。

8、如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?
 

public V put(K key, V value) {
       return cahe.put(key,value);
}

Java面试题(一)

Java面试题(二)

Java面试题(三)

Java面试题(四)

Java面试题(五)

Java面试题(六)

Java面试题(七)—— 线程

Java面试题(八)—— 泛型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值