华OD,Java面经,东莞
机试 280
背景:
从去年开始,学校不是目标院校,去年9月份投了云计算,面试通过,后面没hc了,就没能进去(投递的部门的HR)。
今年2月裁员,就又投一次(重新投递的栗栗),这次是数字能源,4-19收到offer,确定了4-27入职。
没工作两月,自我焦虑挺折磨人的,当前环境也确实找工作不容易。
2023-03-31 一面
1、有哪些集合
- conlletion: set、list(arraylist, linkedlist) 、queue
- map: hashmap、hashtable、treemap
2、什么情况下用什么集合
1、改查选择 ArrayList,因为数组能够随机访问,效率高
2、如果有先进先出特点的,就用queue
3、如果数据是一对一对的,可以考虑map
4、如果要求数据不重复,可以用set
3、多线程集合使用依赖哪些类
- 1、hashtable
- 2、concurrenthashmap
- 3、vector
- 4、stack
4、多线程下操作HashMap会有什么问题,这样通过什么类来实现
1、1.7的就会出现扩容死链,链表next指针死循环
2、1.7和1.8都容易出现数据错乱、丢失数据
3、可以使用线程安全的集合,例如hashtable、concurrenthashmap、stack
5、多线程实现方式,比较,使用场景
继承Thread类,实现Runnable接口,实现Callable接口
比较: 实现Runnable 接口比继承Thread 类的方式更好,避免由于Java单继承带来的局限性
使用场景:后台任务;异步处理;分布式计算
6、有哪些锁,怎么避免死锁
公平锁、非公平锁、可重入锁、独享锁、共享锁、互斥锁、乐观锁、悲观锁
避免死锁:
1、加锁顺序(线程按照一定的顺序加锁)
2、加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
3、死锁检测
7、sql 怎么优化
插入优化
- 1、合并sql语句
- 2、在事务中进行插入处理
- 3、数据有序插入
查询优化
- 1、尽量使用索引,避免全表扫描 - 避免where 语句中判断null、使用不等于比较、使用or、使用函数等操作,这会导致全表扫描
- 2、不要用select * ,用具体字段替代
- 3、用 exists代替 in
- 4、尽量使用表变量来代替临时表
- 5、避免频繁创建和删除临时表
8、生产问题排查,举例说明
生产环境有相关监控,监控cpu、内存等信息,当过高时就会发送告警邮件
比如内存使用过高导致cpu满载
1、通过top命令查看负载高的cpu进程
2、进一步查找负载高的进程中的线程
3、然后导出内存日志,分析堆栈情况
最后一道算法题
内容:给定一组名字字符串,名字和名字之间逗号隔开, 按照票数高低的顺序输出名字空格票数,相同票数的按照字母升序输出 输入:xiaoming,xiaozhang,xiaoli,zhangsan,xiaoming 输出:xiaoming 2,xiaoli 1, xiaozhang 1,zhangsan
构建一个实体类数组(没构建成功,经过面试官提示,加一个判断完成),然后自定义排序,结果通过
2023-04-01 技术二面
先一道算法题
给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。 示例 2: 输入:target = 4, nums = [1,4,4] 输出:1 示例 3: 输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0 提示: 1 <= target <= \(10^9\) 1 <= nums.length <= \(10^5\) 1 <= nums[i] <= \(10^5\)
双重循环暴力法通过,面试官提示可用前缀和优化
1、运维、开发、测试 更喜欢哪个?
开发,比较有挑战性
2、java相关的技术了解哪些?
redis、rabbitmaq
3、项目中什么场景使用rabbitmq?
异步处理
场景:用户注册,用手机号注册,填写信息后发送短信验证码,填写验证码后注册成功。
应用解耦
场景:用户下单后,订单系统需要通知库存系统
4、rabbitmq 和 kafka的 区别
没说上来
5、数据库有了解嘛?说一下mysql索引?
1.主键索引 2.唯一索引 3.普通索引 4.空间索引 5.全文索引
6、在做数据库查询时有没有遇到过性能瓶颈?
select 字段和索引顺序不一致,导致oom
7、怎么做优化
查询优化: 尽量使用索引,避免全表扫描
避免where 语句中判断null、使用不等于比较、使用or、使用函数等操作,这会导致全表扫描
插入优化:
1、合并sql语句
2、在事务中进行插入处理
3、数据有序插入
8、mysql 中用 #{} 和 ${} 的区别?
#{}是预编译、是一个占位符
${}是字符串、是一个拼接符。
使用#{}可以有效地防止SQL注入,能够提高系统安全性
10、java设计模式有了解嘛,说一下?
⼯⼚模式、单例模式、匹配者模式
11、什么情况适合用单例模式?
1、有频繁实例化然后销毁的情况,也就是频繁的 new 对象,可以考虑单例模式;
2、创建对象时耗时过多或者耗资源过多,但又经常用到的对象;
3、频繁访问 IO 资源的对象,例如数据库连接池或访问本地文件;
12、对springBoot 依赖注入有了解嘛?
依赖注入是指在Spring创建对象的过程中,把对象依赖的属性注入到对象中
不用自己去创建对象,但必须描述怎么创建对象,在配置文件中配置哪些组件需要哪些服务
会有ioc容器自动将它们装配到一起
二面发挥不好
2023-4-4 HR面:
先自我介绍,然后问了下工作情况和一些基本信息,最后问了期望薪资
2022-4-6 技术三面:
先一道算法题
/** * 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 * 数组中的每个元素代表你在该位置可以跳跃的最大长度。 * 判断你是否能够到达最后一个下标。 * <p> * 示例 1: * 输入:nums = [2,3,1,1,4] * 输出:true * 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。 * <p> * 示例 2: * 输入:nums = [3,2,1,0,4] * 输出:false * 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。 */
dfs 遍历,找不到就回退上一步,继续找,直到找到,面试官后面给一组用例,全部通过
然后问一些八股文,然后深入到项目,具体问题忘了
2023-4-13 主管面
主管忙,比较难约,过了一周才面上
问些个人信息、离职原因、之前工作相关、加班的一些问题