面经中的题目整理

 

Java基础

多线程并发

  • 进程线程区别,线程安全和非线程安全区别
  • 线程状态,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进行确认。
  • 缓存和数据库数据一致性如何保证?秒杀项目不用保证,其他项目就用延时双删或者先更新数据再是缓存失效,为防缓存失效这一信息丢失,可用消息队***保。
  • 压测没有?用什么压测?什么情况?
  • 系统瓶颈在哪?如何查找,如何再优化?

 

 

参考牛客:

和你一样我也拿到了offer-我的校招总结

震惊!文科生如何三个月转行成为Java工程师?

秋招总结&Java心得(双非硕士,已拿11+5家Offer)

秋招之路:个人历程以及面经总结

非科班本科菜鸡投的337家(Java后台) 

你可能感兴趣的:(面经中的题目整理)