记录书上我认为的不足之处(持续更新)

之前只知道写代码,不知道看书,现在快毕业要找实习了,面试之后才知道自己的基础是多么的不扎实。于是又回到了书本,可是在看书的时候有些观点比较模糊,百度加实践,于是我就提出了自己的想法。下面的内容有些只是小问题,但有些是原则问题。无论是大问题还是小问题,都把它记录下来,看看自己能找到多少。

大问题

书名:《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对象呢?应该打印错了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值