之前只知道写代码,不知道看书,现在快毕业要找实习了,面试之后才知道自己的基础是多么的不扎实。于是又回到了书本,可是在看书的时候有些观点比较模糊,百度加实践,于是我就提出了自己的想法。下面的内容有些只是小问题,但有些是原则问题。无论是大问题还是小问题,都把它记录下来,看看自己能找到多少。
大问题
书名:《Java程序员面试指南》张昆等编著 电子工业出版社
169页,第七章:异常处理及内存管理
面试题4:下面选项是关于捕获异常的语法try-catch-finally的描述,请选择正确的答案:
A.try可以单独使用
B.try-catch必须配对使用
C.try-finally可以配对使用
D.catch-finally可以配对使用
E.在try-catch后如果定义了finally,则finally肯定会执行
参考答案:CE
我认为:C是对的,E是错的。要想finally的到执行,其相应的try块得到执行只是其中一个前提条件,还有一个前提条件就是jvm没有退出。
实践代码:
public class FinallyTest {
public static void main(String[] args) {
test();
}
private static void test() {
try {
System.out.println("aaa");
System.exit(0);
} finally {
System.out.println("bbb");
}
}
}
运行结果为:aaa
那难道说使用了System.exit(0),这里的finally就作废了,那写需要被关闭的物理资源怎么办?当System.exit(0)被调用时,jvm退出前要执行一些清理工作,其中一个就是执行系统中注册的所有关闭钩子。那么我们可以为系统注册一个关闭的钩子:
public class ExitHook {
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println("在这里关闭物理资源");
}
});
System.exit(0);
}
}
回到上面的问题,你可能会说System.exit(0)很少用,可以不用这样考虑。没有关系,我也只是想说明上面的E选项说的太绝对了一点。
书名《突破程序员基本功的16课》作者李刚,人民邮电出版社
115页。
package com.test2;
public class Stack {
// 存放栈内元素的数组
private Object[] elementData;
// 记录栈内元素的个数
private int size = 0;
private int capacityIncrement;
// 以指定初始化容量创建一个Stack
public Stack(int initialCapacity) {
elementData = new Object[initialCapacity];
}
public Stack(int initialCapacity, int capacityIncrement) {
this(initialCapacity);
this.capacityIncrement = capacityIncrement;
}
// 向“栈”顶压入一个元素
public void push(Object object) {
ensureCapacity();
elementData[size++] = object;
}
public Object pop() {
if (size == 0) {
throw new RuntimeException("空栈异常");
}
return elementData[--size];
}
public int size() {
return size;
}
// 保证底层数组能容纳栈内所有元素
private void ensureCapacity() {
// 增加堆栈的容量
if (elementData.length == size) {
Object[] oldElement = elementData;
int newLength = 0;
// 已经设置capacityIncrement
if (capacityIncrement > 0)
newLength = elementData.length + capacityIncrement;
else
// 将长度扩充到原来的1.5倍
newLength = (int) (elementData.length * 1.5);
elementData = new Object[newLength];
// 将原来数组的元素复制到新数组中
System.arraycopy(oldElement, 0, elementData, 0, size);
}
}
public static void main(String[] args) {
Stack stack = new Stack(10);
// 向栈顶压入10个元素
for (int i = 0; i < 10; i++) {
stack.push("元素" + i);
}
// 依次弹出10个元素
for (int i = 0; i < 10; i++) {
System.out.println(stack.pop());
}
}
}
书上说这里的pop函数会有内存泄漏,是对的。但是我觉得还有一个地方也是有明显的内存泄漏的。就是ensureCapacity()函数中。
小问题(这部分可能会是鸡蛋里挑骨头,有书的人可以看看,我也就是写着玩的)
书名《突破程序员基本功的16课》作者李刚,人民邮电出版社
104页,图4.1,根据前面的程序,n3怎么会只想第二个Node对象呢?应该打印错了。