String、StringBuilder、StringBuffer有什么区别
String
:底层private final
修饰的char[]
,因为由于private
修饰,而且没有对外提供修改方法,所以是不可变的,每次str+=
新字符串,其实底层是创建StringBuilder
对象,值为String
原来的值,然后调用append
方法,最后调用toString
方法转为字符串
StringBuilder
:底层char[]
,父类AbstractStringBuilder
,可变,线程不安全
StringBuffer
:底层char[]
,父类AbstractStringBuilder
,可变,线程安全
请你说说HashMap底层原理
底层数据结构:1.8
之前数组+链表,1.8
之后数组+链表/红黑树
put
:根据key
计算哈希值,然后用哈希值按位与&
集合的长度从而确定元素的位置,如果位置有其他元素,发生哈希碰撞,则使用链表来连接这些元素,1.8
之前是头插法,1.8
之后是尾插法,当链表长度达到8
时,就会发生扩容,如果链表长度达到8
时并且数组容量达到64
,就会转变为红黑树
扩容机制:初始容量为16
,负载因子为0.75
,当容量达到负载因子,会以2^n
指数倍扩容
说说你了解的JVM内存模型
由三部分组成:类加载子系统、执行引擎、运行时数据区
类加载子系统:根据类的全限定名称来载入类
执行引擎:执行被载入类中方法的指令
运行时数据区:线程私有虚拟机栈、本地方法栈、程序计数器,线程共享堆、方法区
- 虚拟机栈:存储方法执行中的局部变量
- 本地方法栈:存储
native method
本地方法 - 程序计数器:记录线程执行的位置
- 堆:存储对象的实例,分为新生代和老年代,新生代又分为
Eden、from、to
(两个survivor
),新生代存储新创建的对象,老年代存储存活时间较久的对象,垃圾回收主要回收堆,垃圾回收算法有标记-清除、标记-整理、标记-复制 - 方法区:存储常量、静态变量
说说JVM的垃圾回收机制
GC:garbage collection
,垃圾回收
minor GC
、mixed GC
、full GC
:minor
使用标记-复制算法回收新生代;mixed
标记-复制回收新生代,标记-整理回收部分老年代;而full
回收整个堆
主要完成三件事:
- 哪些需要回收:不被使用的对象、废弃的常量
- 什么时候回收:通过引用计数器、可达性分析法判断
- 如何回收:通过垃圾回收器
垃圾回收器分为串行、并行、并发回收器,常见垃圾回收器有serial
(串行)、parallel
(并行)、CMS(concurrent Mark sweep)
、G1
parallel
:新生代minor GC
,old
老年代full GC
CMS
:minor GC
,回收跟不上创建,full GC
G1
:minor GC
,mixed GC
,回收跟不上创建,full GC
说说类加载机制
包括五个阶段,加载,验证,准备,解析,初始化,其中验证,准备,解析合称为链接
加载:首先判断类是否加载过,没有加载过使用类加载器进行加载,把.class
文件加载到内存,生成class
对象
验证:验证类的格式是否正确
准备:为静态变量分配空间,分配默认值
解析:将符号引用转为直接引用,符号引用是使用一堆符号来描述引用的目标,直接引用,直接指向目标的指针
初始化:为静态变量、静态代码块赋值
类加载器:主要分为三种,启动类加载器(bootstrap ClassLoader
)、扩展类加载器(extension ClassLoader
)、应用程序类加载器(application ClassLoader
);优先加载核心加载器,保证核心加载器不被篡改,上级对下级共享,从上到下加载,上级加载不了,下级加载;可以自定义加载器,其上级为应用程序加载器(application ClassLoader
)