我在一次采访中被问到:
ArrayList的泛型实现与不使用泛型的旧实现之间有什么区别?
我知道它们在使用方式、优势和限制方面的差异,但我找不到实现的差异。
有点奇怪的问题;据推测,他们本质上是在询问ArrayList.java
的源文件在java 1.4中与在java 1.5中的"差异"。
唯一的区别是,<>
出现的所有不同位置,它们根本不在1.4版本中,和选择的几个位置中的类型已经从1.4中的Object
更改为1.5中的E
,但没有你想象的那么多(例如,后备阵列仍然是Object[]
,而不是E[]
,这是有意的(。get(int)
以前读public Object get(int index)
,现在读public E get(int index)
,add过去读public void add(Object item)
,现在读public void add(E item)
。
这似乎很深奥,也不是特别相关,但通常面试官不一定要问问题,因为他们在寻找具体的答案;他们经常问问题,只是想看看结果如何。
例如,如果我在面试某人,这让他们感到困惑,他们会非常慌乱,这是重要的信息(你很容易感到慌乱,不确定自己的技能水平(。
如果有人立即说出所有的变化,我也会很感兴趣,尽管不是这样(我想这是"正确的答案"(。
如果受访者在泛型、它在其他语言中的实现或向后兼容性的概念上偏离了切线,那也会很有趣。
我喜欢技术性的答案。我能想到的最令人印象深刻的答案是,如果有人深入研究为什么ArrayList仍然使用Object[]
而不是E[]
作为支持数组,尽管我特别询问了"差异"(因为这部分没有什么不同,但因为它是这样工作的,例如,get()
方法中有丑陋的类型转换:转换为类型var,这会引起编译器警告(。