Java面试中的通用面试问题在相当长的时间内在Java 5周围越来越普遍,许多应用程序都转移到Java 5上,并且几乎所有新的Java开发都发生在Tiger(Java 5的代号)上。 泛型和Java 5功能(例如Enum)的重要性,Collection实用程序在Java面试中越来越受欢迎。 如果您不熟悉有界和无界的通配符 , 泛型如何在内部工作 ,类型擦除以及是否熟悉用Java编写参数化的泛型类和方法,那么泛型采访问题会变得非常棘手。 准备进行仿制药面试的最佳方法是,针对仿制药的各种功能尝试最佳的简单程序。 无论如何,在这篇Java访谈文章中,我们将看到一些流行的访谈问题,以及有关Java中泛型的答案。
1. Java中的泛型是什么? 使用泛型有什么优势?
这是在任何Java访谈中都针对泛型提出的首批访谈问题之一,主要是初学者和中级。 那些来自Java 5之前的背景的人知道,将对象存储在Collection中然后在使用它之前将其转换回正确的Type是多么不便。 泛型阻止了这些。 它提供了编译时的类型安全性,并确保仅在集合中插入正确的Type,并在运行时避免ClassCastException。
2.泛型如何在Java中工作? 什么是类型擦除?
这是泛型中较好的面试问题之一。 泛型使用Type Erase实现,编译器在编译时擦除所有与类型相关的信息,并且在运行时不提供与类型相关的信息。 例如List <String>在运行时仅由List表示。 这样做是为了确保与Java 5之前开发的库具有二进制兼容性。您在运行时无权访问Type参数,并且编译器在运行时将泛型转换为Raw类型 。 根据您的回答,您可以根据该通用面试问题得到很多后续问题,例如, 为什么使用类型擦除来实现泛型或提供一些无效的泛型代码而导致编译器错误。 阅读我的文章泛型如何在Java中工作以获取更多详细信息
3.泛型中有界和无界通配符是什么?
这是泛型上另一个非常流行的Java面试问题 。 有界通配符是对Type施加约束的通配符。 有两种有界通配符<? 扩展T>,通过确保类型必须是T和<?的子类来施加上限。 超级T>,其中通过确保类型必须施加的下限必须是T的超类。此泛型类型必须在边界内用Type实例化,否则将导致编译错误。 另一方面,<?>表示和无界类型,因为<?>可以用任何类型替换。 有关我在Generics中有界和无界通配符之间的差异之处,请参见我的更多信息。
4. List <有 什么区别 ? 扩展T> 和 List <? 超级T> ?
这与以前的仿制药面试问题有关,有一段时间而不是询问什么是有界和无界通配符,访调员会提出此问题以评估您对仿制药的理解。 两个List声明都是有界通配符的示例,List <? 扩展T>将接受任何类型为扩展T的列表,而列表<? super T>将接受任何类型为T的超类的List。例如List <? 扩展Number>可以接受List <Integer>或List <Float>。 在上面的链接中查看更多信息。
5.如何编写一个接受泛型参数并返回泛型的泛型方法?
编写通用方法并不困难,而不是使用原始类型,您需要使用通用类型,例如T,E或K,V,它们是Type,Element和Key,Value的占位符。 查看Java Collection框架以获取泛型方法的示例。 最简单的通用方法如下所示:
public V put(K key, V value) {return cache.put(key, value);
}
6.如何使用泛型用Java写参数化类?
这是以前的Java泛型采访问题的扩展。 而不是要求编写泛型方法,Interviewer可能会要求使用泛型编写类型安全的类 。 再次,关键是要使用原始类型而不是使用原始类型,而必须始终使用JDK中使用的标准占位符。
7.编写程序以使用泛型实现LRU缓存。
这是喜欢Java编码的任何人的练习。 一个提示是,可以使用LinkedHashMap实现固定大小的LRU缓存,当缓存已满时,需要删除最旧的条目。 LinkedHashMap提供了一个称为removeEldestEntry()的方法,该方法由put()和putAll()调用,可用于指示删除最旧的条目。 只要您具有书面的工作版本以及单元测试,就可以自由提出自己的实现。
8.是否可以将 List <String> 传递给接受List <Object>的方法
Java中的这个通用面试问题可能会使任何对Generics不太熟悉的人感到困惑,因为乍一看,它看起来像String是对象,因此可以在需要List <Object>的地方使用List <String>,但这不是事实。 这将导致编译错误。 如果您更进一步,这确实是有道理的,因为List <Object>可以存储任何东西,包括String,Integer等,但是List <String>只能存储String。
List<Object> objectList;
List<String> stringList;objectList = stringList; //compilation error incompatible types
9.我们可以在数组中使用泛型吗?
如果您知道Array不支持Generics的事实,这可能是Java中最简单的泛型访谈问题,这就是为什么Joshua bloach建议使用List而不是Array的原因,因为List可以提供比Array更可靠的编译时类型安全性 。
10.如何抑制Java中未经检查的警告?
如果使用合并原始类型和泛型类型,则Java 5的Javac编译器会生成未经检查的警告,例如
List<String> rawList = new ArrayList()Note: Hello.java uses unchecked or unsafe operations.;
可以通过使用@SuppressWarnings(“ unchecked”)注释来取消显示。
这些是Java中常见的泛型面试问题和答案 。 这些通用面试问题都不是强硬的,而是基于通用的基础知识。 任何对泛型有相当了解的Java程序员都必须熟悉Java中的这些泛型问题。 如果您在任何面试中都提出了其他很好的通用问题,或者您正在寻找Java中任何通用面试问题的答案,那么请在评论部分中发布。
参考:我们的JCG合作伙伴 Javin Paul在Javarevisited博客上针对程序员和开发人员的Java泛型的10个访谈问题 。
翻译自: https://www.javacodegeeks.com/2012/07/java-generics-interview-questions.html