1.两个byte相加会先将他们提升为int类型再相加, += 则是将结果自动强转为所需类型
- 9 * 0.1 == 0.9输出false,因为浮点数不能完全精确的表示出来
如何判断两个浮点数是否相等呢?在误差允许范围内就行,例如 a - b == 0.00000000001
3.switch语句遇到break或者全部case执行完才会停下来
- 异常的实现原理,使用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目录下的配置文件,这个文件的文件名称是接口的全限定名,文件内容是具体实现
测试类,输出结果为mysql
serviceLoader实现源码:
load方法进来new了一个serviceloader
serviceLoader的构造方法,校验了接口是否符合条件,做了一些前置工作,并没有真正的加载接口实现
serviceLoader使用的懒加载模式,只有在调用迭代器的hashNext方法的时候才会加载具体的实现类, 客户端调用serviceLoader.iterator()方法生成迭代器,然后调用hashNext()方法,看一下hasNext方法实现:
hasNext里调用了hasNextService,
hasNextService里调用了nextProviderClass,这个方法里面才调用了类加载器去加载/META-INF/services目录下的文件