商汤科技Java一面(2021.12.8)
Posted Panda_Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了商汤科技Java一面(2021.12.8)相关的知识,希望对你有一定的参考价值。
1. 总体感觉
百分之90以上都来自于八股文,没有手撕算法。
感觉面试的Java岗位的都有套路,含Java基础,多线程,Spring, Mybatis, JVM。
2. Java基础
- Java中的多态理解
- protected 和 缺失修饰的区别
protected :只能是本类和子类可以访问
不加任何修饰的关键字:本类和同一个包下的类都可以访问
- Hashmap 中为什么是线程非安全的?链接: link.
在hashmap做put操作的时候会调用到以上的方法。现在假如A线程和B线程同时对同一个数组位置调用addEntry,两个线程会同时得到现在的头结点,然后A写入新的头结点之后,B也写入新的头结点,那B的写入操作就会覆盖A的写入操作造成A的写入操作丢失. - 如何设计一个哈希函数?
- 在hashMap中put一个键值对,经历了哪些流程?链接: link.
1 判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容;
2 根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新
建节点添加,转向⑥,如果table[i]不为空,转向③;
3 判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向④,
这里的相同指的是hashCode以及equals;
4 判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则
直接在树中插入键值对,否则转向5;
5 遍历table[i],判断链表长度是否大于8,大于8且数组长度大于等于64的话把链表
转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历过程中若
发现key已经存在直接覆盖value即可;
6 插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,
如果超过,进行扩容。
3.mysql
- 解释一下什么原子性
- 原子性和事务有什么区别
- Java中执行i++ 是不是原子操作? 为什么?(不是,1读内存到寄存器,2在寄存器自增,3写回内存)
4. 多线程
- synchornized使用场景: A类有一个方法f, (其中方法f 被synchornized修饰),方法f被 A类的两个实例对象a1 和a2分别调用,会怎么样?
- synchornized 锁升级是什么样的?链接: 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁.
- 两个线程依次轮流按需打印100 多少种方法实现?
- 线程池参数有哪些?
5. Spring
- 前置处理器、@autowired 、后置处理器的执行流程链接: link.
- bean的生命周期(实例化、初始化、使用、销毁)
- @autowired 和 @resource 区别
- @autowired 放在属性上和放在方法上有什么区别链接: link.
6. JVM
- 类加载的执行流程
- 双亲委派机制
- 垃圾回收算法
- GC root 存在哪些地方
7. Mybatis
1. #与"$"区别?哪个效率高?为什么 # 具有安全性有时还会选择$?
以上是关于商汤科技Java一面(2021.12.8)的主要内容,如果未能解决你的问题,请参考以下文章