1.java基础

78 阅读2分钟

1.两个byte相加会先将他们提升为int类型再相加, += 则是将结果自动强转为所需类型

image.png

  1. 9 * 0.1 == 0.9输出false,因为浮点数不能完全精确的表示出来

image.png

如何判断两个浮点数是否相等呢?在误差允许范围内就行,例如 a - b == 0.00000000001

3.switch语句遇到break或者全部case执行完才会停下来

image.png

  1. 异常的实现原理,使用javap查看底层实现的命令

原始代码:

public static void main(String[] args) {
    try {
        Double a = null;
        System.out.println(a.doubleValue());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

javap -v 源文件.class查看:

 Exception table:
         from    to  target type
             0    12    15   Class java/lang/Exception

from 可能发生异常的起始点
to 可能发生异常的结束点
target 上述from和to之前发生异常后的异常处理者的位置
type 异常处理者处理的异常的类信息

5.SPI机制:java只提供标准接口,由具体的厂商实现具体的方法,例如数据库mysql和oracle,每个厂商都有自己的标准。java依靠serviceLoader这个类查找META-INF/services目录下的配置文件,这个文件的文件名称是接口的全限定名,文件内容是具体实现

image.png

image.png

image.png

image.png 测试类,输出结果为mysql

image.png

serviceLoader实现源码:

load方法进来new了一个serviceloader

image.png serviceLoader的构造方法,校验了接口是否符合条件,做了一些前置工作,并没有真正的加载接口实现

image.png

serviceLoader使用的懒加载模式,只有在调用迭代器的hashNext方法的时候才会加载具体的实现类, 客户端调用serviceLoader.iterator()方法生成迭代器,然后调用hashNext()方法,看一下hasNext方法实现:

image.png hasNext里调用了hasNextService,

image.png hasNextService里调用了nextProviderClass,这个方法里面才调用了类加载器去加载/META-INF/services目录下的文件

image.png