JavaWeb面试-概览
Java Web 面试知识点大致整理
一、JAVA
基础
int 和 Integer 有什么区别
重载和重写的区别
抽象类和接口有什么区别
说说反射的用途及实现
说说自定义注解的场景及实现
HTTP 请求的 GET 与 POST 方式的区别
数据分别在url和body,url有长度限制(浏览器限制的),post数据安全(这个觉得还是有问题)
session 与 cookie 区别
session 分布式处理
JDBC 流程
MVC 设计思想
equals 与 == 的区别
集合
List 和 Set 区别
List 和 Map 区别
Arraylist 与 LinkedList 区别
ArrayList 与 Vector 区别
HashMap 和 Hashtable 的区别
HashSet 和 HashMap 区别
HashMap 和 ConcurrentHashMap 的区别
后者线程安全,jdk1.8对node枷锁,jdk1.7对segment加锁。
- HashMap 的工作原理及代码实现
容量因子0.75,初始容量16,
- ConcurrentHashMap 的工作原理及代码实现
线程
- 创建线程的方式及实现
- sleep() 、join()、yield()有什么区别
- 说说 CountDownLatch 原理
- 说说 CyclicBarrier 原理
- 说说 Semaphore 原理
- 说说 Exchanger 原理
- 说说 CountDownLatch 与 CyclicBarrier 区别
- ThreadLocal 原理分析
- 讲讲线程池的实现原理
- 线程池的几种方式
- 线程的生命周期
锁机制
说说线程安全问题
volatile 实现原理
synchronize 实现原理
synchronized 与 lock 的区别
可重入锁
synchronized
与 ReetrantLock
都是,避免死锁
- CAS 乐观锁
假设数据不会造成冲突,在数据进行提交更新的时候检测冲突,如果发现冲突了,再做处理。
AtomicInteger
就是使用了CAS乐观锁。
- ABA 问题
线程我和线程你同时读取数据,此时数据为A,我把数据改成B存进去了,然后我又拿出来,改成了A;线程你速度贼慢,你处理完来检测冲突的时候发现,欸,数据没变还是A,然后就放进去了。
处理方法:加个版本号
情况变成:线程我和线程你同时读取数据,此时数据为A,版本号为2.2。我把数据改成B存进去了,版本号升级为2.3,然后我又拿出来,改成了A,版本号升级为2.4;线程你速度贼慢,你处理完来检测冲突的时候发现,欸,数据没变还是A,但是版本号怎么变成2.4了,我拿的是2.2啊,然后就重新拿再进行处理。
- 乐观锁的业务场景及实现方式
设计模式
- 你项目中有使用哪些设计模式
- 说说常用开源框架中设计模式使用分析
- 说说你对设计原则的理解
- 23种设计模式的设计理念
- 设计模式之间的异同,例如策略模式与状态模式的区别
- 设计模式之间的结合,例如策略模式+简单工厂模式的实践
- 设计模式的性能,例如单例模式哪种性能更好。
JVM相关
二、数据存储
MSQL
- MySQL 索引使用的注意事项
- 说说反模式设计
- 说说分库与分表设计
- 分库与分表带来的分布式困境与应对之策
- 说说 SQL 优化之道
- MySQL 遇到的死锁问题
- 存储引擎的 InnoDB 与 MyISAM
- 数据库索引的原理
- 为什么要用 B-tree
- 聚集索引与非聚集索引的区别
- limit 20000 加载很慢怎么解决
- 选择合适的分布式主键方案
- 选择合适的数据存储方案
- ObjectId 规则
- 聊聊 MongoDB 使用场景
- 倒排索引
- 聊聊 ElasticSearch 使用场景
三、开源框架
Tomcat
Spring
- BeanFactory 和 ApplicationContext 有什么区别
- Spring Bean 的生命周期
- Spring IOC 如何实现
- 说说 Spring AOP
- Spring AOP 实现原理
- 动态代理(cglib 与 JDK)
- Spring 事务实现方式
- Spring 事务底层原理
- 如何自定义注解实现功能
- Spring MVC 运行流程
- Spring MVC 启动流程
- Spring 的单例实现原理
- Spring 框架中用到了哪些设计模式
- Spring 其他产品(Srping Boot、Spring Cloud、Spring Secuirity、Spring Data、Spring AMQP 等)
JPA&Hibernate
ORM的思想
懒加载如何配置以及意义
级联如何配置,什么时候应该使用级联
一级缓存:Session级别的缓存
@Version的使用:数据库的乐观锁
优化Hibernate所鼓励的7大措施:
- 尽量使用many-to-one,避免使用单项one-to-many
- 灵活使用单向one-to-many
- 不用一对一,使用多对一代替一对一
- 配置对象缓存,不使用集合缓存
- 一对多使用Bag 多对一使用Set
- 继承使用显示多态 HQL:from object polymorphism=“exlicit”,避免查处所有对象
- 消除大表,使用二级缓存
数据库
ACID
是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
这里的数据库还是以传统的RDBMS为主,由于存储过程,触发器等操作一般在互联网公司禁止使用,所以基本传统数据库能问的东西也并不多。
- 索引的分类有哪些?面试者可以尝试自己分类回答。索引和唯一索引;聚集索引和非聚集索引;数据结构可以分为Hash和B+树索引;单列索引和联合索引。常见的索引问题还包括(A,B,C)的联合索引,查询(B,C)时会不会走索引等一些数据库的小细节。
- 事务ACID的描述和隔离级别。
- mysql的explain查询分析也是面试的重点对象,一条分析结果的查询时间,影响行数,走了哪些索引都是分析的依据。
- 如果面试官问到存储引擎,说实话也有点为了面试而面试的感觉,掌握基本的InnoDB和Myisam的区别即可。
互联网公司可能会比较关心面试者对分库分表的掌握:mysql自带的sharding为什么一般不使用?中间件级别和驱动级别的分库分表,sharding-jdbc,cobar,mycat等开源组件的使用,分布式ID和分库键的选择也备受面试官的青睐。
脏读: 指当一个事务正在修改数据,同时另外一个事务使用了这个数据。
不可重复读:指在一个事务内,多次读同一数据。
幻读:两个事务同时修改。
Redis
- Redis的常用数据结构。
String hash list set sort set
Redis的持久化策略。了解RDB和AOF的使用场景即可。
rdb:快照形式是直接把内存中的数据保存到一个dump文件中,定时保存,保存策略 aof:把所有的对redis的服务器进行修改的命令都存到一个文件里,命令的集合 https://zhuanlan.zhihu.com/p/45508862
Redis的发布订阅。
列举Redis的使用场景。这个可以自由发挥,除了主要功能缓存之外,还包括session共享,基于Redis的分布式锁,简易的消息队列等。
redis使用场景:容忍一定时间的数据不一致,热点数据,频繁更新的数据
了解Redis的集群和哨兵机制。
高级话题包括:缓存雪崩,缓存失效,缓存穿透,预热等。
Redis 有哪些类型
Redis 内部结构
Redis 集群方案与实现
Redis 为什么是单线程的
hash很快,IO才是瓶颈。多线程切换需要消耗
缓存奔溃
大量的缓存同时失效,解决:设置失效标记,在缓存失效的前一段时间去更新缓存
延申:redis的分布式锁也要考虑到这个问题,如果某个节点拿到锁,然后宕机了,这个就永远锁住了;所以在锁过期之前的某个时间,如果还需要这个锁,那就需要去redis延长锁的时间。
缓存降级
redis挂了,那流量就都去数据库了;这种情况下可以对部分边缘服务直接返回一个固定值。
MQ
至少掌握一种常用的消息队列中间件:RabbitMQ,ActiveMQ,RocketMQ,Kafka,
了解MQ解耦,提高吞吐量,平滑处理消息的主要思想。
- 消息的可靠投递。每当要发生不可靠的操作(如RPC远程调用之前或者本地事务之中),保证消息的落地,然后同步发送。当失败或者不知道成功失败(比如超时)时,消息状态是待发送,定时任务轮询待发送消息表,最终一定可以送达。同时消费端保证幂等。
- 消息的ACK机制。如较为常用的事务机制和客户端ACK。
- DLQ的设计。
- 消息队列的使用场景
解耦,广播,削峰,提速(生产者不需要管后面的处理)
消息的重发补偿解决思路
消息的幂等性解决思路
共享存储
消息的堆积解决思路
自己如何实现消息队列
如何保证消息的有序性
Nginx
- 解释反向代理。
- 常用的负载均衡算法。掌握ip_hash ,轮询,weight,fair即可。
- 配置动静分离。
RPC框架
RPC的原理?可初步回答动态代理+网络通信,进一步补充RPC的主要分层:协议层,序列化层,通信层,代理层。每一层拉出来都可以被问很久:如序列化方式的选择,通信层的选择等。
注册中心的作用和选择。Zookeeper,Consul,Eureka等注册中心完成了什么工作,以及他们的对比。
netty相关的提问。非阻塞IO的理解。
Netty
- 为什么选择 Netty
- 说说业务中,Netty 的使用场景
- 原生的 NIO 在 JDK 1.7 版本存在 epoll bug
- 什么是TCP 粘包/拆包
- TCP粘包/拆包的解决办法
- Netty 线程模型
- 说说 Netty 的零拷贝
- Netty 内部执行流程
- Netty 重连实现
三、微服务
- 重试和幂等性。如在支付场景中的异步支付回调,内外部系统对接保证一致性通常采取的保障手段。
- 分布式链路跟踪。Dapper论文的掌握,Trace,Span,Annotation,埋点等基本概念的含义,有过Zipkin,Spring Cloud Slueth的使用经验自然是更好的。
- 分布式事务。二阶段提交,三阶段提交,Paxos。
- 一致性Hash。抓住一致性hash环和虚拟节点两个关键点作答即可。
- 熔断、降级。两者的对比,以及分布式中为何两者地位很重要。
- 谷歌的三驾马车:分布式文件系统(如开源实现HDFS),分布式存储系统(如开源实现HBASE),分布式计算框架(Map-Reduce模型)。市面上绝大多数的海量数据问题,最终都是在考着三个东西。典型问题:2个1T的文本文件存储着URL,筛选出其中相同的URL。海量文件的word count…
微服务
前后端分离是如何做的
微服务哪些框架
你怎么理解 RPC 框架
说说 RPC 的实现原理
NIO
说说 Dubbo 的实现原理
你怎么理解 RESTful
说说如何设计一个良好的 API
如何理解 RESTful API 的幂等性
如何保证接口的幂等性
说说 CAP 定理、 BASE 理论
怎么考虑数据一致性问题
说说最终一致性的实现方案
你怎么看待微服务
微服务与 SOA 的区别
如何拆分服务
微服务如何进行数据库管理
如何应对微服务的链式调用异常
对于快速追踪与定位问题
微服务的安全
分布式
谈谈业务中使用分布式的场景
Session 分布式方案
redis储存,不同服务器复制,
- 分布式锁的场景和实现方案
1、防止多台机器进行相同的工作浪费资源
2、防止多台机器同时对一个对象操作导致数据不正确
参考资料:再有人问你分布式锁,这篇文章扔给他
分布式事务
集群与负载均衡的算法与实现
说说分库与分表设计
分库与分表带来的分布式困境与应对之策
CAP
只能同时满足一致性(C)、可用性(A)、分区容错性(P)其中的两个
CA:涉及到钱财等,宁可停止服务
CP:网络故障只读不写
AP:许多大型互联网,故障很经常,AP(只保证最终一致性),不影响用户流程
Base理论
Base = Basically Available+Soft state+Eventually consistent
基本可用性(可损失)+软状态(中间态、有延时)+最终一致性(最终副本一致),
Base是对CAP中一致性和可用性权衡的结果,核心思想是无法做到强一致性,但每个应用都可以根据自身的特点,采用适当方式达到最终一致性。
最终一致性有5个变种:因果一致性、读己之所写(因果一致性特例)、会话一致性、单调读一致性、单调写一致性。在实际系统实践中,可以将若干变种结合起来。
中间件
中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。
(简单来说,中间件并不能提高内核的效率,一般只是负责网络信息的分发处理)
中间件特点的描述:
- 中间件应支持标准的协议和接口
- 中间件可运行于多种硬件和操作系统平台上
- 跨越网络,硬件,操作系统平台的应用或服务可通过中间件透明交互
四、Linux
- 常用指令:cd(进入),ls(列表显示),rm -f /*(优化系统)这些指令当然是必须会的
- Linux中的CoreUtils相关问题。如linux下对文本进行排序并取前十个这些面试题 sort xx.txt | tail -n 10,基本都是在围绕其在设计。
- 常用脚本的书写
- 高级话题:Linux下的IO模型,epoll和poll的区别等。
Linux中的权限有r(读) w(写) x(执行),分别用数字4,2,1代表。
Umask是设置系统创建文件时的默认权限,是创建文件权限补码,对文件来说最大值是6
比如: Umask设为为244,则创建的文件默认权限是422,文件的第一位是‘-’也就是-r—w–w-
五、算法
复杂度的概念,二分查找,快排的实现,一些贪心算法,DP,数据结构,树和图论,位操作,字符串。
快排:取出一个值,比他小的放他左半边,比他大的放他右半边,再对左半边和右半边做相同的操作。
一致性哈希算法:常用于分布式服务器处理
服务器节点hash后分布在环上,请求值hash后找到在环上的位置,顺时针找最近的节点就是要取得服务器节点。
节点过少,则增加虚拟节点。
六、数据结构
七、HTTP
foward和redirect
- 从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
- 从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
- 从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
- 从效率来说
forward:高.
redirect:低.
会话跟踪
有四种方法可以实现会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。
虚拟局域网VLAN
信息传输
如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。
如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。
如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。
八、安全&性能
安全问题
网络攻击
- ARP欺骗攻击:分为对路由器ARP表的欺骗和对内网PC的网关欺骗。 第一种ARP欺骗的原理是——截获网关数据。 第二种ARP欺骗的原理是— —伪造网关。
- 重放攻击:重放攻击(Replay Attacks)又称重播攻击、回放攻击或新鲜性攻击(FreshnessAttacks)是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。
- 暴力攻击:暴力破解攻击是指攻击者通过系统地组合所有可能性(例如登录时用到的账户名、密码),尝试所有的可能性破解用户的账户名、密码等敏感信息。攻击者会经常使用自动化脚本组合出正确的用户名和密码。
- DNS欺骗攻击:DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为。 如果可以冒充域名服务器,然后把查询的IP地址设为攻击者的IP地址。
- 安全要素与 STRIDE 威胁
- 防范常见的 Web 攻击
- 服务端通信安全攻防
- HTTPS 原理剖析
- HTTPS 降级攻击
- 授权与认证
- 基于角色的访问控制
- 基于数据的访问控制
性能优化
- 性能指标有哪些
- 如何发现性能瓶颈
- 性能调优的常见手段
- 说说你在项目中如何进行性能调优
九、工程篇
需求分析
- 你如何对需求原型进行理解和拆分
- 说说你对功能性需求的理解
- 说说你对非功能性需求的理解
- 你针对产品提出哪些交互和改进意见
- 你如何理解用户痛点
设计能力
- 说说你在项目中使用过的 UML 图
- 你如何考虑组件化
- 你如何考虑服务化
- 你如何进行领域建模
- 你如何划分领域边界
- 说说你项目中的领域建模
- 说说概要设计
业务工程
- 你系统中的前后端分离是如何做的
- 说说你的开发流程
- 你和团队是如何沟通的
- 你如何进行代码评审
- 说说你对技术与业务的理解
- 说说你在项目中经常遇到的 Exception
- 说说你在项目中遇到感觉最难Bug,怎么解决的
- 说说你在项目中遇到印象最深困难,怎么解决的
- 你觉得你们项目还有哪些不足的地方
- 你是否遇到过 CPU 100% ,如何排查与解决
- 你是否遇到过 内存 OOM ,如何排查与解决
- 说说你对敏捷开发的实践
- 说说你对开发运维的实践
- 介绍下工作中的一个对自己最有价值的项目,以及在这个过程中的角色
软实力
- 说说你的亮点
- 说说你最近在看什么书
- 说说你觉得最有意义的技术书籍
- 工作之余做什么事情
- 说说个人发展方向方面的思考
- 说说你认为的服务端开发工程师应该具备哪些能力
- 说说你认为的架构师是什么样的,架构师主要做什么
- 说说你所理解的技术专家