JAVA面试八股文

1、hashMap

hash的基本概念是什么

任意长度的输入通过hash算法,映射成固定长度的输出

 

hash存在的问题

存在hash冲突,理论上无法避免,只能尽量避免

 

好的hash算法需要考虑哪些点

效率高、hash值尽量唯一、尽可能分散

 

hashmap中存储的数据结构

数组+链表+红黑树

node结构中有key、value、next、hash

 

初始长度 

16

 

hashmap什么时候创建

懒加载机制,只有第一次put的时候才会创建

 

默认负载因子和作用

0.75 ,负载因子乘以size=扩容阈值

 

链表转化为红黑树需要达到什么条件

两个条件:链表长度达到8,数组长度达到64

 

node结构中的hash和key的hashcode的区别

h = key.hashcode

hash = h ^ h>>16 用异或可以更加散列

 

hash寻址算法

hash&(length - 1),其中length为数组长度,为2的幂次,所以hash & (length - 1) = hash % length

 

put的流程

四中情况:

第一种 slot == null,直接占用

第二种slot != null但是node没有链化, equals完全相等,直接替换,如果存在hash冲突,直接进行尾插法

第三种slot内的node已经链化,如果equals一致,替换,不一致则进行尾插法并且进行树化判断

第四种 冲突严重已经树化

红黑树继承了node结构,在node基础上增加了父节点parent ,左子节点left,右子节点right,还有颜色red

红黑树是特殊的二叉排序树,(左子节点小于当前节点,又节点大于当前节点),二分查找的方式

查找不到equals相等的点,就插入节到父节点的左子树或者右子树,然后判断是否打破平衡,进行红黑树的平衡算法

如果equals一致,进行replce操作

 

红黑树的五个原则

节点要么红,要么黑

根节点黑色

所有叶子节点黑色

红色节点的两个子节点都是黑色的

从任一节点到每个叶子的所有路径都包含相同数目的黑色节点

 

引入红黑树的原因

链表查找效率为O(n),红黑树为O(logn)

 

hashmap的扩容机制

记录数据量的字段达到阈值,触发扩容,tableSize << 2

 

扩容中的数据迁移

四种情况

第一种slot为null, 无需操作

第二种node没有链化, 根据新tableSize计算新表位置,然后存放过去

第三种node链化没有树化,拆分链表为高位链表和低位链表,低位链表位置保持不变,高位链表位置是老表位置+老表的size

第四种node存储了红黑树,拆分链表方式,不过需要注意拆分的链表长度,如果小于等于6, 转化为链表,如果大于6,保持红黑树

 

2、垃圾回收机制

判断对象是否是垃圾

引用计数法,执行效率高,无法检测出循环引用导致内存泄露

可达性分析, GC Root 对象:栈中引用的对象,方法区中常量引用的对象,方法区中类静态属性引用的对象,本地方法栈中JNI的引用对象

 

垃圾回收算法

标记-清除 碎片化

复制算法 内存占用大

标记-整理 增加整理步骤

分代收集 新生代(eden from to, MInor GC) 老年代(full gc)

 

垃圾收集器

新生代 单线程,多线程 老年代单线程,多线程,CMS G1

 

强引用、软引用(内存空间不足才回收)、弱引用(GC时被回收)和虚引用(哨兵作用)

new     SoftReference   WeakReference  PhantomReference

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值