Java知识点
JVM
1.垃圾回收
1.1可达性分析
引用计数 VS 可达性分析
引用计数:无法解决循环引用
可达性分析: GC Root扫描,finalize只会被执行一次
关于finalize:
https://stackoverflow.com/questions/158174/why-would-you-ever-implement-finalize
https://stackoverflow.com/questions/52879761/should-java-9-cleaner-be-preferred-to-finalization
1.2 垃圾收集器
1.3 分代回收
2.线程池
参考:
Java 多线程:彻底搞懂线程池
3.线程安全
4.HashMap
4.1HashCode如何计算
常用的hash函数:直接取余法、乘法取整法、平方取中法
hashcode是为了查找的快捷性,散列对象的存储地址。
以String计算hashcode为例
参考:
科普:为什么 String hashCode 方法选择数字31作为乘子
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
计算hashcode首先选择一个质数为因子,选用31计算时可以被JVM优化(i<<5)-i
hash作用主要是为了散列,减少冲突,以质数作为乘子可以减少冲突
重写equals时一般要重写hashcode(equals相等hashcode一定是相等的),hashcode主要用于hashmap、set中,为了减少冲突减少equals的比较次数先用hash进行散列。
equals若根据类中属性进行重写,hashcode也要根据属性选择相应乘子进行散列(模仿string)
5.
NIO
1.阻塞/非阻塞 vs 同步/异步
同步:调用方调用别的接口或请求数据时一定要得到结果才会执行后续的操作
异步:发起调用后可以先不获取结果执行后续操作,等结果返回再执行相应操作
阻塞:调用方要等待条件满足才能拷贝数据
非阻塞:调用方发起调用可以不用等待条件满足,先执行其他操作,等到条件满足或结果返回才去获取结果
2.select/poll/epoll
参考:
Epoll模型详解
select:1.用户空间fd复制到内核 2.轮询 3.回调 (fd数量受限1024)
poll:同select,只不过fd不受限(链表形式存储)
epoll:接口有3个函数
epoll_create:创建fd句柄
epoll_ctl:在一个eventpoll(红黑树)中增删改节点(fd)
epoll_wait:等待事件的产生