没有合适的资源?快使用搜索试试~ 我知道了~
首页2018武汉Java中级面试精华:涵盖基础与新特性总结
2018武汉Java中级面试精华:涵盖基础与新特性总结
需积分: 9 10 下载量 88 浏览量
更新于2023-05-26
1
收藏 1.43MB DOCX 举报
在2018年的中级Java工程师面试总结中,面试者重点考察了应聘者的Java基础知识和近年来的关键技术趋势。面试内容涵盖了Java基础的深入理解,包括try-catch-finally语句块的执行顺序和返回值处理。Java语言的版本更新也是一项重要考察点,从JDK 1.5的自动拆装箱、泛型、可变参数等特性,到JDK 1.7的二进制字面量、字符串开关和泛型简化,再到JDK 1.8的接口默认方法、静态方法以及Lambda表达式和Optional类的使用。这些新特性展示了Java语言在演进中对于效率提升和编程范式的革新。 面试者还提及了Java平台I/O模型的三种主要实现方式:BIO(Blocking I/O,同步阻塞)、NIO(Non-blocking I/O,同步非阻塞)和AIO(Asynchronous I/O,异步非阻塞)。它们之间的区别在于并发处理能力、线程管理和性能优化。BIO适用于连接数稳定的小规模系统,而NIO通过多路复用器提高并发性,AIO则更进一步,将I/O操作的阻塞交给操作系统,提高了系统的响应速度。 此外,面试者可能还会考察应聘者对JDK 1.9新特性的理解,如接口方法私有化,这有助于代码封装和安全。在实际应用中,应聘者需要熟悉这些特性,并能根据实际场景选择合适的编程模型。 2018年的中级Java工程师面试不仅测试了应聘者的编程基础,还关注了他们对Java语言最新版本的理解和应用能力,以及在并发处理和I/O模型上的实践经验。对于求职者来说,熟悉并掌握这些知识点是提高面试成功率的关键。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10317576/bgb.jpg)
说明:首先调用无参构造函数,之后添加元素 5,之后再添加元素 6。具体的示意图如下:
说明:上图的表明了在执行每一条语句后,链表对应的状态。
2. addAll 函数
( 有两个重载函数,(, " :;<=型和 (., " :;
<=型,我们平时习惯调用的 (, " :;<=型会转化为 (.
, " :;<=型,所以我们着重分析此函数即可。
// 添加一个集合
public boolean addAll(int index, Collection<? extends E> c) {
// 检查插入的的位置是否合法 checkPositionIndex(index);
// 将集合转化为数组
Object[] a = c.toArray();
// 保存集合大小
int numNew = a.length;
if (numNew == 0) // 集合为空,直接返回
return false;
Node<E> pred, succ; // 前驱,后继
if (index == size) { // 如果插入位置为链表末尾,则后继为 null,前驱为尾结点
succ = null;
pred = last;
} else { // 插入位置为其他某个位置
succ = node(index); // 寻找到该结点
pred = succ.prev; // 保存该结点的前驱 }
![](https://csdnimg.cn/release/download_crawler_static/10317576/bgc.jpg)
for (Object o : a) { // 遍历数组
@SuppressWarnings("unchecked") E e = (E) o; // 向下转型
// 生成新结点
Node<E> newNode = new Node<>(pred, e, null);
if (pred == null) // 表示在第一个元素之前插入(索引为 0 的结点)
first = newNode;
else
pred.next = newNode;
pred = newNode;
}
if (succ == null) { // 表示在最后一个元素之后插入
last = pred;
} else {
pred.next = succ;
succ.prev = pred;
}
// 修改实际元素个数
size += numNew;
// 结构性修改加 1
modCount++;
return true;
}
说明:参数中的 表示在索引下标为 的结点(实际上是第 > 个结点)
的前面插入。在 ( 函数中,( 函数中还会调用到 函数,8 函数也会调用到
函数,此函数是根据索引下标找到该结点并返回,具体代码如下
Node<E> node(int index) {
// 判断插入的位置在链表前半段或者是后半段
if (index < (size >> 1)) { // 插入位置在前半段
Node<E> x = first;
for (int i = 0; i < index; i++) // 从头结点开始正向遍历
x = x.next;
return x; // 返回该结点
} else { // 插入位置在后半段
Node<E> x = last;
for (int i = size - 1; i > index; i--) // 从尾结点开始反向遍历
x = x.prev;
return x; // 返回该结点 }
}
说明:在根据索引查找结点时,会有一个小优化,结点在前半段则从头开始遍历,在后半
段则从尾开始遍历,这样就保证了只需要遍历最多一半结点就可以找到指定索引的结点。
![](https://csdnimg.cn/release/download_crawler_static/10317576/bgd.jpg)
下面通过示例来更深入了解调用 addAll 函数后的链表状态。
List<Integer> lists = new LinkedList<Integer>();
lists.add(5);
lists.addAll(0, Arrays.asList(2, 3, 4, 5));
上述代码内部的链表结构如下:
3. unlink 函数
在调用 remove 移除结点时,会调用到 unlink 函数,unlink 函数具体如下:
E unlink(Node<E> x) {
// 保存结点的元素
final E element = x.item;
// 保存 x 的后继
final Node<E> next = x.next;
// 保存 x 的前驱
final Node<E> prev = x.prev;
if (prev == null) { // 前驱为空,表示删除的结点为头结点
first = next; // 重新赋值头结点
} else { // 删除的结点不为头结点
prev.next = next; // 赋值前驱结点的后继
剩余63页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)