面试题day15
转转
2021.8.31日 技术一面(约50min)
-
自我介绍
-
介绍一下项目?
-
Spring的两个核心。说一下
ioc 控制反转,将创建对象权利交给ioc容器
aop 面向切面编程 扩展性高 常见于日志
-
AOP主要用到的Java的哪些技术呢?
动态代理,jdk动态代理/cglib
-
MySQL的索引有哪些了解?
主键索引、非主键索引、唯一索引
-
主键索引和普通索引有什么区别?
innodb 主键索引叶子结点的数据、非主键索引叶子结点为主键id
myisam 主键索引唯一、非主键索引不唯一
-
事务的隔离级别有哪些?
ru rc rr s
-
不同的隔离级别解决了哪些问题?
rc 脏读 rr 不可重复读 s 幻读
-
可重复读有没有解决这个幻读的问题?
innodb 解决
-
可重复读如何解决不可重复读的一个问题?
mvcc
-
ACID四个特性有了解过吗?
原子性、持久性、隔离性、一致性
-
怎么保证这ACID四个特性?
undo log、redo log、mvcc+锁
-
MVCC有没有起到作用?
-
介绍一下集合
list set map
-
HashMap是线程安全的还是线程不安全的?
线程不安全
-
HashMap线程不安全会出现什么问题?
死循环、put覆盖
-
有没有了解过线程安全的HashMap?
ConcurrentHashMap和hashtable
-
ConcurrentHashMap怎么保证线程安全?
1.7 segment+reentrantLock entry
1.8 cas+synchronized node
-
有没有实际用过多线程的东西?
文件上传
-
线程的创建有哪几种方式?
Thread类、Runable接口、Callable接口
-
Thread类和Runable接口的最大区别是什么?
单继承、多实现
-
线程池最核心的是哪些?
核心线程数、最大线程数、阻塞队列、存活时间、时间单位、拒绝策略、线程工厂
-
线程池的执行顺序是怎么样的呢?
核心线程数->阻塞队列->最大线程数->拒绝策略
-
运行的时候,核心线程数能不能修改?
可以修改,setCorePoolSize(),在运行期线程池使用方调用此方法设置 corePoolSize 之后,线程池会直接覆盖原来的 corePoolSize 值,并且基于当前值和原始值的比较结果采取不同的处理策略。
-
JVM的内存结构?
堆、方法区 虚拟机栈、本地方法栈、程序计数器 直接内存
-
对象在哪个区?
堆
-
Class文件在哪个地方存?
方法区
-
垃圾回收会发生在哪几个区域?
堆、方法区、栈(线程执行完毕)
-
OOM会发生在哪个区域?
堆 创建太多对象 jmap
-XX:+HeapDumpOnOutOfMemoryError
和-XX:HeapDumpPath
栈 递归 jstack headdumpon
-
虚拟机栈会不会溢出?
会
-
GC算法有没有了解过?
分代、清除、复制、压缩
-
怎么确定一个对象是垃圾?
引用计数法、可达性分析
-
哪些对象可以做为CG Root?
虚拟机栈、本地方法栈、静态变量、常量
-
Java有哪些锁?
公平锁、非公平锁
乐观锁、悲观锁
自旋锁、偏向锁、轻量级锁、重量级锁
-
有没有除了Synchronize和ReentrantLock之外还有没有可以上锁的?
cas、volatile
-
volatile怎么理解?
保证原子性、禁止指令重排
-
类加载器有哪些?
启动类加载器、扩展类加载器、应用程序加载器、自定义加载器
-
双亲委派模型。
类加载器接收到类加载请求,向上传递父类加载器尝试加载,层层递归,失败后才会由自身加载
-
怎么打破双亲委派模型?
- https://www.jianshu.com/p/9b2d43c9a09a
- tomcat之所以造了一堆自己的classloader,大致是出于下面三类目的:
- 一个web容器可能需要部署两个应用程序,不同的应用程序可能会依赖同一个第三方类库的不同版本,不能要求同一个类库在同一个服务器只有一份,因此要保证每个应用程序的类库都是独立的,保证相互隔离。
- web容器也有自己依赖的类库,不能于应用程序的类库混淆。基于安全考虑,应该让容器的类库和程序的类库隔离开来。
- web容器要支持jsp的热部署。
-
类加载的过程,Class文件
加载 验证 准备 解析 初始化
-
有没有自己使用过算法。
-
有哪些排序?
-
快排的原理。时间复杂度,最坏情况。
快速排序实现的重点在于数组的拆分,通常我们将数组的第一个元素定义为比较元素,然后将数组中小于比较元素的数放到左边,将大于比较元素的放到右边,这样我们就将数组拆分成了左右两部分:小于比较元素的数组;大于比较元素的数组。我们再对这两个数组进行同样的拆分,直到拆分到不能再拆分,数组就自然而然地以升序排列了。
- 最坏情况就是每一次取到的元素就是数组中最小/最大的,这种情况其实就是冒泡排序,时间复杂度O(n2)
- 平均时间复杂度为O(nlog2n)
-
TCP连接和断开。
-
三次握手过程
syn x
ack x+1 syn y
ack y+1
-
TCP连接CloseWait和TimeWait状态
对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT,此时我方要调用close()来使得连接正确关闭。
我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。
-
网络的拥塞控制有没有了解过?
慢开始、快重传、拥塞避免、快恢复
-
输入一个网址的调用流程。
缓存 dns ip tcp https
-
有没有了解过HTTPS
非对称通信加密对称通信密钥
-
HTTPS的加密算法是哪些?
非对称通信 rsa
对称通信 aes
-
你感觉你比较擅长哪方面?
-
有没有刷过题?
-
你觉得动态规划的关键是什么?
转转
021.9.2日 二面(约35min)
-
自我介绍
-
介绍一下项目
-
数据库索引
b+树
-
单核情况下,多线程为什么会比单线程的情况下去使用情况会更好?
多线程技术使程序的响应速度更快,因为用户界面可以在进行其他工作的同时一直处于活动状态。
适合io大的情况
-
TCP协议了解吗?
-
HTTP长连接还是短连接?
长连接 keep-alive
http长连接
tcp长连接
-
服务端主动发起关闭还是客户端主动发起关闭TCP?
客户端
-
心跳机制说一下?
检测存活
-
单例模式说一下。
私有属性、私有构造、公开get方法
懒汉 调用方法创建对象
饿汉 创建类创建对象
-
线程安全的单例模式是怎么样的?
双重校验锁
-
那为什么要使用volatile呢?
防止指令重排
-
为什么要使用双段锁呢?
加锁前判断,提高性能,避免不必要的加锁
加锁后判断,防止多次创建可能多个线程进入if条件,创建实例前不加判断的话,会线程安全的创建两个实例
-
算法题:8个人乒乓球比赛,A赢B,B赢C,可以默认A赢C。那么最少比赛多少次可以获得冠亚季军
-
你怎么学习技术?
-
你觉得什么最重要?
-
你在团队开发的项目里面学到了什么?