1.Java 集合类框架的基本接口有哪些?
集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它 自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。
Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java 集合类里面 最基本的接口有:
Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的 Collection。
List:有顺序的 collection,并且可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复。
2.Java 中的 HashMap 的工作原理是什么?
Java 中的 HashMap 是以键值对(key--value)的形式存储元素的。HashMap 需要一个 hash 函数,它使用 hashCode()和 equals()方法来向集合/从集合添加和检索元素。当调用 put() 方 法的时候,HashMap 会计算 key 的 hash 值,然后把键值对存储在集合中合适的索引上。 如 果 key 已经存在了,value 会被更新成新值。HashMap 的一些重要的特性是它的容量 (capacity),负载因子(load factor)和扩容极限(threshold resizing)。
3.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用 Array 而不是 ArrayList?
Array 可以容纳基本类型和对象,而 ArrayList 只能容纳对象。
Array 是指定大小的,而 ArrayList 大小是固定的。
Array 没有提供 ArrayList 那么多功能,比如 addAll、removeAll 和 iterator 等。尽管 ArrayList 明显是更好的选择,但也有些时候 Array 比较好用。
(1)如果列表的大小已经指定,大部分情况下是存储和遍历它们。
(2)对于遍历基本数据类型,尽管 Collections 使用自动装箱来减轻编码任务,在指定大小 的基本类型的列表上工作也会变得很慢。
(3)如果你要使用多维数组,使用[][]比 List<List<>>更容易。
4、说出 ArrayList,Vector, LinkedList 的存储性能和特性
ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便 增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操 作,所以索引数据快而插入数据慢,Vector 由于使用了 synchronized 方法(线程安全),通常 性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向 或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
5、ArrayList 和 Vector 有何异同点?
ArrayList 和 Vector 相同点:
(1)两者都是基于索引的,内部由一个数组支持。
(2)两者维护插入的顺序,我们可以根据插入顺序来获取元素。
(3)ArrayList 和 Vector 的迭代器实现都是 fail-fast 的。
(4)ArrayList 和 Vector 两者允许 null 值,也可以使用索引值对元素进行随机访问。
ArrayList 和 Vector 的不同点:
(1)Vector 是同步的,而 ArrayList 不是。然而,如果你寻求在迭代的时候对列表进行改变, 你应该使用 CopyOnWriteArrayList。
(2)ArrayList 比 Vector 快,它因为有同步,不会过载。
(3)ArrayList 更加通用,因为我们可以使用 Collections 工具类轻易地获取同步列表和只读列表。
6、ArrayList 和 LinkedList 有何区别?
ArrayList 和 LinkedList 两者都实现了 List 接口,但是它们之间有些不同。
1)ArrayList 是由 Array 所支持的基于一个索引的数据结构,所以它提供对元素的随机访问, 复杂度为 O(1),但 LinkedList 存储一系列的节点数据,每个节点都与前一个和下一个节点相 连接。所以,尽管有使用索引获取元素的方法,内部实现是从起始点开始遍历,遍历到索引 的节点然后返回元素,时间复杂度为 O(n),比 ArrayList 要慢。
2)与 ArrayList 相比,在 LinkedList 中插入、添加和删除一个元素会更快,因为在一个元素被 插入到中间的时候,不会涉及改变数组的大小,或更新索引。
3)LinkedList 比 ArrayList 消耗更多的内存,因为 LinkedList 中的每个节点存储了前后节点的 引用。
7、HashMap 和 Hashtable 的区别
HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完成了 Map 接口
(1)HashMap 允许 key 和 value 为 null,而 HashTable 不允许。
(2)HashTable 是同步的,而 HashMap 不是。所以 HashMap 适合单线程环境,HashTable 适合多线程环境。
(3)在 Java1.4 中引入了 LinkedHashMap,HashMap 的一个子类,假如你想要遍历顺序,你 很容易从 HashMap 转向 LinkedHashMap,但是 HashTable 不是这样的,它的顺序是不可预知 的。
(4)HashMap 提供对 key 的 Set 进行遍历,因此它是 fail-fast 的,但 HashTable 提供对 key 的 Enumeration 进行遍历,它不支持 fail-fast。
(5)HashTable 被认为是个遗留的类,如果你寻求在迭代的时候修改 Map,你应该使用 CocurrentHashMap。
8、Iterator 和 ListIterator 的区别是什么?
Iterator 可用来遍历 Set 和 List 集合,但是 ListIterator 只能用来遍历 List。
Iterator 对集合只能是前向遍历,ListIterator 既可以前向也可以后向。
ListIterator 实现了 Iterator 接口,并包含其他的功能,比如:增加元素,替换元素,获取前 一个和后一个元素的索引,等等。