Java总结
Java 集合
arraylist和LinkedList的区别?
arraylist:数组 查询快 扩容 复制
LinkedList: 链表 插入、删除快
set:hashset和treeset的实现,要如何排序?
hashmap、concurrenthashmap?
hashmap:
1.7:数组+链表
1.8 数组+链表+红黑树(扩容:链表长度大于8同时数组容量大于64,缩容:链表长度小于6)
尾插法
多线程会产生的问题:数据覆盖、红黑树环形链
concurrenthashmap:
1.7 :reenterlock+segment entry(默认16个)效率低
1.8:cas+ synchronize node 锁粒度小 bug:sizeCtl 、 computeIfAbsent、 扩容部分的sweep recheck
hashtable
线程安全、效率低
Java并发
synchronize
三种使用:普通方法、静态方法、代码块
保证并发的有序性、可见性和原子性
执行monitorenter获取锁、执行monitorexit释放锁 执行monitorexit异常释放锁
锁膨胀方向: 无锁 → 偏向锁 → 轻量级锁 → 重量级锁 (此过程是不可逆的)
偏向锁:同一个线程多次获取 多次的获取锁和释放锁带来了很多不必要的性能开销和上下文切换
轻量级锁:cas
重量级锁:阻塞 互斥量 mutex(用户态和内核态切换)
volatile
可见性 有序性 jmm模型 内存屏障 防止指令重排
AQS
CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列
同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,
同步器会将当前线程以及等待状态等信息构造成为一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,
当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。
CAS
aba问题、
Java线程池
- 线程有几种创建方式?各自有啥区别?注意Runnable接口
- 线程池有啥好处
- 线程池不是提供了几种默认的方法吗?哪几个?
- 线程池的核心参数哪几个?包括拒绝策略
- 核心线程数和最大线程数一般定多少合适?依据是什么?
- 核心线程数和最大线程数的作用
- ThreadLocal了解吗
Java基础
object类常用方法
wait、notify、notifyall、clone、equal、tostring、finalize、
wait和sleep区别?
wait和sleep区别
Throwable异常
运行时异常(RuntimeException):
- NullPropagation:空指针异常
- ClassCastException:类型强制转换异常
- IllegalArgumentException:传递非法参数异常
- IndexOutOfBoundsException:下标越界异常
- NumberFormatException:数字格式异常
编译时异常:
- ClassNotFoundException:找不到指定 class 的异常
- IOException:IO 操作异常
Error:
- NoClassDefFoundError:找不到 class 定义异常
- StackOverflowError:深递归导致栈被耗尽而抛出的异常
- OutOfMemoryError:内存溢出异常
Java 探针
Java Agent 能够在加载 Java 字节码之前进行拦截并对字节码进行修改;在 Jvm 运行期间修改已经加载的字节码;
IO
BIO、NIO、AIO
JVM
Java内存模型
Java内存结构(运行时数据区)
注意:永久代改成元空间
垃圾回收
垃圾回收器、垃圾回收算法 cms G1 zgc
串行:serial + serial old
并行:Parallel Scavenge + Parallel Old
并发标记清除收集器: ParNew + CMS + Serial Old
CMS:初始标记(STW)、并发标记、重新标记(STW)、并发清除。
缺点:标记清除算法无法整理空间碎片、由于并发进行,CMS在收集与应用线程会同时会增加对堆内存的占用
G1:初始标记(STW)、根分区扫描、并发标记、重新标记(STW)、清除垃圾
卡表和RSET
垃圾回收算法:
- 标记清除
- 标记整理
- 复制
- 分代
- 三色标记
永久代为什么改成元空间?
避免OOM异常、更深层的原因还是要合并HotSpot和JRockit的代码
JVM性能调优?
性能分析工具:jstack、jmap
安全点和STW的理解
JUC
AQS
使用了clh队列
ReentranLock
Automic
CountDownLatch(闭锁)
CyclicBarrier(栅栏)
Semaphore(信号量)
FutureTask
ReentrantReadWriteLock
ForkJoinPool
Spring
aop、ioc
AOP:
1、采用动态代理技术,利用拦截方法的方式,对该方法进行装饰,以增强原有对象的方法。具体实现技术有 JDK 动态代理基于接口代理和 cglib 基于类代理的字节码提升。
2、采用静态织入的方式,引入特定的语法创建"切面",从而使得编译器可以在编译期间织入有关"切面"的代码。
spring mvc 流程
常用注解?
@ResponseBody的作用其实是将java对象转为json格式的数据
@DependOn
@ConfigurationProperties
@Qualifier
@Profile
spring 循环依赖解决方法
原型模式下的循环依赖是无法无法解决的
构造方法注入 + 单例模式,仅可以通过延迟加载解决
setter 方法和属性注入 + 单例模式下,可以解决
三级缓存(Map):一级缓存(成品)二级缓存(半成品)三级缓存(bean工厂)
不提前创建好代理对象,在出现循环依赖被其他对象注入时,才提前生成代理对象(此时只完成了实例化)。
这样在没有循环依赖的情况下,Bean还是在初始化完成才生成代理对象
spring事务
编程式事务、声明式事务
设计模式
单例模式、工厂模式、
spring 支持几种 bean 的作用域?
singleton、prototype、request、session、globalsession
过滤器和拦截器区别?
①:拦截器是基于java的反射机制的,而过滤器是基于函数的回调。
②:拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。
③:拦截器只对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④:拦截器可以访问action上下文、值、栈里面的对象,而过滤器不可以。
⑤:在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥:拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
Spring文件上传和下载怎么做?
Spring Boot
特点
约定优于配置的思想、开箱即用和自动装配
SpringBoot的核心功能
起步依赖、自动配置
MySQL
事务特性
隔离级别
mvcc
间隙锁 临键锁(行锁+间隙锁)
日志
redlog、undolog、binlong、solwquerylog、errorlog、
存储引擎
innodb、myisam
索引
索引为什么用b+、聚簇和非聚簇、回表查询、索引覆盖、索引下推、最左前缀、索引失效
复合索引使用的时候要注意什么?注意顺序,从左到右
重复度高的比如:性别:为啥不建议加索引?
Mysql分页
分页要注意什么?深度分页? 如何解决深度分页?
MySQL优化
分布式
cap理论
分布式事务
- 两阶段
- 三阶段
- 本地消息表
- TCC
- SEATA框架
分布式锁
- Redis
- zk
- 数据库
微服务
nacos
dubbo
中间件
Redis
- 数据结构、底层是基于什么实现的?比如SDS、embStr、跳跃表(相比平衡二叉树有啥优点?),让你做一个排行榜用啥数据结构?
- redis用的是单线程?那为什么还这么快?单线程这么快了,为啥还要引入多线程?哪里用到了?
- redis的分布式锁的实现:加锁和解锁;一种自己实现,怎么实现?一种是用Redisson框架?它底层是咋实现的?
- lua表达式
- 加锁的时候一般都有一个过期时间防止死锁;那如果业务还没处理完,锁就过期了,如何解决?redisson里面的watch dog帮你解决了,它是咋实现的?要你自己实现一个你怎么实现?
- 布隆过滤器和布谷鸟过滤器(布隆的升级版)
- Redis的持久化方式有哪些?默认是哪个?一般怎么使用?二者区别?
- Redis的过期策略?过期了立马删除吗?
- Redis的淘汰策略?内存不够了怎么办?
- Redis的哨兵机制?Redis 哨兵机制是如何工作的? - 知乎
- red lock解决了什么?
Rocketmq
有哪几种使用方式
Zookeeper
Kafka
定时调度、分布式定时调度
其他
幂等性如何保证
接口的幂等性是啥?如何保证?mq的幂等性如何保证?
Http协议
定义
RestFul接口规范
Tcp和Udp
二者的定义
Tcp的三次握手和四次挥手
Http长连接和Tcp的长连接
二者的联系和区别
常见的限流算法
漏斗算法和令牌桶算法
Http DDOS攻击和CRSF攻击
进程之间的通信方式
进程和线程的区别?
Cookie和Session的区别
Https和http的区别
证书机制
了解即可或者会用
定时任务:xxl-job和quartz
加密算法
分类、对称加密和非对称加密
IO多路复用
select、poll、epll
spark数据倾斜
Hive
默认引擎是mapReduce、也可以用Tez、spark
WebSocket
怎么理解IASS、SASS、PASS
JWT
Kafka
ISR列表,如何做到消息不丢失?OFFSET,如何保证消息的有序
零拷贝怎么实现的?
延迟队列
几种用法?
死锁和活锁
线程死锁和数据库死锁
Redis分布式锁有啥问题吗?
RedLock了解吗,他能解决什么?
ServerMesh架构和Istio架构、DDD
Java类的加载过程
过程
类加载器
双亲委派机制
Tomcat为啥要破坏双亲委派机制
Jdk和Jre的区别
Cpu密集型和IO密集型
Jvm中PerGen和MetaSpace
为啥mysql默认使用RR?
现在不少公司使用RC,一般都够用了;
RR耗费性能;
5.7以前RC有bug(可以了解下,跟binlog statement有关,后来出现了 row 和mixed),因此默认是RR
Tcp中time-wait和close-wait
对应client和server
拥塞控制、滑动窗口
算法题
一般力扣和牛客练习即可;
常用算法:
- 数组
- 排序
- 查找
- 动态规划
- 贪心
- 回溯(递归)
每种找几个题砍下找找题感,有思路即可
面试题汇总
谐云
- java反射
- spring bean是线程安全的吗?
- spring boot自动装配的原理
- spring ioc和aop怎么理解的?
牧原
- spring boot的加载顺序,不是spring的加载顺序;
- redis的底层数据结构?hash的底层?string的底层?为啥要这样设计呢?
- spring Boot的常用注解
- @profile注解的使用,不同的生产环境如何去设置配置文件?
- 循环依赖的解决,三级缓存为啥要这样设计、map里面放的是什么
- 你知道哪些数据库设计规范?索引为啥不能建立在重复高的列?为啥要减少关联查询?
- spring mvc是如何处理前端请求的?如何去接受前端的参数的?
- requestBody和responseBody的区别和用途?
- 为啥要用mq?解决了啥?不用可以吗?
- stream中toMap用过吗?要注意什么呢?Comparing进行排序,默认是升序,如何降序?基于两个字段排序怎么解决?
- 接口和抽象类的区别?
- configurationProperties注解
- 过滤器和拦截器的区别
XXX公司
- 私有方法可以被动态代理吗
- object类有什么方法?
- 代码规范是怎么做的?你们项目里是怎么做的?你认为为什么要有代码规范
华为OD一面(只记下了不会的问题)
- kafka的原理
- java异常的分类,常见的运行时异常和编译时异常,以及错误;内存溢出和内存泄露
- spring bean的作用域
- G1和CMS
华为OD二面
- TCP和UDP
玩物有志
- jwt和token的区别?
- session和token的区别
- mysql分页注意什么?深度分页了解吗
- redis的分布式锁的实现原理?分布式锁的实现方式?如何选型?
- redisson中watch dog的实现
- spring cloud中openFeign调用失败异常如何处理
- mq消费失败怎么办
- flink的应用场景
- 接口的幂等性如何实现
- mq的幂等性如何实现
XXX公司
- redis你们是怎么部署的
- spring quartz分布式调度是如何实现的
- rabbit mq是如何部署的?你们的应用场景是什么?
- hsf和dubbo的区别
- openFeign的原理
- odps是什么
- 分布式事务
- spring事务
鑫翔七讯
- 子线程和主线程之间如何通信
- kettle处理大数据有啥问题
- spring mvc的执行流程
- volatile和synchronize的区别
- 单点登录时怎么实现的
- token里面存什么
数字马力二面
- concurrenthashmap的默认线程数
- hashmap是线程安全的吗?什么时候会线程不全?1.7和1.8的区别?1.8会有死循环吗
- 线程安全的map有哪些
- java的设计原则
- 如何保证消息的有序性
- mysql间隙锁
XXX公司
- ArrayList和LinkedList的区别
- hashMap put过程中会出什么问题吗?多线程时候会怎样
- concurrenthashmap分段锁的实现,1.8和1.7的差异
- 数据库的事务是如何保证的
- 数据库事务RR和RC的区别,幻读的概念?
- netty?tcp?udp?
云链趣链
- starter配置类的原理是什么,如果让你自己写一个
- ioc设计,aop两种底层;接口可以用cglib吗
- concurrentHashMap不安全;
- 线程池抛异常;excute抛异常
- long,直接返回前端,会有啥问题?
- 事务的失效情况有哪几种?为什么会失效
- 什么时候用==什么时候用equals;
- 对一个bean的生命周期的干涉可以怎么做?
- ioc理解还是不够深入
安厨大数据
treeset和hashset
dubbo
reetrantlock的实现,公平锁和非公平锁的实现,具体实现
hashMap扩容
定川
- arrayList的初始容量大小 :默认是0,第一次添加元素时候初始化为10
- mysql常用的函数:字符串相关、日期相关()、排序函数(Rank,)
- 加密算法
- spring Boot starter
- kettle工具的使用
- 多个数据库之前会回滚吗
- jdk1.8的新特性
海康
- spring拦截器和过滤器
- rocketmq中如何保证有序性
- BIO和NIO的区别
- 线程池堆积了怎么办
- ooM怎么解决
安恒信息
- spring加载完成以后做初始化操作要怎么做?
- 数据库的分库分表要怎么做
- 数据慢查询怎么看当前有哪些sql是在执行中
- 数据库cpu过高的话如何排查
MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,一到高峰期肯定会造成,会有太多的TCP连接没关闭,数据库连接数肯定是不够。从而会产生CPU占用过高,服务器告警等问题。因EPG的一个访问一次对数据库操作量不大,查询完数据就完成ok了,wait_timeout 设置在120s内就很完美了。
XTransfer
- mysql的binlog和undo log 以及redo log
- mysql mvcc机制的实现
- mysql如何和redis保持一致性
- redis分布式锁key过期的情况
- rocketmq有哪几种使用方式
- spring boot的事务传播机制以及有几种传播级别
- jdk动态代理和cglib的区别
最近面试题汇总
- Spring分为哪几个模块?
- spring和springboot、spring cloud各个之间的区别
- tomcat和jboss和jetty之间的区别
- springboot如何切换web服务器
- 如何修改mysql密码?几种方法
- 如何修改mysql的权限
- cpu过高如何排查
- redis的基本数据类型?(数据结构)
- java中的强引用和弱引用
- netty和http的区别
- spring cloud和dubbo的区别
- 分库分表实际怎么做?
- mq消息堆积了怎么办
- rocketmq和rabbitmq的区别
- 断路器的原理
- mybatis动态代理的原理
- 分布式锁为啥可以用redis去实现
- 定时任务框架有哪些?需要注意什么问题
- spring boot各版本之间的不同