20230909java面经整理

1.java常用集合

ArrayList动态数组,动态调整大小,实现List接口

LinkedList双向链表,实现list和queue接口,适用于频繁插入和删除操作

HashSet无序,使用哈希表实现

TreeSet有序,使用红黑树实现

HashMap无序,使用哈希表

TreeMap有序,使用红黑树

LinkedHashMap有序,使用哈希表和双向链表,保持插入顺序

Queue队列

PriorityQueue优先队列,按照优先级排序

Stack栈,后进先出

2.红黑树相比b+树的区别和使用场景

应用场景:java集合中的TreeSet和TreeMap,HashMap链表大于8转化红黑树;cpp的stl中的set和map;linux虚拟内存的管理

红黑树相比b+树的优点:rbt用于内部排序而b+t用于外存是一个磁盘友好的数据结构;红黑树具有较快的插入删除查找的时间复杂度

3.ArrayList和LinkedList对比

1.ArrayList是动态数组,LinkedList是链表

2.随机访问array快,linked增加删除快

3.arraylist需要手动设置固定大小,link自由度动态变化

4.arraylist扩容到1.5倍

4.ArrayList使用注意事项

1.线程不安全问题1:两个线程同时添加元素,判断ensureCapacity都成功,导致数组越界

2.线程不安全问题2:元素值覆盖为空问题,多线程同时写入

安全处理:synchronizedList,给add加锁,copyonwirteArrayList(写时复制),使用ThreadLocal确保线程封闭性

5.java线程池核心参数

corePoolSize:核心线程数,没有任务时线程池的基本大小

maximunPoolSize:线程池最大的线程数量

keepAliveTime:大于core时,多余的空闲线程在等待时期最长存活时间

unit:keepAliveTime时间单位

workQueue:存放待执行任务的阻塞队列

threadFactory:创建新线程的工厂类

handler:当线程池到达最大线程数量且任务队列已满,常见策略有抛出一场、丢弃任务、丢弃最老任务、直接在调用者线程个中执行

6.线程池工作原理

1.小于core,直接创建并执行在核心线程池

2.大于等于core,加入队列等待

3.queue满,创建非核心线程并立刻执行

4.queue满,大于等于max,handler处理

5.任务执行完移除,同时取下一个线程

6.空闲时间超过alivetime,且大于core,会停止回收多出来的线程

7.为什么要用阻塞队列

1.协调和控制线程执行,防止任务丢失或积压

2.任务缓冲,确保不会立即执行,有效平衡任务的生产和消费速度

3.线程管理,当线程池线程忙碌时,新任务在队列中等待

如果使用非阻塞队列,会产生

1.线程数不受控制,耗尽资源

2.任务丢失,如果队列已满新任务立刻丢弃

3.竞态条件,可能会导致数据一致性问题

8.hashMap的rehash

每个键的hashCode处以桶数组大小len,rehash的意思就是len变大,但是还是均匀的

9.CPU密集时如何设计线程池

采用cpu核数+1个线程,+1保证发生缺页中断阻塞时,额外的线程可以顶上去

最理想cpu所有的核心都在运行线程池中的线程

10.io密集如何设计线程池

最佳线程数 = 1 + io耗时/cpu耗时,从而提高cpu和io的利用率

11.threadlocal原理和使用场景

指线程本地变量,使得每个变量副本对于每一个 线程都是独立的,实现变量隔离性。

每个线程都有一个成员变量threadlocalmap,可以用来存数据

使用场景:

1.全局存储用户信息

2.进行线程隔离的变量使用threadlocal进行封装

3.多个方法使用同一个对象时,使用threadlocal替代参数的传递,减少代码耦合;例如@transaction中的就使用了threadlocal保存了connection

12.threadlocal使用注意

内存泄漏问题:指程序中动态分配的堆内存由于某种原因没有释放或无法释放,造成内存浪费,导致系统崩溃,最后堆积导致内存溢出。

由于entry对象被弱引用修饰,会在下次垃圾回收中清除掉,实现threadlocal和线程生命周期的解绑

,这个时候entry的key是null,但是threadlocalmap中存在current thread ref强引用,因此value无法清楚。

因此,需要我们手动remove掉entry对象。

使用弱引用的原因是因为在set和getEntry过程中会对key进行判断,如果key是null,value也会设置为null,这样即使忘了调用remove,当threadlocal被销毁,value值也会被清空

ThreadLocal中一个设计亮点是ThreadLocalMap中的Entry结构的Key用到了弱引用。试想如果使用强引用,等于ThreadLocalMap中的所有数据都是与Thread的生命周期绑定,这样很容易出现因为大量线程持续活跃导致的内存泄漏。使用了弱引用的话,JVM触发GC回收弱引用后,ThreadLocal在下一次调用get()、set()、remove()方法就可以删除那些ThreadLocalMap中Key为null的值,起到了惰性删除释放内存的作用。

其次就是在ThreadLocalMap会存在相应的遍历来查看key为null的槽位并且进行删除哦~

相关推荐
2的n次方_1 分钟前
二维费用背包问题
java·算法·动态规划
皮皮林5512 分钟前
警惕!List.of() vs Arrays.asList():这些隐藏差异可能让你的代码崩溃!
java
莳光.2 分钟前
122、java的LambdaQueryWapper的条件拼接实现数据sql中and (column1 =1 or column1 is null)
java·mybatis
程序猿麦小七7 分钟前
基于springboot的景区网页设计与实现
java·spring boot·后端·旅游·景区
weisian15113 分钟前
认证鉴权框架SpringSecurity-2--重点组件和过滤器链篇
java·安全
蓝田~15 分钟前
SpringBoot-自定义注解,拦截器
java·spring boot·后端
.生产的驴17 分钟前
SpringCloud Gateway网关路由配置 接口统一 登录验证 权限校验 路由属性
java·spring boot·后端·spring·spring cloud·gateway·rabbitmq
v'sir31 分钟前
POI word转pdf乱码问题处理
java·spring boot·后端·pdf·word
提高记忆力39 分钟前
SpringBoot整合FreeMarker生成word表格文件
java·spring
JDS_DIJ40 分钟前
RabbitMQ
java·rabbitmq·java-rabbitmq