Java基础
- 面向对象特性介绍、与C++区别 链接
- 多态实现原理
- 抽象类和接口区别,以及各自的使用场景
- 泛型以及泛型擦除。List<A>类型的list,可以加入无继承关系的B类型对象吗?如何加入?
- Java异常体系
- 反射原理以及使用场景
- ThreadLocal原理,如何使用?
- 内存泄漏的场景
- static关键字和final关键字使用情况,一个类不能被继承,除了final关键字之外,还有什么方法(从构造函数考虑)?
- 序列化和反序列化。反序列化失败的场景。
- 正则表达式会写吗
- ArrayList和LinkedList的区别和底层实现?如何实现线程安全?
- List遍历时如何删除元素?fail—fast是什么?fail—safe是什么?
- 详细介绍HashMap。角度:数据结构+扩容情况+put查找的详细过程+哈希函数+容量为什么始终都是2^N + JDK1.7与JDK1.8的区别。
- 注意1.7和1.8区别
- Java集合(List、set、HashMap、HashTable、ConcurrentHashMap等)(Java集合框架源码)
- HashMap如何实现线程安全?ConcurrentHashMap的底层实现?JDK1.7与JDK1.8的区别
- HashMap实现原理(put、resize)
- HashMap和HashTable区别
- HashMap和ArrayList默认容量分别是多少?
- HashMap什么时候扩容,几倍?
- ArrayList什么时候扩容,几倍?
- StringBuffer和StringBuilder区别
- socket编程及NIO
- 如何用线程打印abab问题,传送门
- 异常(检测异常和未检测异常、继承关系等)
- 反射、动态***
- Spring的IOC、AOP
- Java并发相关的知识
- Spring mvc作为后端,讲述从前端请求到后端返回的全部流程,从dns解析到tcp建立连接,再到arp解析,再到反向***,再到DispatchServlet、HandlerAdapter(通过HandlerMapping找到对应的requestmapping方法)、ModelAndView等,这个问题足以将基础和框架全部联系起来。
- Spring bean的是如何管理的?
- 在maven中如何出现了循环依赖问题,spring中的bean是如何注入的?
多线程并发
- 进程线程区别,线程安全和非线程安全区别
- 线程状态,start,run,wait,notify,yiled,sleep,join等方法的作用以及区别
- wait,notify阻塞唤醒确切过程?在哪阻塞,在哪唤醒?为什么要出现在同步代码块中,为什么要处于while循环中?
- 线程中断,守护线程
- 线程间通信
- 怎么避免死锁
- 怎么开多个线程顺序执行任务。
- Java乐观锁机制,CAS思想?缺点?是否原子性?如何保证?
- synchronized使用方法?底层实现?
- synchronize、final、static理解
- ReenTrantLock使用方法?底层实现?和synchronized区别?
- 公平锁和非公平锁区别?为什么公平锁效率低?
- 锁优化。自旋锁、自适应自旋锁、锁消除、锁粗化、偏向锁、轻量级锁、重量级锁解释
- Java内存模型
- volatile作用?底层实现?禁止重排序的场景?单例模式中volatile的作用?
- AQS思想,以及基于AQS实现的lock, CountDownLatch、CyclicBarrier、Semaphore介绍
- 线程池构造函数7大参数,线程处理任务过程,线程拒绝策略
- Execuors类实现的几种线程池类型,阿里为啥不让用?
- 线程池大小如何设置?
- 手写简单的线程池,体现线程复用
- 手写阻塞队列
- 手写多线程交替打印ABC
JVM相关
- JVM内存分配机制、内存模型(JVM, 基本都在《深入理解Java虚拟机》上)
- JVM运行时内存划分?PC+虚拟机栈+本地方法栈+堆+方法区+JDK1.7与1.8区别
- 堆内存分配策略
- GC(minor GC、major GC、触发条件、GC算法等)
- 什么是垃圾回收,垃圾回收的算法,GC怎么给内存分区的?
- Full GC触发条件
- 垃圾回收算法以及垃圾回收器介绍,尤其是G1和CMS的优缺点
- 如何判断对象是否存活?回收对象的两次标记过程。
- 创建一个对象的步骤
- 类加载机制(类隔离和类共享)
- 详细介绍类加载过程
- 双亲委派机制,使用这个机制的好处?破坏双亲委派机制的场景?如何破坏?
- 了解下tomcat的类加载机制
- JVM性能调优,常用命令,以及工具
数据库
- 事务4大特性,一致性具体指什么?这4个特性mysql如何保证实现的?
- 数据库几大范式,第一、第二、第三范式之间的理解和比较、举例
- 数据库的事务、ACID及隔离级别
- 事务隔离级别,4个隔离级别分别有什么并发问题?
- 隔离级别的单位是数据表还是数据行?如串行化级别,两个事务访问不同的数据行,能并发?
- Mysql默认隔离级别?如何保证并发安全?
- RR和RC如何实现的?RR使用场景?对比volatile可见性,为什么RR的事务要设计成不能读另一个事务已经提交的数据?
- 存储引擎Innodb和Myisam的区别以及使用场景
- 如何避免幻读
- 介绍Inodb锁机制,行锁,表锁,意向锁
- 介绍MVCC.
- 锁:乐观锁(版本号(mysql通过多版本号来解决幻读问题),cas),悲观锁(AQS,AbstractOwnableSynchronizer是重点)、ReentrantLock、CountDownLatch、CyclicBarrier、读写锁等等,与synchronized的原理对比等。
- 数据库引擎(Innodb)的事务支持粒度
- 索引优化(组合索引、最左匹配原则)、优缺点
- 手动写创建索引的语句
- 并发访问场景和所有可能出现的结果、锁作用和实现
- 主主复制、主从复制
- B-tree的应用
- 哈希索引是如何实现的?
- B树索引为什么使用B+树,相对于B树有什么优点?为什么不能红黑树?要提到磁盘预读
- 聚簇索引和非聚簇索引区别
- 回表查询和覆盖索引
- 如何创建索引?
- 如何使用索引避免全表扫描?
- Explain语句各字段的意义
- MySQL中一条SQL语句的执行过程
- 最左前缀!!联合索引B+树是如何建立的?是如何查询的?当where子句中出现>时,联合索引命中是如何的? 如 where a > 10 and b = “111”时,联合索引如何创建?mysql优化器会针对得做出优化吗?
- 数据库基本查询关键字使用,如left join on,where,beteen and,group by,having,limit,聚合函数等。
- left join,right join,inner join,outer join的含义及区别
- int和varchar
- io优化
- 分表分库设计
- mysql主从复制过程,binlog记录格式,复制的异步半同步同步模式区别
- 主从复制或读写分离等数据不一致性问题以及如何解决
- 银行的话,可以会考mysql数据类型,如余额要用decimal
操作系统/Linux/集群
- 内存管理
- 操作系统内存管理方式,分页分段以及段页式的优缺点
- 页面置换算法有哪些,FIFO为什么不好?如何改进?LRU思想,手写LRU
- 进程调度
- 进程通信
- 进程和线程的区别
- 协程呢?
- 进程间通信方式IPC
- 用户态和核心态
- 操作系统分配的进程空间是怎样的?线程能共享哪些?
- 死锁条件,解决方式
- Linux常用命令,列举一些 grep,tail,top,lsof,kill,cat之类的,
- shell脚本、查找文件命令
- top命令、netstat命令、ifconfig和ipconfig
- 乐观锁和悲观锁
- session集群共享
- Hadoop集群扩容问题
- 集群负载均衡
- 虚拟路由
- Hadoop集群单点故障
Redis问题
- 为什么使用Redis
- 分布式缓存和本地缓存有啥区别?让你自己设计本地缓存怎么设计?如何解决缓存过期问题?如何解决内存溢出问题?
- redis和mem***d的区别
- redis常用数据结构和使用场景
- Zset底层实现?跳表搜索插入删除过程?
- redis过期淘汰策略
- redis持久化机制?都有什么优缺点?持久化的时候还能接受请求吗?
- redis事务
- 缓存雪崩和缓存穿透,以及解决方法
- 如何保证缓存和数据库的数据一致性?
- redis是单线程还是多线程?为什么那么快?
- 五种IO模型的区别
- select、poll、epoll的区别?
- redis热key问题?如何发现以及如何解决?
- redis数据分布方式?有什么优点?一致性hash呢?
- redis主从复制,主从切换,集群
Spring
- Spring IOC
- Spring AOP,动态***
- Bean生命周期
- Bean作用域?默认什么级别?是否线程安全?Spring如何保障线程安全的?
- Spring事务隔离级别和事务传播属性
- Spring以及Spring MVC常见注解
- @autowired和@resource的区别,当UserDao存在不止一个bean或没有存在时,会怎样?怎么解决?
- mybatis如何防止sql注入?$#的区别是什么?传入表明用哪个?
- Spring MVC工作原理
- SpringBoot自动配置的原理是什么?介绍SpringBootApplication注解.
- Mybatis和Hibernate的区别
- spring中的注解原理?例如事务注解,spring如何根据注解实现事务功能的
- Spring中用到了哪些设计模式?单例、***、工厂、适配、观察者之类的说一说就行
计算机网络
- 传输层协议TCP和UDP,区别和应用场景,TCP/IP五层协议,基于TCP的协议有哪些,基于UDP的有哪些 答案传送链接
- OSI七层模型以及对应什么协议、干嘛的 答案传送链接
- 常见应用层协议和传输层、网络层协议,以及硬件如路由器之类的在哪一层。 答案传送链接
- TCP三次握手四次挥手等(建议把谢希仁的《计算机网络》传输层那一章好好看看,比如tcp的三次握手,四次挥手,流量控制,拥塞控制)
- TCP三次握手过程以及每次握手后的状态改变,为什么三次?为什么两次不行?如果你的答案是防止已失效的请求报文又传送到了服务端,建立了多余的链接,浪费资源,但这个答案被否定了,你还能给出什么答案?
- TCP四次挥手过程以及状态改变,为什么四次?CLOSE-WAIT和TIME-WAIT存在的意义?如何查看TIME-WAIT状态的链接数量?为什么会TIME-WAIT过多?解决方法是怎样的?
- TCP可靠传输的保证,拥塞控制目的和过程
- TCP粘包现象原因和解决方法
- TCP、UDP、IP、以太网报文格式以及重要字段,报文从一端到另一端传递的过程。
- HTTP1.0、1.1、2.0之间的区别
- http和https(对称加密、非对称加密)
- HTTP与HTTPS之间的区别,HTTPS链接建立的过程,了解对称加密算法和非对称加密算法不?
- HTTP请求有哪些,多说点。Post和get区别。
- HTTP常见响应状态码,从1xx到5xx都要说。如304,301,302,504,
- http报文都有什么
- ftp和sftp
- 重定向和转发区别
- cookie和session区别。
- 从访问一个网址到页面出现,描述中间发生的所有事情。
- 浏览器输入URL并回车的过程以及相关协议,DNS查询过程。
数据结构&算法(要能手写)
- 基础数据结构(链表、二叉树、队列、栈)以及排序查找算法
- 链表(头插法、尾插法、删除、双链表、带头结点与不带、循环链表等)、栈、队列
- 哈弗曼树、二叉树、二叉排序树(删除、增加)、b树、b-树、b+树、b*树、红黑树、字典树、树的三种遍历(代码实现,递归与非递归)
- 图的遍历(dfs、bfs、递归与非递归)、拓扑排序、最小生成树(Dijkstra、Foyd、Prim、kruskal)
- 排序:冒泡、插入(常用)、选择(常用)、快速(常用)、堆(常用)、归并(常用),希尔(不常用)、基数(不常用)
- Hash及冲突解决
- 二叉搜索树
- 手写快速排序算法、单链表反转、字符串部分逆序(如moc.anis.www转为www.sina.com)
- 手写二叉树层序遍历、二分查找、递归算法实现
- 超大文件寻找top K算法设计(单机1M内存、Hadoop集群、外部排序+uniq命令)
- 算法设计:给定函数a可以等概率产生1-5这5个数,仅调用a实现等概率产生1-7这7个数
- 用栈实现队列
- 订单超大并发访问-队列批量处理
- KMP算法及改进BM算法
- 并查集,用于求朋友的朋友问题(最小生成树个数)
- 三路快速排序(快排优化)
- 海量数据问题:归并排序思想,传送门
- 洗牌算法
- 刷题:leetcode
- 代码题一般分为几类:排序、二分查找、数据结构、数组、字符串、链表、树、回溯、动态规划、贪心、数学。首先三大排序算法快排、归并、堆排序一定特别熟练,时间复杂度一定要特别熟悉。
- 快排如何写,什么思想?用快排思想求无序数组中第K小的值如何写?时间复杂度多少?
- 归并如何写?什么思想?用归并思想给链表排序如何写?用归并思想求数组中逆序对数如何写?M个长度为N的数组如何排序?时间复杂度多少?M个长度为N的链表如何排序?
- 堆排序如何写,什么思想?时间复杂度怎么算的?符合堆的结构,插入和删除函数如何实现?
- 链表,掌握好链表逆序,快慢指针,保留pre节点和当前cur删除符合条件的节点,把这些掌握了,基本能解决八成的链表问题
- 树,掌握层序遍历+size+flag、非递归中序遍历、非递归前序遍历、二叉搜索树特点、完全二叉树特点及善用递归解决树深度,树是否平衡,树节点最大距离,树节点最长带权路径,最近公共父节点等问题,基本解决八成树问题
- 回溯,两大类排列和组合,总结排列组合类型的各自特点,以及考虑去重!
- 动态规划,多做多总结,不过一般出现在笔试中,面试很少有特别难的动态规划,即使出也很并不难。
- 贪心,少见,做几道就好。
- 数学,挺难的,没做过类似的真未必想起来,主要就是位运算,其中&和异或最常见,还有就是0-n顺排,求第K位的数字是多少,以及0-N,数字7或者1出现的次数,利用random5实现random7等。
设计模式
- 六大原则:
单一职责原则(Single Responsibility Principle SRP)
开闭原则(Open Close Principle OCP)
里氏替换原则(Liskov Substitution Principle LSP)
依赖倒转原则(Dependence Inversion Principle DIP)
接口隔离原则(Interface Segregation Principle ISP)
迪米特原则 (Least Knowledge Principle LKP) - 手写单例模式
- 观察者模式(消息发布订阅、dubbo)、工厂模式、适配器模式
- Spring中常用的设计模式有哪些?
- 手写消费者生产者模式
- 单例、工厂是被问的最多的,需重点关注,包括懒汉饿汉双检锁
-
了解一下另外几种较常见的策略、门面、桥接、观察者模式
智力题
- 估算武汉市需要多少个消防站。
- 有两根粗细不均匀的香(烧香拜佛的香),每一根烧完都花一个小时,怎么样能够得到15min?
- 下一场雨,估算武汉市总降雨量吨数。
- 盒子里放水果,猜哪个盒子放什么水果。
- 一个篮球可以装多个乒乓球?
项目
- 每个项目从整体架构设计、扩展性、后续优化到任何实现细节都有可能会问。对做过的事情需要多总结和优化思考。项目这块是需要花大量心思准备的。
- 你在项目上写过什么技术,面试的时候就更容易被问到,而且往往会侧重原理
- 怎么排查问题,都遇到哪些难题
- 学习方法
- 如何解决超卖?mysql锁+redis预减库存+redis缓存卖完标记
- 如何解决重复下单?mysql唯一索引+分布式锁
- 如何防刷?IP限流+验证码
- 热key问题如何解决?redis集群+本地缓存+限流+key加随机值分布在多个实例中
- 消息队列的作用?如何保证消息的不丢失?异步削峰;发送方开启confirm+消息队列持久化+消费方关闭自动ACK,确保消费成功之后自动调用API进行确认。
- 缓存和数据库数据一致性如何保证?秒杀项目不用保证,其他项目就用延时双删或者先更新数据再是缓存失效,为防缓存失效这一信息丢失,可用消息队***保。
- 压测没有?用什么压测?什么情况?
- 系统瓶颈在哪?如何查找,如何再优化?
参考牛客: