Java进阶
Java基础
Java是解释执行吗?
答:不完全是
- 老版Java解释执行我们写的java代码,在Javac编译后,被JVM解释执行
- Hotspot虚拟机实现JIT,对于热点代码,它会在运行时将其编译为机器码,直接跑在机器上
- JDK9 又有了一种新型的编译方式AOT(Ahead of Time Compilation),直接将字节码转化为机器码
Exception与Error
都是
Throwable
类的子类,只有继承了Throwable
才能被抛出或者捕获Error
指正常情况下难以预料的异常,交由父类或JVM来帮我们处理Exception
指可以预见的异常,应该我们自己处理。Exception
分为检查型异常和非检查型异常(或者说编译时异常、运行时异常)- 检查型异常必须显式的捕获处理(编译时异常)
- 非检查型异常就是运行时异常,通常是编码可以避免的逻辑错误(运行时异常)
常见的错误:
- Error:OOM、SOF、NoClassDefFoundError、ExceptionInInitializerError(静态变量初始化的过程中出现了异常)
- Exception:
- 检查型异常:IOException、ConcurrentModificationException
- 运行时异常(非检查型异常):NullPointException、ClassCastException
NoClassDefFoundError
与NoClassFoundExeption
:区别NoClassDefFoundError
:运行时JVM加载不到类或者找不到类NoClassFoundExeption
:编译时JVM加载不到类或者找不到类导致的
捕获异常要注意
- 不要捕获大的异常比如Exception
- 不要生吞异常(连记录都不记录)
final、finall、finalize
搞不懂为什么要将这三个进行分析。。。
强、软、弱、虚引用
虚引用补充:比如替代finalize方法的Cleaner,就用到了虚引用,就是用来通知此类,如果这个类被回收了,我能收到消息
-XX:+PrintReferenceGC
可以查看引用信息
String
intern
:是一种显式的排重机制(因为intern会将字符串放进池,这样不会导致有重复的String)- String变量
JDK动态代理与cglib
- JDK动态代理,只能代理实现了接口的类
- cglib代理的类可以不实现接口
包装类
Integer:-128 到 127;缓存范围可以调整
-XX:AutoBoxCacheMax=N
Boolean缓存两个实例 True和False
booleanJVM当做int类型处理,占4个字节,但是如果是一个boolean数组,每个就只占1字节的大小,JVM会对其进行调节
装箱:
Integer.valueOf
;拆箱:Integer.intValue
自动装箱拆箱发生在什么阶段?
Vector、ArrayList、LinkedList
- Vector扩容时扩容1倍
- ArrayList扩容扩1.5倍
- 集合类下有:list、queue、set(注意:map不是集合包下的)
- LinkedList用双向链表实现
Java IO
- 传统IO:FIle、Reader/Writer、Output/InputStream、BufferedOutputStream
- 1.4 引入 NIO:Buffer、Channel、Selector(实现多路复用的基础)、Charset
- NIO同步非阻塞IO