Java学习笔记-12

1.什么时候用断言(assert)?
断言在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,断言用于保证程序最基本、关键的正确性。检查断言通常在开发和测试时开启。为了保证程序的执行效率,在软件发布后断言检查通常是关闭的。断言是一个包含布尔表达式的语句,在执行这个语句假定该表达式为true;如果表达式的值为false,那么系统会报告一个AssertionError。断言的使用如下面代码所示:
assert(a > 0);//throws an AssertionError if a <= 0
断言可以有两种形式:
assert Expression1;
assert Expression1:Expression2;
Expression1应该总是产生一个布尔值。
Expression2可以是得出一个值的任意表达式;这个值用于生成显示更多调试信息的字符串消息。

要在运行时启动断言,可以在启动JVM时使用-enableassertions或者-ea标记。要在运行时选择禁用断言,可以在启动JVM时使用-da或者-disableassertions标记。要在系统类中启动或禁用断言,可使用-esa或-dsa标记。还可以在包的基础上启用或者禁用断言。
注意:断言不应该以任何方式改变程序的状态。简单地说,如果希望在不满足某些条件时阻止代码的执行,就可以考虑用断言来阻止它。

2.Error和Exception有什么区别?
Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。
如果写了不能迅速收敛的递归,则很有可能引发栈溢出的错误,用递归写程序时一定要牢记两点:1.递归公式;2.收敛条件(什么时候就不在继续递归)

3.try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是在return后?
会执行,在方法返回调用者前执行。
注意:在finally中改变返回值的做法是不好的,因为如果存放在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值。显然,在finally中返回或者修改返回值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种龌龊的事,Java中也可以通过提升编译器的语法检查级别来产生警告或错误,Eclipse中可以在如图所示的地方进行设置,强烈建议将此项设置为编译错误。

4.Java语言如何进行一场处理,关键字:throws、throw、try、catch、finally、分别如何使用?
Java通过面向对象的方法进行一场处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws、finally。一般情况下是用try来执行一段程序,如果系统会抛出(throw)一个对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理;try用来指定一块预防所有的程序;catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;throw语句用来明确的抛出一个异常;throws用来声明一个方法可能抛出的各种异常(当然声明异常时允许无病呻吟);finally为确保一段代码不管发生什么异常状况都要被执行;try语句可以嵌套,每当遇到一个try语句,异常的结构就会被放入异常栈中,直到所有的try语句都完成。如果下一级的try语句没有对某种异常进行处理,异常栈就会执行出栈操作,知道遇到有处理这种异常的try语句或者最终将异常抛给JVM。

5.阐述final、finally、finalize的区别。

  • final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取。
  • finally:通常放在try……catch……的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
  • finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。

6.类ExampleA继承Exception,ExampleB继承ExampleA。
有如下代码片段:

try{
	throws new ExampleB("b");
}catch(ExampleA e){
	System.out.println("ExampleA");
}catch(Exception e){
	System.out.println("Exception");
}

请问执行此段代码的输出是什么?
答:输出:ExampleA。(根据里氏代换原则[能使用父类型的地方一定能使用子类],抓取ExampleA类型异常的catch块能够抓住try块中抛出的ExampleB类型的异常)

package com.test;

class Annoyance extends Exception{}
class Sneeze extends Annoyance{}

class ExceptionTest {

	public static void main(String[] args) 
		throws Exception {
		try{
			try{
				throw new Sneeze();
			}
			catch(Annoyance a){
				System.out.println("Caught Annoyance");
				throw a;
			}
		}
		catch(Sneeze s){
			System.out.println("Caught Sneeze");
			return;
		}finally{
			System.out.println("Hello World!");
		}
	}
}

7.List、Set、Map是否继承自Collection接口?
List、Set是,Map不是,Map是键值对映射容器,与 List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

8.阐述ArrayList、Vector、LinkedList的存储性能和特性。
ArrayList和Vector都是使用数组方式存储数据,此数组元素大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按照序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入元素只需要记录本项的前后项即可,所以插入速度较快。Vector属于遗留容器(Java早期的版本提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用,但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造其中创建新的对象来增强实现)。

9.Collection和Collections的区别?
Collection是一个借口,它是Set、List等容器的父接口;Collections是一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等。

10.List、Map、Set三个接口存取元素时,各有什么特点?
List以特定的索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素和元素的键(key)构成排序树从而达到排序和去重的效果。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值