面试相关的技术问题--泛型集合

本文意在整理泛型相关的面试问题,借助了网络上部分关于问题的解答过程,此处不做出处标记,仅供记录学习,以备遗忘!!!文中如果有讲述不妥或者错误的地方,希望阅者给我留言。

1.什么是泛型、为什么要使用以及泛型擦除?

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

那么为什么要使用呢?主要是为了安全考虑。通过泛型可以定义类型安全的数据结构(类型安全),而无须使用实际的数据类型(可扩展)。这能够显著提高性能并得到更高质量的代码(高性能),因为可以重用数据处理算法,而无须复制类型特定的代码(可重用)。

类型擦除:泛型在很大程度上是java语言中的成分而不是虚拟机中的结构,泛型类可以由编译器通过所谓的类型擦除过程而转变成非泛型类。这样,编译器就生成一种与泛型类同名的原始类,但是类型参数都被删除了。

类型擦除的一个重要的推论:所生成的代码与程序员在泛型之前所写的代码并没有太多的差异,而且事实上运行的也不快。其显著的优点在于,程序员不必把一些类型转换放到代码中,编译器将进行重要的类型检测。

2.Java中的集合类及关系图

关系图如下图所示:

3.HashMap和HashTable区别

a)继承不同

public class Hashtable extends Dictionary implements Map
public class HashMap  extends AbstractMap implements Map

b)线程同步不同

Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。

c)是否允许null值

Hashtable中,key和value都不允许出现null值。

在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。

d)遍历方式的内部实现不同

Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

e)hash值的使用不同

HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

f)初始大小和扩容的方式

HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。 

4.ArrayList和LinkedList区别及使用场景

LinkedeList和ArrayList都实现了List接口,但是它们的工作原理却不一样。它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向链接串列(doubly LinkedList)。

LinkedList和ArrayList的差别主要来自于Array和LinkedList数据结构的不同。

1) 因为Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。

2) 相对于ArrayList,LinkedList插入是更快的。因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。ArrayList在插入数据时还需要更新索引(除了插入数组的尾部)。

3) 类似于插入数据,删除数据时,LinkedList也优于ArrayList。

4) LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。

访问遍历多使用ArrayList

插入删除操作多使用LinkedList

5.Collection和Collections的区别

1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法

2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

6.ArrayList和vector区别

1)  Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。 
2) 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

原文地址:https://www.cnblogs.com/myadmin/p/5816916.html