Java基础 & 集合
2022-10-17 18:09:52 2 举报
AI智能生成
Java基础 & 集合 八股文
作者其他创作
大纲/内容
String特点
String
StringBuffer
StringBuilder
重载和重写
接口和抽象类
异常处理
面向对象
什么是泛型
泛型的优点
泛型原理
泛型
什么是反射
反射优缺点
反射使用场景
反射使用
反射
为什么需要序列化
序列化方式
序列化
Vector
自动扩容流程
浅拷贝
深拷贝
ArrayList的拷贝
ArrayList
LinkedList
Vector/ArrayList/LinkedList
哈希碰撞产生的原因
hashcode是如何计算的
计算hash值,通过取余操作,得到 index
为什么hashmap数组的长度为2的幂次方
在计算哈希值的 hash()方法中,得到 Object的hashcode之后,高16位和低16位做异或运算
降低Hash冲突怎么做
HashMap避免内存泄露
jdk 1.7 数组+链表
红黑树结点个数 < 6 时,会转回链表
数组长度 > 64 且 链表长度>8会转换为红黑树
红黑树保存较多信息,节点的值、指针、颜色
链表相对简单
为什么需要转换
jdk 1.8 数组+链表+红黑树
HashMap底层实现
没有Hash冲突,O(1)
有hash冲突 o1+ O(n)
数组+链表
没Hash冲突 O(1)
有Hash冲突 O(1)+O(logn)
数组、链表、红黑树
HashMap查询的时间复杂度
默认16,但初始容量是32
capactiy,16
loadFactor,负载因子,0.75
threshold,阀值 = 容量 * 负载因子 ,超过阀值会扩容
一些变量
当元素数量超过阀值会扩容,容量是扩容前的两倍
什么时候触发扩容
如果是空参,那么用默认的容量、负载因子和阈值,初始化数组,内部是空数组如果不是空参,使用传入的参数第一次put会初始化数组,容量变为不小于指定容量的2的幂,然后根据负载因子确定阈值如果不是第一次扩容,则新容量=旧容量* 2
扩容机制
遍历每个桶,然后遍历每个元素,重新计算hash值,找到新数组的对应位置,头插法插入新的链表因为是头插法,因此新旧链表元素位置会倒置并且,多线程下,可能会出现死循环
元素迁移
JDK 7
JDK 8
HashMap扩容
HashMap 和 HashTable 区别
外框
HashMap/HashTable
concurrentHashMap
HashCode方法,native 方法,底层采用c语言编写。作用是根据对象的内存地址,转换为整数类型
equals方法,默认情况下继承Object类,使用==判断对象的内存地址是否相等
两个对象相等,equal- 定相等 ,hashCode也- 定相等。因此重写equals方法之后还需要重写hashCode方法
阿里巴巴手册页规定了,只要使用自定义的对象作为Map的键,那么必须重写equals和hashCode
内存泄漏的问题
为什么重写 equals 还要重写 hashcode方法
Java基础 & 集合
0 条评论
回复 删除
下一页