> Download: 迈向高级的 Java 面试解围课
===============================================================
1、java 容器都有哪些?
罕用容器的图录:
]
2. Collection 和 Collections 有什么区别?
java.util.Collection 是一个汇合接口(汇合类的一个顶级接口)。它提供了对汇合对象进行基本操作的通用接口办法。Collection 接口在 Java 类库中有很多具体的实现。Collection 接口的意义是为各种具体的汇合提供了最大化的对立操作形式,其间接继承接口有 List 与 Set。
Collections 则是汇合类的一个工具类 / 帮忙类,其中提供了一系列静态方法,用于对汇合中元素进行排序、搜寻以及线程平安等各种操作。
- List、Set、Map 之间的区别是什么?
- HashMap 和 Hashtable 有什么区别?
hashMap 去掉了 HashTable 的 contains 办法,然而加上了 containsValue()和 containsKey()办法。
hashTable 同步的,而 HashMap 是非同步的,效率上逼 hashTable 要高。
hashMap 容许空键值,而 hashTable 不容许。
- 如何决定应用 HashMap 还是 TreeMap?
对于在 Map 中插入、删除和定位元素这类操作,HashMap 是最好的抉择。然而,如果你须要对一个有序的 key 汇合进行遍历,TreeMap 是更好的抉择。基于你的 collection 的大小,兴许向 HashMap 中增加元素会更快,将 map 换为 TreeMap 进行有序 key 的遍历。
- 说一下 HashMap 的实现原理?
HashMap 概述:HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的映射操作,并容许应用 null 值和 null 键。此类不保障映射的程序,特地是它不保障该程序恒久不变。
HashMap 的数据结构:在 java 编程语言中,最根本的构造就是两种,一个是数组,另外一个是模仿指针(援用),所有的数据结构都能够用这两个根本构造来结构的,HashMap 也不例外。HashMap 实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
当咱们往 Hashmap 中 put 元素时, 首先依据 key 的 hashcode 从新计算 hash 值, 杜绝 hash 值得到这个元素在数组中的地位 (下标), 如果该数组在该地位上曾经寄存了其余元素, 那么在这个地位上的元素将以链表的模式寄存, 新退出的放在链头, 最先退出的放入链尾. 如果数组中该地位没有元素, 就间接将该元素放到数组的该地位上。
须要留神 Jdk 1.8 中对 HashMap 的实现做了优化, 当链表中的节点数据超过八个之后, 该链表会转为红黑树来进步查问效率, 从原来的 O(n) 到 O(logn)
- 说一下 HashSet 的实现原理?
HashSet 底层由 HashMap 实现
HashSet 的值寄存于 HashMap 的 key 上
HashMap 的 value 对立为 PRESENT
- ArrayList 和 LinkedList 的区别是什么?
最显著的区别是 ArrrayList 底层的数据结构是数组,反对随机拜访,而 LinkedList 的底层数据结构是双向循环链表,不反对随机拜访。应用下标拜访一个元素,ArrayList 的工夫复杂度是 O(1),而 LinkedList 是 O(n)。
- 如何实现数组和 List 之间的转换?
List 转换成为数组:调用 ArrayList 的 toArray 办法。
数组转换成为 List:调用 Arrays 的 asList 办法。
- ArrayList 和 Vector 的区别是什么?
Vector 是同步的,而 ArrayList 不是。然而,如果你寻求在迭代的时候对列表进行扭转,你应该应用 CopyOnWriteArrayList。
ArrayList 比 Vector 快,它因为有同步,不会过载。
ArrayList 更加通用,因为咱们能够应用 Collections 工具类轻易地获取同步列表和只读列表。
- Array 和 ArrayList 有何区别?
Array 能够包容根本类型和对象,而 ArrayList 只能包容对象。
Array 是指定大小的,而 ArrayList 大小是固定的。
Array 没有提供 ArrayList 那么多功能,比方 addAll、removeAll 和 iterator 等。
- 在 Queue 中 poll() 和 remove() 有什么区别?
poll() 和 remove() 都是从队列中取出一个元素,然而 poll() 在获取元素失败的时候会返回空,然而 remove() 失败的时候会抛出异样。
- 哪些汇合类是线程平安的?
vector:就比 arraylist 多了个同步化机制(线程平安),因为效率较低,当初曾经不太倡议应用。在 web 利用中,特地是前台页面,往往效率(页面响应速度)是优先思考的。
statck:堆栈类,先进后出。
hashtable:就比 hashmap 多了个线程平安。
enumeration:枚举,相当于迭代器。
- 迭代器 Iterator 是什么?
迭代器是一种设计模式,它是一个对象,它能够遍历并抉择序列中的对象,而开发人员不须要理解该序列的底层构造。迭代器通常被称为“轻量级”对象,因为创立它的代价小。
- Iterator 怎么应用?有什么特点?
Java 中的 Iterator 性能比较简单,并且只能单向挪动:
(1) 应用办法 iterator() 要求容器返回一个 Iterator。第一次调用 Iterator 的 next() 办法时,它返回序列的第一个元素。留神:iterator() 办法是 java.lang.Iterable 接口, 被 Collection 继承。
(2) 应用 next() 取得序列中的下一个元素。
(3) 应用 hasNext() 查看序列中是否还有元素。
(4) 应用 remove() 将迭代器新返回的元素删除。
Iterator 是 Java 迭代器最简略的实现,为 List 设计的 ListIterator 具备更多的性能,它能够从两个方向遍历 List,也能够从 List 中插入和删除元素。
- Iterator 和 ListIterator 有什么区别?
Iterator 可用来遍历 Set 和 List 汇合,然而 ListIterator 只能用来遍历 List。
Iterator 对汇合只能是前向遍历,ListIterator 既能够前向也能够后向。
ListIterator 实现了 Iterator 接口,并蕴含其余的性能,比方:减少元素,替换元素,获取前一个和后一个元素的索引,等等。