Question
1.关于try catch final 执行顺序问题:
* java面试题20--如果catch里面有return语句,finally里面的代码还会执行吗?
*/
public class FinallyDemo2 {
public static void main(String[] args) {
System.out.println(getInt());
}
public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
a = 20;
} catch (ArithmeticException e) {
a = 30;
return a;
/*
* return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
* 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
* 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
*/
} finally {
a = 40;
}
// return a;
}
- try catch final
/*
* java面试题20--如果catch里面有return语句,finally里面的代码还会执行吗?
*/
public class FinallyDemo2 {
public static void main(String[] args) {
System.out.println(getInt());
}
public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
a = 20;
} catch (ArithmeticException e) {
a = 30;
return a;
/*
* return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
* 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
* 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
*/
} finally {
a = 40;
return a; //如果这样,就又重新形成了一条返回路径,由于只能通过1个return返回,所以这里直接返回40
}
// return a;
}
结论
1).try 中如果发生异常,catch 会捕获,如果在如果在catch中return 一个值,虚拟机会记录这个值或者这个值的引用,如果在finally 中对这个值修改,引用会影响到返回值,但是int 这种的就不会了.因为会把return 放到最后执行,并且返回的是之前记录的值,而不是代码中看到的值
2).另外,如果在try 中发生异常,没有catch 语句,只有finally 语句,并且在finally 中return 一个返回值,相当于这次的异常被虚拟机抛弃,因为函数仍然形成了闭环,导致对于上层来说,相当于函数依然正常执行.
-
关于十进制和十六进制的加法规则
不难看出,debug 显示十进制数值, 会把非十进制数值转换成十进制在进行计算
非静态内部类的初始化方式
public class A{
class B{
}
}
A a = new A();
A.B b = a.new B();
非静态内部类属于对象,用过对象实例化
- & 和 && 的区别
&和&&都是可以作为逻辑运算符的,其逻辑运算规则是相同的。
但&作为逻辑运算符时,即使第一个操作符是false,那么它仍然会计算第二个操作符。&&短路与,如果第一个操作符为false,那么它不会再去计算第二个操作符。
6.散列表hashmap散列冲突解决办法
开放寻指法
当散列冲突之后 插入到 冲突位置下一个数组位置中 如果依然冲突依次往后找
在查找的时候同样需要从hash运算出的位置依次向后找 直到遍历到找到的元素,或者空元素停止
值得注意的是 删除过程中我们不能简单的做一个删除 否则会让查找算法失效,解决办法是删除的时候 我们标记为delete 这样查找的时候,遍历到delete,就跳过继续查找直到空或者找到相等元素
但是这种方式在冲突很多的,情况下 时间复杂度会退回到o(n)
第二种则是我们hashmap中常见的,把冲的的元素在冲突位置生成链表或者红黑树