每天一套面试题Day7-小红书(1)
1.synchronize的用法及原理
2.如何创建线程池?线程池常见参数有哪些?
Executor工具,ThreadExecutorPool(X)的构造器 核心线程数,非核心线程数空闲时间,任务队列,拒绝策略,最大线程数
ThreadExecutorPool->ThreadPoolExecutor
3.ThreadLocal 的用法和实现原理
用来保存和每个线程绑定的一个变量。用set和get方法存入和取出当前变量的值。通过空间上的隔离支持了并发 这个变量存在thread对象中,thread对象有一个属性,threadLocals,它的类型是ThreadLocalMap,是在ThreadLocal类里面定义的一个类。通过ThreadLocal这个工具,可以设置当前线程对象的这个属性,key是当前threadLocal对象,值是设置的值。
4.请你说说HashMap底层原理和扩容机制。
HashMap底层采用数组+链表(JDK8前),后用数组+链表/红黑树(在链表长度超过64?), 初始容量为16,扩载因子0.75,当超过容量×扩载因子的时候,容量会变成原来的二倍,然后重新哈希,在JDK8之前需要重新计算,由于要么放在原序号的位置,要么放在原序号+数组,原序号与上新数组的大小,如果true那么就放在原序号+原数组大小的位置,反之就在原位置。
原数据通过尾插法迁移到新数组。链表长度超过8且数组长度≥64时会转为红黑树
5.请你说说ArrayList和LinkedList的区别。
ArrayList基于动态数组,随机访问比较快,只需要数组基址+数据的大小×序号,但是增删相对慢。ArrayList基于双向链表,所以增删改比较快,尤其是首尾的。
LinkedList每个节点含前后指针更占内存
6.你了解的JVM内存模型
线程共享的 堆,存放对象实例。方法区,存放类信息,常量 线程独有,随线程生而生,随线程灭而灭 虚拟机栈,程序计数器(存放当前指令的地址),本地方法栈
7.Java的垃圾回收算法
引用计数式垃圾收集(直接收集)
追踪式垃圾收集(间接垃圾收集) 可达性分析算法 标记-回收(老年代,有内存碎片),标记-整理(减少内存碎片),标记-复制(适合新生代,减少内存碎片)
8.类加载机制
加载(双亲委派,生成class对象),验证,准备,解析,初始化
类加载机制是JVM动态加载类的过程,包含加载、验证、准备、解析和初始化五个阶段。加载阶段读取.class文件生成Class对象;验证确保字节码合法;准备为静态变量分配内存并赋默认值;解析将符号引用转为直接引用;初始化执行静态代码块和变量赋值。各阶段顺序执行,确保类正确加载且符合安全规范。
9.说说你对AOP的理解
面向切面编程。切入点(匹配的条件),切面(封装横切逻辑的模块,比如日志切面,由when(通知,比如@After ),where(切点,比如,"execution(...)")what干什么组合而成),通知(定义何时执行什么功能的代码块) Spring AOP通过动态代理实现,分为 JDK动态代理(目标类实现了接口,代理类实现与目标类相同的接口),CGLIB动态代理(目标类未实现接口, Code Generation Library,代码生成库,生成目标类的子类作为代理类。)
查看13道真题和解析