JAVA 小知识点记录 (一)

2020-02-01  本文已影响0人  fushuang

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;
    }


  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; //如果这样,就又重新形成了一条返回路径,由于只能通过1个return返回,所以这里直接返回40
        }
 
//      return a;
    }

结论

1).try 中如果发生异常,catch 会捕获,如果在如果在catch中return 一个值,虚拟机会记录这个值或者这个值的引用,如果在finally 中对这个值修改,引用会影响到返回值,但是int 这种的就不会了.因为会把return 放到最后执行,并且返回的是之前记录的值,而不是代码中看到的值
2).另外,如果在try 中发生异常,没有catch 语句,只有finally 语句,并且在finally 中return 一个返回值,相当于这次的异常被虚拟机抛弃,因为函数仍然形成了闭环,导致对于上层来说,相当于函数依然正常执行.

  1. 关于十进制和十六进制的加法规则


    image.png

    不难看出,debug 显示十进制数值, 会把非十进制数值转换成十进制在进行计算

  2. 非静态内部类的初始化方式

    public class A{
         class B{
        }
    }
    A a = new A();
    A.B b = a.new B();
非静态内部类属于对象,用过对象实例化

  1. & 和 && 的区别
    &和&&都是可以作为逻辑运算符的,其逻辑运算规则是相同的。
    但&作为逻辑运算符时,即使第一个操作符是false,那么它仍然会计算第二个操作符。&&短路与,如果第一个操作符为false,那么它不会再去计算第二个操作符。
    6.散列表hashmap散列冲突解决办法
    开放寻指法
    当散列冲突之后 插入到 冲突位置下一个数组位置中 如果依然冲突依次往后找
    在查找的时候同样需要从hash运算出的位置依次向后找 直到遍历到找到的元素,或者空元素停止
    值得注意的是 删除过程中我们不能简单的做一个删除 否则会让查找算法失效,解决办法是删除的时候 我们标记为delete 这样查找的时候,遍历到delete,就跳过继续查找直到空或者找到相等元素
    但是这种方式在冲突很多的,情况下 时间复杂度会退回到o(n)

第二种则是我们hashmap中常见的,把冲的的元素在冲突位置生成链表或者红黑树

上一篇下一篇

猜你喜欢

热点阅读