HashMap和HashTable的区别?底层实现是什么?

image.png
image.png
image.png

ConcurrentHashMap原理,jdk7和jdk8的区别?

大神回答:https://blog.csdn.net/qq_35190492/article/details/103589011?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161560436016780255263293%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161560436016780255263293&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-103589011.first_rank_v2_pc_rank_v29&utm_term=ConcurrentHashMap

线程安全 Hashtable是全局锁。 ConcurrentHashMap是分段锁
JDK7 ConcurrentHashMap底层数据结构 ReentrantLock + Segment + HashEntry
JDK8 sychronized + CAS +Node + 红黑树
image.pngimage.png
image.png
image.png

如何实现一个Ioc容器

image.png
还有循环依赖,属性注入,这就比较复杂

什么是字节码?采用字节码的好处是什么?

JVM能理解的代码就叫字节码
跨平台
image.png

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)

    • 隔离加载类
    • 修改类加载方式
    • 拓展加载源
    • 放置源码泄漏

image.png

双亲委派模型?好处

Main java程序入口,就是用的AppClassLoader。

  • 向上委派 查找缓存
  • 向下查找 查找加载路径

好处:

  • 安全性,避免用户自己编写的类替换Java的一些核心类 比如String (同时自定义类不能以 .java开头)
  • 避免了类的重复加载,因为JVM中区分不同类,不仅仅是根据类名,相同的class文件被不同的ClassLoader加载就是不同的两个类

image.png
image.png
image.png
image.png

Java中的异常体系

image.png
image.png
image.png

GC如何判断对象可以被回收

这里只问判断可以被回收 那就是两种

  • 引用计数法 新增一个就 + 1
  • 可达性分析法 从GCRoot开始向下搜索,走过的路就叫引用链,要是一个对象到GC Roots没有任何引用链,则判断可回收
    • GC Root对象有哪些 有哪些特例
    • 两次标记则死亡的 finalize()机制

image.png
image.png
image.png
image.png

线程的生命周期,线程有哪些状态

image.png
image.png
image.png

sleep()、wait()、join()、yield()的区别

image.png
image.png
image.png
上述代码执行结果22222 1111