面试准备first
面试准备——八股文,简单算法,项目介绍
八股文
main方法输出HellowWorld会产生几个线程
main线程,gc垃圾回收线程,Finalizer 调用对象的 finalize() 方法
Reference Handler 处理软/弱/虚引用的引用队列
Signal Dispatcher 处理JVM信号,如中断、终止等
异常介绍一下
Throwable类是所有异常和错误的父类
Erro表示JVM错误,像内存溢出
Exception如下:
受检查异常:一定要编译才能运行,比如IOException,SQLException
检查异常:不强制捕获,但是声明后可以捕获程序错误
自定义
接口类和抽象类的区别,从定义的关键字,变量,方法,设计层面说一下
在实际开发中,我主要使用接口来定义业务模块的功能规范,比如在 Spring 项目中,我会使用接口作为 Service 层的抽象,并通过具体的 ServiceImpl 实现类完成具体逻辑,这样可以便于后期的 AOP 切面编程、Mock 测试和解耦设计。
接口使用 interface 关键字,里面定义的方法默认是 public abstract,变量默认是 public static final,也就是全局常量。
相比之下,抽象类我用得较少,它通过 abstract 关键字定义,使用 extends 继承。抽象类可以包含抽象方法,也可以有构造方法、成员变量和普通方法,更适合在多个子类之间复用通用逻辑。抽象方法子类必须实现。
ArrayList和LinkedList的区别
ArrayList 底层是动态数组,支持根据索引快速读取元素,因此读操作快,但插入或删除时需要移动数组元素,写操作相对较慢;而 LinkedList 是基于双向链表实现的,插入和删除元素时只需调整节点指针,因此写操作快,但访问元素时需要遍历链表,读操作较慢。
sql题,一个表有三个字段,班级id,学生id,成绩id,查出每个班级的前3名。
Select class_id,scores,student_id
from(Select class_id,scores,student_id,ROW_NUMBER() OVER(PARTITION BY class_id ORDER BY scores DESC) AS Tfrom Table)AS T
WHERE t <= 3
ORDER BY class_id,t;
讲一下spring的两大特性
ioc是控制反转,比如将对象创建管理等交给spring容器,由容器统一管理bean,比如我们的注解配置,xml配置,config配置类,ontroller,service,requestbody,目的是实现解耦合,降低代码之间的依赖,还有aop是切片编程,把重复逻辑抽取出来让核心业务更存粹,比如@transactional事务回滚,还有日志就是在每个步骤写上注释,before after打印日志
讲一下hashmap底层原理
hashmap的底层是数组、链表和jdk8以后为了解决哈希冲突的红黑树,数据会通过计算的hash值定位在存放的数组桶,桶里的数据以链表形式存放,当超过8时会转换成红黑树
初始容量:默认 16(可以指定)
装载因子(load factor):默认 0.75
当 size >= 容量 × 负载因子,会扩容为原来的 2 倍
HTTP 常见状态码
200成功
404资源不存在
401未登录
403权限不够
500服务器错误
301:永久重定向
Spring Boot 自动加载实现机制
Spring Boot 实现自动加载的核心是自动装配机制
@EnableAutoConfiguration类
SpringBoot 会扫描 classpath 下的 spring.factories 配置文件,加载各种自动配置类,并根据上下文环境和条件注解自动生效,极大地减少了配置代码,提升了开发效率。
你了解分布式锁吗
redission里面的setnx里面,k,v,时间实现加锁
mybatis里面#和$的区别
#是字符值,$是字符串拼接
Java String、StringBuffer 和 StringBuilder 的区别
String 是不可变对象,每次拼接都是新对象。
StringBuffer 是线程安全的,但性能比 StringBuilder 差。
StringBuilder 是非线程安全的,但性能最好,推荐用于单线程拼接。
联合索引
- 创建联合索引
CREATE INDEX idx_course_user ON lesson(course_id, user_id);
INDEX idx_course_user (course_id, user_id) 是建表语句里的索引定义写法,是告诉数据库建表的时候顺便创建这个索引。
CREATE INDEX idx_course_user ON lesson(course_id, user_id); 是给已经存在的表新建索引的独立语句。
JVM 内存区域
程序计数器
栈
堆
本地方法栈
方法区
springboot
Spring Cloud提供了服务注册与发现、负载均衡、断路器、网关等功能
三次握手和四次握手
三次:
确定连接——客户端向服务端发送syn包,然后服务端确认回复syn+ack给客户端,负端再给客户端发送ack
四次:
取消连接——客户端发送fin,服务端接受发送ack,过段时间发送fin,客户端给ack
给一个字符串数组,返回出现最多的字符串
Map<String,Integer> map = new HashMap<>();
for(String s : arr){map.put(s,map.getOrDefault(s,0)+1);
}
String res ="";
int maxCount = 0;
for(Map.Entry<String,Integer> entry : map.entrySet){if(entry.getValue() > maxCount){maxCount = entry.getValue();res = entry.getKey();}
}
1本次面试总结
居然tm什么都没考??
八股文还是要更系统的看一遍
必须要完整过一遍项目,整个流程内部要搞清楚
看一下sql视频,很多简单sql都写不出来
算法题必须把简单全部过掉
时间(20)天,7.10号之前做完
第二次面试6.29
底层基础
JDK(Kit)包括JRE (Environment) -> JVM
==比较的是对象的内存地址(引用),而非值。
nteger num = 100; // 自动装箱(Integer.valueOf(100))
int primitiveNum = num.intValue(); // 手动拆箱
System.out.println(primitiveNum); // 输出: 100
包装类的valueOf()方法,拆箱其实就是调用了 xxxValue()方法。
long l = Long.MAX_VALUE;
System.out.println(l + 1); // -9223372036854775808
System.out.println(l + 1 == Long.MIN_VALUE); // true
面向对象三大特性 + 示例代码
继承;封装;多态
1继承,通俗来讲就是子类继承父类的功能,比如mp我们写服务层继承iservice直接使用里面的方法便捷我们的开发
2封装,便于操作对象,封装实体类,使用private关键字只在内部调用而不暴露到外面接口,提高安全性
3多态,在impl实现接口层,重载方法,也就是方法名一样但是对应的参数不同,还有我们经典的List方法就是后面new一个ArrayList也是多态的原理
HashMap 的底层实现?什么时候变红黑树?
底层是数组加链表加红黑树,通过计算hashcode得到数组下标来确定数据存放在哪个一个bucket,使用链表存储,当超过8时转换成红黑树提升查找效率logn
synchronized 和 volatile 的区别?
synchronized关键字用于加锁,在我们要保证原子性的代码块加上该关键字
volatile主要是声明可见性,例如在线程中该数值改变后让其他线程操作时也看到
什么是线程安全?你怎么保证线程安全?
在高并发条件下,线程之间会存在操作失败,操作冗余,又或者是没有实现想要的效果,这是我们要实行的线程安全来保障操作可行。比如添加synchronized关键字,加锁,使用线程安全的容器如ConcurrentHashMap,用redis缓存数据库同时用mq消息队列异步执行来避免之间写入数据库,使用乐观锁
双亲委派机制?
Java的双亲委派机制(Parent Delegation Model)是类加载器(ClassLoader)在加载类时遵循的一种层级委托规则,其核心目的是确保类的唯一性、安全性和避免重复加载。
sql索引底层是 B+ 树?为什么比 B 树好?
B+ 树 = 所有数据存在叶子节点,且叶子节点有链指针,适合范围查找
优点:
所有数据在叶子节点,结构统一;
所有叶子节点是链表,范围查询很快;
每个节点能存更多索引,提高磁盘利用率,降低 I/O 次数。
SQL 调优做过哪些?怎么用执行计划?
EXPLAIN SELECT … 可查看 SQL 执行计划
关注字段:
type:访问方式(ALL最差,range、ref、const 更好)
key:使用的索引
rows:扫描行数(越少越好)
Extra:如 Using index 表示使用了覆盖索引
调优手段:
建立合适的复合索引;
避免 select *;
where 条件避免函数包裹字段;
分页查询用索引或覆盖索引
缓存穿透 / 击穿 / 雪崩的区别与解决方案?
缓存穿透 / 击穿 / 雪崩的区别与解决方案?
问题 描述 解决方案
穿透 查询不存在的 key,穿透缓存打到DB 加布隆过滤器 / 空值缓存
击穿 热点 key 失效,瞬间大量请求打爆DB 加互斥锁(Redisson) / 永久不过期热点 key
雪崩 大量 key 同时过期 加过期时间随机值 / 降级限流 / 提前预热