2021年2月11日至2021年2月17日面经分析
- 2021年2月11日至2021年2月17日面经分析
- Java后端实习生面经分享
- Mybatis用过的命令
- Mybatis注解和xml区别
- 请描述一下JMM
- 线程之间的通讯方式?
- volatile能有什么作用,为什么能只保证可见性却不保证原子性?
- 分布式锁
- 是否了解索引,简要描述
- 各种索引的区别
- 集合类都有什么
- ArrayList和LinkedList的区别,各自优缺点,适用场景,实现方式
- 常用算法都会啥
- 排序算法,请描述快速排序和归并排序的思路
- 是否了解JUC,请讲出有什么JUC组件
- 线程池是否理解,都有哪些参数
- 线程池的核心线程数,最大线程数,队列之间的关系。new新的线程是怎样的逻辑?
- 上来就直接:你说一下擅长的框架/组件/工具……
- 熟悉JUC中的一个类
- 说一下读写锁ReadWriteLock。如果线程A已经有读锁,那么线程B能否获得写锁?
- 线程进入写锁的前提条件
- linux修改文件权限的命令。chmod+751 具体是什么权限?
- 说一下mysql数据库的索引类型
- 联合索引可以只用来查询一个列吗?为什么?
- 说一下spring中bean的四种作用域?他们分别在什么情况下起作用?
- 你有用过ElasticSearch?说一下里面的索引方法。倒排索引和关系型数据库的索引有什么区别?
- 一个数据库语句查询太慢,你会从哪些方面去进行优化?
- 有用过设计模式吗?说一下都有哪些常用的。
- 编程题:给定一个数组,返回第二大的那个数。
- 请说一下spring事务的7中传播行为
- 说一下spring的AOP机制。
- AOP的具体底层是怎样实现的?
- 说一下HashMap
- HashMap中的两个参数是怎样影响这个容器的?
- String,StringBuilder,StringBuffer的区别是怎样的。
- 说一下CMS。(标记清除垃圾回收[算法]())
- 说一下B+树
- B+树不适用的场景是什么?
- 说一下都有哪些Java容器。
- 怎样判断一个单向链表是否有环?
- 请问这个句子是否有错,如果错了的话错在哪里? `List ls = new ArrayList();`
- 说一下java的类加载机制
- 说一下AOP。知道AOP的底层实现是怎样的吗?
- 说一下动态代理
- 说一下HashMap
- HashMap中为什么要用红黑树来代替链表?
- 两个线程交替打印12345...和ABCDE...怎么做?
- 说一下TCP的连接过程
- 说一下TCP和UDP的区别吧。他们都分别用于什么场景
- 知道HTTP和HTTPS的区别吗?
- 来说一下Mysql的事务都有哪些
- mysql的隔离级别都有什么
- 说一下mysql索引的结构
- 我们有一个表t_score,里面有一些字段 stu_id sub_id score 分别代表学生ID,课程ID,得分,请查询总分排名3-5的学生
- 我们有一个m行n列的二维整型数组,现在需要找出从[0,0]到[m,n]的最短路径。路径只能向下或者向右。
- 2020总结--两次辞职,三次跳槽
- 字节基础架构-内推成功
2021年2月11日至2021年2月17日面经分析
Java后端实习生面经分享
Mybatis用过的命令
这道题目问的应该是用过哪些Mybatis的标签,Mybatis的标签有:
- insert
- update
- select
- delete
- foreach
- sql
- where
- if
- resultset
- paramaterset
Mybatis注解和xml区别
Mybatis使用注解来引入SQL,比较方便,不需要使用XML文件。但是缺点在于,每次修改之后都需要重新编译。使用XML,就比较麻烦一些,增加了Mapper的XML文件之后,需要修改配置。好处就在于方便修改,修改之后不需要重新编译。
请描述一下JMM
JMM是Java Memory Model的简称,表示为Java内存模型。
所有的变量都保存在主内存中,每个线程拥有自己的工作内存。一个线程对于变量的操作必须在工作内存中进行,所以当一个线程要操作变量时,需要先将变量从主内存中拷贝到工作内存。操作结束之后再将工作内存中的变量刷回到主内存中。所以一个线程无法看到另外一个线程工作空间中的变量拷贝。
线程之间的通讯方式?
全局变量
volatile能有什么作用,为什么能只保证可见性却不保证原子性?
volatile能够保证可见性和有序性,但是不能保证原子性。
volatile在字节码getfield、setfield上使用了内存栅栏,所以可以保证工作空间中的变量会被强制刷回主内存,且保证其他线程的工作空间中的变量过期。所以保证了可见性。但是volatile没有对操作进行上锁,所以它是没有保证原子性的功能的。
分布式锁
分布式锁可以使用redis的setenv实现。
TODO
是否了解索引,简要描述
索引是使用哈希算法或者B+树算法,重新组织数据,以达到快速查找数据目的的一种辅组结构。索引根据算法的不同,可以分为哈希索引和B+树索引,哈希索引能够用于等于查找,时间复杂度可达到O(1)。B+树索引可以用于范围查找,时间复杂度为O(lgn)。
各种索引的区别
根据不同的分类可以分成多种索引。
根据哈希算法的不同,可以分为哈希索引和B+树索引。哈希索引用于等于不等于比较,B+树除了用于等于不等于比较,还可以用于范围比较。
还可以分为聚簇索引和非聚簇索引。一个表只有一个聚簇索引,一般为主键索引。可以用拥有多个非聚簇索引。
集合类都有什么
实现Collection接口的有ArrayList、LinkedList、HashSet、ArrayDeque等等
实现Map接口的有HashMap、TreeMap、HashTable、ConcurrentHashMap等
ArrayList和LinkedList的区别,各自优缺点,适用场景,实现方式
最主要的区别在于底层存储结构的不同,ArrayList的底层存储时数组,数组的特点是访问效率高,时间复杂度O(1)。但是数组长度是固定的,所以在达到阈值时,需要扩容。LinkedList的底层存储时链表,链表的特点是添加删除方便,时间复杂度是O(1),但是查找的时间复杂度是O(n)。
所以如果添加删除频繁的,建议使用LinkedList,如果查找频繁的,建议使用ArrayList。
常用算法都会啥
排序算法:快排、堆排序、归并排序、冒泡排序、插入排序
查找算法:二分查找
排序算法,请描述快速排序和归并排序的思路
快排的思路:找一个基准值,小于基准值和大于基准值的数据分成两部分。再对这两部分结果重复此操作。
归并排序思路:将待排序的内容一分为二,对一分为二的内容递归进行归并排序,得到两个有序的结果,再合并两个有序结果,得到最终结果。
是否了解JUC,请讲出有什么JUC组件
atomic
lock
ConcurrentHashMap
线程池
线程池是否理解,都有哪些参数
线程池就是一个池化技术,线程池中维护了多个线程,方便多线程中获取线程。减少了资源的获取和释放,提高了性能。
有7个核心参数:
- 核心线程数
- 最大线程数
- 线程工厂
- 空闲时间
- 空闲时间单位
- 拒接策略
- 工作队列
线程池的核心线程数,最大线程数,队列之间的关系。new新的线程是怎样的逻辑?
在线程池中的线程数量未达到核心线程数时,每提交一个任务,线程池会趋向于新建一个线程。在线程池中的线程数大于核心线程数,却小于最大线程数时,提交任务时,会将任务添加到工作队列。如果工作队列添加失败,则尝试新建一个线程。如果新建一个线程失败,则调用拒接策略。
上来就直接:你说一下擅长的框架/组件/工具……
集合组件
熟悉JUC中的一个类
ConcurrentHashMap。使用了分段锁的概念,在保证线程安全的同时,保证了效率。
说一下读写锁ReadWriteLock。如果线程A已经有读锁,那么线程B能否获得写锁?
读写锁ReadWriteLock分为读锁和写锁,读锁可以重复获取,写锁不可以。当线程A已经拥有读锁,线程B不可以获取写锁。
线程进入写锁的前提条件
写锁跟读锁和写锁都相斥,所以条件是:
- 没有其他线程获取读锁
- 没有其他线程获取写锁
linux修改文件权限的命令。chmod+751 具体是什么权限?
修改权限的命令是:chmod
chmod+751表示给文件拥有者读写操作权限,给文件所在的群组读和操作的权限,给其他人操作的权限。
说一下mysql数据库的索引类型
Mysql数据库根据不同分类可以分为不同的索引类型。
根据是否为聚簇索引,分为聚簇索引和非聚簇索引。
根据使用算法,分为哈希索引和B树索引。
联合索引可以只用来查询一个列吗?为什么?
可以,按照最左匹配原则,联合索引可以匹配联合索引中最左侧的列。
说一下spring中bean的四种作用域?他们分别在什么情况下起作用?
- singleton
- prototype
- session
- require
singleton表示Bean是单例的,什么时候都可以起作用,获取到的是同一个对象。
prototype表示是原型模式,获取到的不是同一个对象。
session表示Bean在一个session中获取到相同的对象
require表示Bean是一个请求中有效。
你有用过ElasticSearch?说一下里面的索引方法。倒排索引和关系型数据库的索引有什么区别?
TODO
一个数据库语句查询太慢,你会从哪些方面去进行优化?
- 通过执行计划,判断是否没有用到索引。若没有索引,可以考虑建立索引
- 判断是否那个表数据太多 ,若太多数据,考虑对表进行分表分库。
有用过设计模式吗?说一下都有哪些常用的。
用使用过。
- 单例模式
- 工厂模式
- 代理模式
- 观察者模式
- 责任链模式
编程题:给定一个数组,返回第二大的那个数。
请说一下spring事务的7中传播行为
说一下spring的AOP机制。
Spring的AOP机制提供了一种将非业务代码从业务代码抽离出来成为一个切面的办法。所以AOP叫做面向切面编程。一般在代码中日志、统计信息等可以使用AOP功能。其底层实现使用了代理模式。
AOP的具体底层是怎样实现的?
AOP在Spring中是使用BeanPostProcessor和动态代理实现的。
说一下HashMap
HashMap使用哈希算法保存数据的一种结构,其获取结果的平均时间复杂度为O(1)。HashMap的底层实现是数组+链表+红黑树。在链表长度等于8时,会转变为红黑树,但这个很难出现的一种情况。
HashMap中的两个参数是怎样影响这个容器的?
HashMap的两个参数分别为容量和负载因子。容量表示HashMap中数组的长度,也就是容量数据的大小。而负载因子表示的是容量的是否比例。例如,容量乘于负载因子等于阈值,一旦HashMap中的数据大小等于负载因子,HashMap就会发生扩容。
String,StringBuilder,StringBuffer的区别是怎样的。
String及其底层数据data,都使用了final进行修饰,表示了String变量是不能被修改的。而StringBuffer和StringBuilder都是可变字符序列。StringBuffer中大部分方法都使用synchronized修饰,所以StringBuffer是线程安全的,StringBuilder不是线程安全的,所以效率要高一些。
说一下CMS。(标记清除垃圾回收算法)
TODO
说一下B+树
B+树不适用的场景是什么?
说一下都有哪些Java容器。
怎样判断一个单向链表是否有环?
使用快慢指针。问:如果两个指针的步长分别是2和4的话能否实现判断有环?思考后回答不行,因为在极限状态下如果环中只有2个节点,且进入环时两个指针分别在两个节点,那么无论怎样循环都不会相遇==》面试官点头
请问这个句子是否有错,如果错了的话错在哪里? List ls = new ArrayList();
说一下java的类加载机制
Java类的加载机制是双亲委派机制,即一个类加载器接收到一个类的加载请求,他首先判断自己是否已经加载过这个类,如果没有加载过,则将这个类的加载请求转给它的父类加载器,所有的类加载器都是如此,直到到达顶层的类加载器,也就是引导类加载器。只有父类加载器不能加载类时,子类加载器才尝试去加载类。
说一下AOP。知道AOP的底层实现是怎样的吗?
BeanPostProcessor + 动态代理
说一下动态代理
动态代理是代理模式的一种,动态表示其代理实现是动态生成的。动态代理的实现通常使用JDK的Proxy和CGLIB。
说一下HashMap
HashMap的底层数据实现是数组+链表+红黑树。
HashMap中为什么要用红黑树来代替链表?
在发生了多次哈希碰撞时,使用红黑树的效率对比链表更加稳定,因为其新增、修改、删除和查找的时间复杂度都是O(lgn)
两个线程交替打印12345…和ABCDE…怎么做?
两个线程 交替打印的操作可以借助锁来实现。
public class TwoThreadsAlternatePrint {
private static final ReentrantLock lock = new ReentrantLock();
private static Condition c1 = lock.newCondition();
private static Condition c2 = lock.newCondition();
/**
* 解题思路:使用显示锁
*
* @author freedom wang
* @date 2021-02-22 21:47:36
*/
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
try {
lock.lock();
for (int i = 0; i < 27; i++) {
System.out.println(i);
c1.signal();
c2.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
lock.lock();
for (char i = 'a'; i < 'z'; i++) {
System.out.println(i);
c2.signal();
c1.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}).start();
}
}
说一下TCP的连接过程
TCP的连接过程为三次握手过程。
客户端向服务器段发起第一次握手,客户端进度SYN_SENT状态。
第一次握手中,SYN控制位为设置为1,序号被设置为一个随机的初始序号。
服务器端接受到第一次握手,向客户端返回了第二次握手,服务器端进入到SYN_RECV状态。
第二次握手中,SYN和ACK控制位被设置为1,其中确认号为第一次握手的序号值+1,序号值为随机值。
客户端接受到第二次握手,向服务器端发送第三次握手,客户端进入到ESTABLISHED状态。
说一下TCP和UDP的区别吧。他们都分别用于什么场景
知道HTTP和HTTPS的区别吗?
来说一下Mysql的事务都有哪些
我猜这道题目问的其实是Mysql事务的特性有哪些?
ACID
- 原子性
- 一致性
- 隔离性
- 持久性
mysql的隔离级别都有什么
- 读未提交
- 读已提交
- 可重复读
- 串行化
说一下mysql索引的结构
结构有:哈希和B+树
我们有一个表t_score,里面有一些字段 stu_id sub_id score 分别代表学生ID,课程ID,得分,请查询总分排名3-5的学生
SELECT stu_id FROM t_score LIMIT 3,2 ORDER BY score DESC
我们有一个m行n列的二维整型数组,现在需要找出从[0,0]到[m,n]的最短路径。路径只能向下或者向右。
解:这是一个[动态规划]()题目。
2020总结–两次辞职,三次跳槽
对于ACID的理解
- 原子性:一次事务中的操作要么都成功,要么都失败
- 一致性:一次事务操作前后的数据保持一致
- 隔离性:一个事务不会对另外一个事务造成影响
- 持久性:事务一旦提交,事务的操作结构就会被永久保存。
B树,b+树
B树是平衡的m路搜索树,我们所知道的2-3-4树就是4路的B树。
B+树在B树的基础上发生了改变,非叶子节点只有索引作用。
又问了mysql语句的原子性怎么实现的(没想过)
问了下Redis,mysql数据一致性怎么解决?
Redis为啥是单线程的?
因为Redis是基于内存的操作,性能的瓶颈不在于CPU,而通常在于内存。所以就使用单线程来设计。
然后又问了下GC算法,年轻代,老年代为什么那样设计?有啥好处?
垃圾回收的算法有:标记清理法、标记整理法、分代收集法、复制算法
年轻代中对象创建很多,死亡也很多,所以使用复制算法。老年代中对象死亡较少,所以使用标记清理或者标记整理算法。之所以针对年轻代和老年代使用不同的垃圾回收算法,是根据效率来取决的。