HashMap和HashTable的区别?底层实现是什么?
ConcurrentHashMap原理,jdk7和jdk8的区别?
线程安全 Hashtable是全局锁。 ConcurrentHashMap是分段锁
JDK7 ConcurrentHashMap底层数据结构 ReentrantLock + Segment + HashEntry
JDK8 sychronized + CAS +Node + 红黑树
如何实现一个Ioc容器
还有循环依赖,属性注入,这就比较复杂
什么是字节码?采用字节码的好处是什么?
JVM能理解的代码就叫字节码
跨平台
Java类加载器有哪些
BootStrap ClassLoader(引导类)启动类加载器 :
- 使用C/C++语言实现,嵌套在JVM内部
- 加载Java核心类库(JVM自身需要的类)
%JAVA_HOME%
rt.jar包 - 出于安全考虑,只加载包名为java、javax、sun开头的类
- 并不继承于ClassLoader,没有父加载器。
Extension ClassLoader 拓展类加载器
- 派生于ClassLoader类 ,父类加载器是 启动类加载器 并不是直接的继承关系
- 主要用于加载核心库之外的拓展类包
- 如果用户自己创建的jar放在拓展目录下,也会由拓展类加载器加载
AppClassLoader 应用程序加载器(系统类)线程上下文加载器
- 派生于ClassLoader类 ,父类加载器是 拓展类加载器
- 是程序的默认加载器,一般来说java应用的类都是由他加载完成
- 负责加载环境变了或系统属性java.class.path指定路径下的类库
必要的时候 用户自定义类加载器(继承ClassLoader,要想完成双亲委派parent属性必须是AppClassLoader)
- 隔离加载类
- 修改类加载方式
- 拓展加载源
- 放置源码泄漏
双亲委派模型?好处
Main java程序入口,就是用的AppClassLoader。
- 向上委派 查找缓存
- 向下查找 查找加载路径
好处:
- 安全性,避免用户自己编写的类替换Java的一些核心类 比如String (同时自定义类不能以 .java开头)
- 避免了类的重复加载,因为JVM中区分不同类,不仅仅是根据类名,相同的class文件被不同的ClassLoader加载就是不同的两个类
Java中的异常体系
GC如何判断对象可以被回收
这里只问判断可以被回收 那就是两种
- 引用计数法 新增一个就 + 1
- 可达性分析法 从GCRoot开始向下搜索,走过的路就叫引用链,要是一个对象到GC Roots没有任何引用链,则判断可回收
- GC Root对象有哪些 有哪些特例
- 两次标记则死亡的 finalize()机制
线程的生命周期,线程有哪些状态
sleep()、wait()、join()、yield()的区别
上述代码执行结果22222 1111