字节面试被问到了Java泛型原理,我是这么回答的...
Posted CRUD速写大师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节面试被问到了Java泛型原理,我是这么回答的...相关的知识,希望对你有一定的参考价值。
文章目录
泛型原理
在没有泛型的时代,如果我们可能会写出如下代码
public class Main {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(1);
list.add("Code");
System.out.println(list);
}
}
这段代码编译运行都可以,但是这段代码的问题也很明显,ArrayList可以接收任何类型的数据,而且获取值时需要进行强制类型转换。
为了确保这些编译出来的Class文件可以在引入泛型之后可以继续运行,那么Java泛型引入了 类型擦除的概念。
如下面这段代码
编译前
public class Main {
public static void main(String[] args) {
ArrayList<Integer> integers = new ArrayList<>();
ArrayList<String> list = new ArrayList<>();
integers.add(1);
list.add("2");
System.out.println(list.get(0));
HashMap<String, String> map = new HashMap<>();
map.put("hello","world");
System.out.println(map.get("hello"));
}
}
编译后
public class Main {
public Main() {
}
public static void main(String[] var0) {
ArrayList var1 = new ArrayList();
ArrayList var2 = new ArrayList();
var1.add(1);
var2.add("2");
System.out.println((String)var2.get(0));
HashMap var3 = new HashMap();
var3.put("hello", "world");
System.out.println((String)var3.get("hello"));
}
}
对比
- ArrayList<Integer> ——> ArrayList
- ArrayList<String> ——> ArrayList
- HashMap<String,String> ——> HashMap
编译后 <>没有了,或者说他们都变成了 “裸类型(Raw type)” ,裸类型可以被视为所有类型泛型化实例的共同父类型。这其实就是 类型擦除
而且,因为类型都变为了裸类型,所以 只有在元素访问时,加入了从 Object类型到 String类型的强制类型转换. 因为
怎么回答?
Java泛型原理其实是使用到了【类型擦除】这个方法,比如说我们平常使用到的 ArrayList或者HashMap,在使用的时候,都会去为其定义类型,那么在类型擦除这个机制下,Java代码编译后这些类型都消失了,或者说变成了 “裸类型”,这个裸类型可以理解为所有类型泛型化实例的共同父类型,使用这样的机制还有一个重要的目的就是为了让 Java5之前编译出来的Class文件在引入泛型后可以继续使用。
泛型相关面试题
为什么引入泛型?使用泛型的好处有哪些?
因为在没有泛型的时代,我们使用的List 容器没有指定存储数据类型,这种情况下,可以向 List 添加任意类型数据,编译器不会做类型检查,而是默默的将所有数据都转为 Object。
假设,最初我们希望向 List 存储的是整型数据,但是不小心存入了其他类型的数据,所以当需要从容器中取整型数据时,由于 List 当成 Object 类型来存储,不得不使用类型强制转换。在运行时,因为List 中数据类型不一致的,可能为程序运行带来一些风险。
好处
- 提供了编译期的类型安全,确保你只能把正确类型的对象放入集合中
- 避免了类型转换
List<? extends T>和List <? super T>之间有什么区别 ?
答:List<? extends T>可以接受任何继承自T的类型的List,而List<? super T>可以接受任何T的父类构成的List。
除了类型擦除就没别的方法了吗?
当然不是,我们还可以保持已有不变,在平行增加一套泛型机制,就比如 HashTable 和 HashMap,或者 Vector 和 ArrayList。
最后
我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!
创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以一键三连哦!,感谢支持,我们下次再见~~~
分享大纲
更多精彩内容分享,请点击 Hello World (●’◡’●)
以上是关于字节面试被问到了Java泛型原理,我是这么回答的...的主要内容,如果未能解决你的问题,请参考以下文章
面试阿里,字节跳动99%会被问到的java线程和线程池,看完这篇你就懂了!