31、java异常分类
java异常分类如图所示:
Error:
Error类是指java运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全终止。
Exception(RuntimeException和CheckedException)
RuntimeException:比如NullPointerException和ClassCastException,它是那些可能在java虚拟机正常运行期间抛出的异常的超类。如果出现这样的异常,一定是程序员的错误。
CheckedException:检查异常,一般是外部错误,这种异常都发生在编译阶段,java程序会强制编译器去捕获此类异常,也就是会出现要求你把这段可能出现异常的程序进行try-catch,该类异常一般包括以下几个方面:
- 试图在文件结尾处读取数据
- 试图打开一个错误格式的URL
- 试图根据给定格式的字符串查找class对象,而这个字符串表示的类并不存在
32、Throw和Throws的区别
33、java反射
概念:运行时动态的获取类的信息和操作类的方法和属性。
获取Class对象方法:class.getClass()、class.forName()
java反射的功能:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
34、序列化
序列化可以将对象的状态写在流里进行网络传输、或者保存到文件、数据库等系统里。
注意:
(1)如果一个类能被序列化,那么它的子类也可以被序列化;
(2)被static修饰的属性和transient修饰的属性不会被序列化;
(3)对象的类名、属性会被序列化,但方法不会被序列化。
35、 Comparable接口和Comparator接口
36、LinkedHashMap与HashMap的区别
- LinkedHashMap 是HashMap 的子类
- LinkedHashMap 中的Entry 增加了两个指针before 和after,它们分别用于维护
双向链接列表。 - 在put 操作上,虽然LinkedHashMap 完全继承了HashMap 的put 操作,但是在细
节上还是做了一定的调整,比如,在LinkedHashMap 中向哈希表中插入新Entry的同时,还会通过Entry 的addBefore 方法将其链入到双向链表中。 - 在扩容操作上,虽然LinkedHashMap 完全继承了HashMap 的resize 操作,但是
鉴于性能和LinkedHashMap 自身特点的考量,LinkedHashMap 对其中的重哈希过
程(transfer 方法)进行了重写 - 在读取操作上,LinkedHashMap 中重写了HashMap 中的get 方法,通过HashMap
中的getEntry 方法获取Entry 对象。在此基础上,进一步获取指定键对应的值。
37、Enumeration 接口和Iterator 接口的区别有哪些?
Enumeration 速度是Iterator 的2 倍,同时占用更少的内存。但是,Iterator 远远比Enumeration 安全,因为其他线程不能够修改正在被iterator 遍历的集合里面的对象。同时,Iterator 允许调用者删除底层集合里面的元素,这对Enumeration 来说是不可能的。
38、&与&&的区别
(1)&和&&都可以用作逻辑与运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
(2)&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。
(3)&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作。
39、 try{}后面有finally语句块执行问题
try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?
eg:
public class Test
{
publicstatic void main(String[] args)
{
System.out.println(new Test().test());;
}
staticint test()
{
int x = 1;
try
{
return x;
}
finally
{
System.out.println("finally块执行:" + ++x);
}
}
}
程序输出:
finally块执行:2
1
看到上面程序中finally块已经执行了,而且程序执行finally块时已经把x变量增加到2了。但test()方法返回的依然是1,这就是由return语句执行流程决定的,Java会把return语句先执行完、把所有需要处理的东西都先处理完成,需要返回的值也都准备好之后,但是还未返回之前,程序流程会转去执行finally块,但此时finally块中的对x变量的修改已经不会影响return要返回的值了。
0000000000000000000000000000000000000000000000
如果finally块里也包含return语句,那就另当别论了,因为finally块里的return语句也会导致方法返回。
public class Test
{
public static void main(String[] args)
{
System.out.println(new Test().test());;
}
staticint test()
{
int x = 1;
try
{
return x++;
}
finally
{
System.out.println("finally块执行:" + ++x);
return x;
}
}
}
程序在执行returnx++;时,程序会把return语句执行完成,只是等待返回,此时x的值已经是2了,但程序此处准备的返回值依然是1。接下来程序流程转去执行finally块,此时程序会再次对x自加,于是x变成了3,而且由于finally块中也有return x;语句,因此程序将会直接由这条语句返回了,因此上面test()方法将会返回3。
40、java8新特性有哪些
(1)访问接口default关键字
在java里面,我们通常都是认为接口里面是只能有抽象方法,不能有任何方法的实现的,那么在jdk1.8里面打破了这个规定,引入了新的关键字default,通过使用default修饰方法,可以让我们在接口里面定义具体的方法实现。[主要是为了定义默认的方法]
(2)Lambda 表达式
格式: (parameters参数) -> expression表达式或方法体
带有参数变量的表达式,是一段可以传递的代码,可以被一次或多次执行
(3)函数式接口
(4)方法与构造函数引用
jdk1.8提供了另外一种调用方式::,当你需要使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面,即ClassName::methodName 。例如Apple::getWeight就是引用了Apple类中定义的方法getWeight。
(5)Date Api更新
(6)流
定义:流是Java API的新成员,它允许我们以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。就现在来说,我们可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,也就是说我们不用写多线程代码了。