JAVA面试题(5)

1.try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally{}里的
代码会不会被执行,什么时候被执行,在 return 前还是后?
答: 会执行 try{}中的return执行后在没有返回数据时先去执行finally{}中的代码,然后再返回。所以说finally{}在return中间执行。
解释:在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。在转去之前,try中先把要返回的结果存放到不同于a的局部变量中去,执行完finally之后,在从中取出返回结果,因此,即使finally中对变量a进行了改变,但是不会影响返回结果。它应该使用栈保存返回值。
2.Java 语言如何进行异常处理,关键字:throws、throw、try、catch、finally 分别如何使用?
答:在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。
try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。
finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
throw – 用于抛出异常。
throws – 用在方法签名中,用于声明该方法可能抛出的异常。
try块中可以抛出异常
3.运行时异常与受检异常有何异同?
答:异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。
受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。
Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常。
异常和继承一样,是面向对象程序设计中经常被滥用的东西,在Effective Java中对异常的使用给出了以下指导原则:

  • 不要将异常处理用于正常的控制流(设计良好的API不应该强迫它的调用者为了正常的控制流而使用异常)
  • 对可以恢复的情况使用受检异常,对编程错误使用运行时异常
  • 避免不必要的使用受检异常(可以通过一些状态检测手段来避免异常的发生)
  • 优先使用标准的异常
  • 每个方法抛出的异常都要有文档
  • 保持异常的原子性
  • 不要在catch中忽略掉捕获到的异常
    4.列出一些你常见的运行时异常?
    答: - ArithmeticException(算术异常)
    - ClassCastException (类转换异常)
    - IllegalArgumentException (非法参数异常)
    - IndexOutOfBoundsException (下标越界异常)
    - NullPointerException (空指针异常)
    - SecurityException (安全异常)
    5.阐述 final、finally、finalize 的区别。
    答:- final:修饰符(关键字)有三种用法:如果一个类被声明为 final,意味着它不能再派生出
    新的子类,即不能被继承,因此它和 abstract 是反义词。将变量声明为 final,可以保证它们
    在使用中不被改变,被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能
    读取不可修改。被声明为 final 的方法也同样只能使用,不能在子类中被重写。
  • finally:通常放在 try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行
    还是发生异常,这里的代码只要 JVM 不关闭都能执行,可以将释放外部资源的代码写在
    finally 块中。
  • finalize:Object 类中定义的方法,Java 中允许使用 finalize()方法在垃圾收集器将对象从内存
    中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重
    写 finalize()方法可以整理系统资源或者执行其他清理工作。
    6.类 ExampleA 继承 Exception,类 ExampleB 继承 ExampleA。
    答:有如下代码片断:
    try {
    throw new ExampleB(“b”)
    } catch(ExampleA e){
    System.out.println(“ExampleA”);
    } catch(Exception e){
    System.out.println(“Exception”);
    }
    请问执行此段代码的输出是什么?
    答:输出:ExampleA。(根据里氏代换原则[能使用父类型的地方一定能使用子类型],抓取
    ExampleA 类型异常的 catch 块能够抓住 try 块中抛出的 ExampleB 类型的异常)
    7.List、Set、Map 是否继承自 Collection 接口?
    答:List,set继承于Collection
    Map没有继承于Collection 其相对是独立的 属于Collection类型的对象可以通过构造函数将一个集合构成另一个集合
    Set 和List 都继承了Conllection;Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。实际上Set就是Collection,只 是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素(至于如何判断元素相同则较为负责) Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
    Collection 和 Map 的区别:容器内每个为之所存储的元素个数不同
    Collection类型者,每个位置只有一个元素。
    Map类型者,持有 key-value pair,像个小型数据库。
    8.阐述 ArrayList、Vector、LinkedList 的存储性能和特性
    答:1、ArrayList和Vector是采用数组方式存储集合中的元素,元素之间内存地址是连续的,此数组元素数大于实际存储的数据,以便增加和插入新数据。
      2、ArrayList和Vector都允许直接序号索引元素,可以快速查找;但是插入和删除数据需要移动数据,所以效率低。
      3、Vector由于使用了synchronized方法(线程安全),所以性能比ArrayList差。
      4、LinkedList是使用链表结构保存集合中的元素,元素之间内存地址不连续。按序号索引数据需要进行向前或向后遍历,即需要进行寻执操作。LinkedList数据插入或删除不需要移动数据,具有较高的修改性能。
    9.Collection 和 Collections 的区别?
    答:1.Collection:
    是集合类的上层接口。本身是一个Interface,里面包含了一些集合的基本操作,Collection接口时Set接口和List接口的父接口
    2.Collections
    Collections是一个集合框架的帮助类,里面包含一些对集合的排序,搜索以及序列化的操作。
    最根本的是Collections是一个类,
    Collections 是一个包装类,Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素, 而另一些则不允许,一些 collection 是有序的,而另一些则是无序的.
    10.、List、Map、Set 三个接口存取元素时,各有什么特点?
    答:List与Set都是单列元素的集合,它们有一个功共同的父接口Collection。
    Set里面不允许有重复的元素,
    存元素:add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true;当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。
    取元素:没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。

List表示有先后顺序的集合,
存元素:多次调用add(Object)方法时,每次加入的对象按先来后到的顺序排序,也可以插队,即调用add(int index,Object)方法,就可以指定当前对象在集合中的存放位置。
取元素:方法1:Iterator接口取得所有,逐一遍历各个元素
方法2:调用get(index i)来明确说明取第几个。使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。

Map是双列的集合,存放用put方法:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。
取元素:用get(Object key)方法根据key获得相应的value。
也可以获得所有的key的集合,还可以获得所有的value的集合,
还可以获得key和value组合成的Map.Entry对象的集合。

List以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页