面试(二)
笔试(编码)
用递归的方法打印出5的阶层
写出一些常用的linux命令并解释他的作用
谈一谈你对数据库的优化
介绍以下自己的项目(没听出有什么牛逼的地方)
介绍一下你使用的技术栈
后端以 Java 为主,框架用 Spring Boot、Spring Cloud,数据库用 MySQL、Redis,ORM 用 MyBatis,消息队列用 RabbitMQ,缓存用 Caffeine,部署用 Docker、K8s。
聊聊你对线程的理解
线程是进程内的执行单元,共享进程资源,比进程更轻量。比如一个 Web 服务器用多线程处理多个用户请求,线程间通过锁(如 ReentrantLock)或 volatile 保证数据安全,通过线程池(如 ThreadPoolExecutor)提高资源利用率。
那你聊聊你对String的理解
String 是 Java 中不可变的字符序列(底层 char 数组被 final 修饰),每次修改(如 +
操作)都会创建新对象。适合存常量或高频访问字符串,可利用常量池复用对象,如需频繁修改建议用 StringBuilder 或 StringBuffer。
那你能举例你使用String.lang报下的api
equals()
:比较字符串内容(区分大小写);contains("xxx")
:判断是否包含子串;split(",")
:按分隔符拆分字符串;trim()
:去除首尾空格;substring(1,3)
:截取子串(从索引 1 到 2);toLowerCase()
/toUpperCase()
:转小写 / 大写。
看你的简历使用了set集合,能给我介绍一下key,value吗
Set 是单列集合,没有 key-value 结构,它存储的是不重复的元素(通过 equals()
和 hashCode()
保证唯一性)。比如用 HashSet
存用户点赞的 ID,确保一个用户只能点赞一次。
(注:Map 才是 key-value 结构,Set 可理解为 “只存 key 的 Map”,如 HashSet
底层就是用 HashMap
的 key 实现的。)
还有你使用了什么样的数组集合聊聊是怎么用的
使用map,用map包map
聊聊ArraryList
底层是动态扩容的数组,初始容量 10,满了后自动扩容为原来的 1.5 倍。
只适合查询不适合插入删除(除非在首尾)
看你的简历了解StringAop,简单聊聊什么是StringAop,Aop最基础的几个点是什么
Spring AOP(面向切面编程):通过 “横切” 思想,在不修改原有代码的情况下,给方法动态添加通用功能(如日志、事务、权限校验)。
- 切面(Aspect):封装通用功能的类(如日志切面类)。
- 通知(Advice):切面中的方法,定义 “何时”“做什么”,包括:
- 前置通知(@Before):方法执行前;
- 后置通知(@After):方法执行后(无论是否异常);
- 返回通知(@AfterReturning):方法正常返回后;
- 异常通知(@AfterThrowing):方法抛异常后;
- 环绕通知(@Around):方法执行前后都能干预(最灵活)。
- 连接点(JoinPoint):可能被拦截的方法(所有方法都可能是连接点)。
- 切入点(Pointcut):具体被拦截的方法(通过表达式指定,如
execution(* com.xxx.service.*(..))
)。 - 目标对象(Target):被代理的原始对象(如业务 Service)。