个人总结八股文之-基础篇(持续更新)

一、集合的分类有哪些?

Java集合框架主要分为两大类:Collection 和**Map**

Collection主要分为以下三类:

  • List :有序集合,允许重复元素。常见的实现类有ArrayListLinkedListVector

  • Set :无序集合,不允许重复元素。常见的实现类有HashSetLinkedHashSetTreeSet

  • Queue :队列,通常用于存储待处理元素。常见的实现类有PriorityQueueLinkedList(也实现了Deque接口)。

Map主要分为以下两类:

  • HashMap :基于哈希表实现,允许null键和null值,不保证顺序。

  • TreeMap:基于红黑树实现,键值对按照键的自然顺序或自定义顺序排序。

二、迭代器的实现原理是什么?

在Java中,迭代器(Iterator)是一种设计模式,用于遍历集合中的元素。

迭代器通常用于遍历List、Set等集合类型。

迭代器的实现通常依赖于集合的内部数据结构

三、为什么new ArrayList<>()时建议指定初始化容量值?

ArrayList是基于数组实现的动态数组。

如果没有指定初始化容量,ArrayList会使用默认的初始容量(通常是10)。

指定初始化容量可以避免频繁的数组扩容操作。

四、为什么ArrayList的扩容机制默认扩容为原数组的1.5倍?

避免性能开销。

减少扩容次数。

减少内存浪费。

避免内存碎片。

五、ArrayList是线程安全的吗?

不是线程安全的。它是一个基于动态数组的数据结构,适用于单线程环境。在多线程环境下,如果多个线程同时访问和修改ArrayList,可能会导致数据不一致或其他并发问题。

六、CopyOnWriteArrayList的实现原理

修改时创建一个新的数组,并在新数组上进行修改。修改完成后,将原数组的引用指向新的数组。

读操作直接在原数组上进行,无需加锁。

七、HashMap添加元素流程

1.根据key的hashCode()方法计算哈希值。

2.哈希值与数组长度减一进行按位与计算桶位置。

3.将元素插入到桶位置。

如果该位置为空直接插入;

如果该位置不为空:

第一种情况:该位置节点的结构是链表,插入链表尾部(1.7及以前插入头部)。

第二种情况:该位置节点的结构是红黑树,按照红黑树的规则插入到树中。

4.扩容检查,如果容量超过阈值,创建一个新数组,长度为原来的2倍,并将原数组中的元素重新哈希分配到新数组。

八、HashMap的负载因子为什么是0.75

负载因子越大,数组中元素填满成都越高,越容易出现哈希冲突;负载因子越小,数组中元素填满成都越低,空间利用率低。

避免频繁扩容。

可以使阈值是整数,因为阈值=容量*负载因子,容量通常是2的幂次方,优化位运算操作,提高计算效率。

九、HashMap扩容为什么扩容为数组长度的2倍

减少哈希冲突,提高操作效率,方便数据迁移

十、HashMap是线程安全的吗

不是

十一、ConcurrentHashMap的实现原理

它是多线程环境下可以安全的存储和访问键值对的哈希表实现。

数据结构上采用数组+链表+红黑树。

1.7以前采用分段锁机制,将HashMap分成多个段(segment),每段有一个锁,可以实现不同段的并发访问,同时访问一个段才需要获取锁。

现在使用CAS和synchronized关键字实现锁机制,一段时间内只有一个线程可以对一个桶位置进行操作。

采用多线程的方式进行扩容中的数据迁移。

十二、泛型是什么?泛型的好处?类型擦除是什么?

泛型是编程语言中用于参数化类型 的一种机制 ,允许在定义类、接口、方法时使用类型参数,实际使用时再指定具体类型。

避免 运行时因类型转换 导致的错误同一段逻辑 可以适用于多种数据类型 ,提高代码可读性

类型擦除就是在编译后将泛型类型信息擦除 ,替换为原始类型 (如Object)或边界类型(如泛型的上界)。

十三、反射是什么?反射的好处?反射的使用场景?

反射是指在程序运行时动态获取类型信息操作对象的能力。

可以通过反射编写通用代码 ,提高灵活性动态性 ,动态分析对象状态

框架开发:利用反射实现依赖注入动态代理等功能。

动态代理:AOP中,反射生成代理对象拦截方法调用。

序列化与反序列化。

注解处理:反射读取注解信息实现自定义逻辑。

十四、动态代理有哪些方式?原理是什么?

JDK动态代理、CGLIB动态代理、Javassist动态代理

运行时字节码生成:动态代理在运行时通过修改或生成字节码创建代理类

方法调用拦截:所有代理方法调用会被转发到统一的处理逻辑

十五、JDK动态代理和CGLIB动态代理的区别?

JDK动态代理基于反射机制 生成代理对象,要求目标类必须实现接口

CGLIB动态代理通过字节码技术 生成目标类的子类作为代理对象,无需 目标类实现接口

JDK动态代理性能略低于CGLIB动态代理,因为后者无需目标类实现接口,适用于高性能场景。

十六、虚拟线程的原理

虚拟线程是Java19 引入的轻量级线程,由JVM管理而非操作系统,开销低,适合高并发场景。

其实现依赖于载体线程

相关推荐
ideaout技术团队3 分钟前
leetcode学习笔记2:多数元素(摩尔投票算法)
学习·算法·leetcode
代码充电宝7 分钟前
LeetCode 算法题【简单】283. 移动零
java·算法·leetcode·职场和发展
不枯石3 小时前
Matlab通过GUI实现点云的均值滤波(附最简版)
开发语言·图像处理·算法·计算机视觉·matlab·均值算法
不枯石3 小时前
Matlab通过GUI实现点云的双边(Bilateral)滤波(附最简版)
开发语言·图像处理·算法·计算机视觉·matlab
白水先森5 小时前
C语言作用域与数组详解
java·数据结构·算法
想唱rap5 小时前
直接选择排序、堆排序、冒泡排序
c语言·数据结构·笔记·算法·新浪微博
老葱头蒸鸡6 小时前
(27)APS.NET Core8.0 堆栈原理通俗理解
算法
视睿6 小时前
【C++练习】06.输出100以内的所有素数
开发语言·c++·算法·机器人·无人机
柠檬07117 小时前
matlab cell 数据转换及记录
算法
YuTaoShao7 小时前
【LeetCode 每日一题】2221. 数组的三角和
数据结构·算法·leetcode