
Java面试宝典
Java面试宝典, 百度, 阿里, 腾讯, 京东, 字节常见面试题
答案精炼,不啰嗦,适用于备战各种大中小企业面试。
本人靠这套面试题成功获得如华为(高架),顺丰,京东(T8)等多家优质企业高级别offer
2023年Java面试宝典
集团公司技术经理:带了10几个人团队5年,为公司做了几千万利润量。
金融公司技术总监:带了15人团队,两个月内P2P交易量10亿,存量5亿
平安智慧城资深全栈研发:开发过基础系统(如:用户中心,权限管理),为深圳环保局驻场实施并交付了用户中心系统,离职时政府有效用户量10万。目前仍在使用
京东技术T8专家:为京东架构设计并实现了店铺自定义域名功能,解决了难度较大的系统设计,并受到印尼团队的邮件高度表扬,认为其技术非常专业, 在装修系统上基于 京东现有中间件,自研了极好扩展中间件。为共享技术部作出了较大贡献。
展开
-
Mybatis防止Sql注入
Mybatis用#{}时->使用了PrepareStatement去编译SqlPrepareStatement编译Sql时,prepareStatement.setString对如图做了如: ‘’'的转义原创 2022-12-06 19:59:18 · 267 阅读 · 0 评论 -
redis-原子性
INCR/DECR,这两个操作是将读,自增(自减),写作为一个原子进行执行的,单线程保证了原子性锁是常用来保证原子性的每个客户端监听这个key,事务更新后发现key被修改就拒绝再执行原理: Redis会维护一个事务队列,当一个客户端执行完后,会从队列剔除该客户端,并将其他客户端标记为客户端脏数据状态(即标记为CLIENT_DIRTY_CAS),这样客户端监听时会对这种状态拒绝执行,从而保证了只有单个客户端执行成功(原子性)原创 2022-10-17 10:18:57 · 1202 阅读 · 0 评论 -
redis-大Key
Redis的大Key是什么意思?[面试8.0]Redis的Key对应的Value过大Redis的大Key有什么问题?[面试8.0]读取和写入都是阻塞的,因为Redis是单线程非常占用IO资源和网络带宽Redis的大Key的解决方案是怎样的?[面试8.0]利用Linux自带任务调度crontab,通过任务调度运行sh脚本解析并生成csv文件,任务调度频率可以一天一次利用MySql的load命令导入csv到MySql某张记录表中,记录表可以新建,csv的主要内容是:db索引,key值.原创 2022-03-01 10:32:41 · 337 阅读 · 0 评论 -
Dubbo
Dubbo的工作原理是什么?[面试7.0]Dubbo原理Monitor:监控中心(可统计调用次数)Provider:暴露服务的服务提供方Registry:注册中心Consumer:调用远程服务的消费方Container:服务运行的Web容器(如Tomcat)(1.start)Web容器启动(2.register)服务提供者向注册中心异步注册服务(包含服务,端口,Ip等信息)(3.subscribe)消费者启动向注册中心订阅服务(4.notify)注册中心返回提供者地址列表给消费者.原创 2022-02-24 16:19:04 · 1003 阅读 · 0 评论 -
java分布式事务-RocketMq事务消息
Rocket事务消息用来解决什么问题的?[面试7.0]RoketMq事务消息用来解决消息发送与业务的数据一致性问题,如:本地数据库提交事务后发送消息到消息队列RocketMq的本地事务状态有多少种?[面试7.0]COMMIT_MESSAGE # 提交消息ROLLBACK_MESSAGE # 回滚消息UNKNOW # 未知RocketMq的原理是什么(RocketMq怎么保证生产者一定会成功发送消息)?[面试7.5]RocketMq是基于2PC分布式事务的,见图生产者发送一个pr.原创 2022-02-16 20:19:05 · 633 阅读 · 0 评论 -
zookeeper
Zookeeper的工作原理是什么?[面试7.0]Zookeeper的ZAB协议Zookeeper使用ZAB协议保证数据的一致性,ZAB协议是一种支持崩溃恢复的原子广播协议,它包括两种模式:广播模式(同步): 客户端的事务请求到达Leader时,首先生成事务提案(Proposal),每一个Proposal有一个ZXID向所有Follower发起事务提案广播并等待Follower的ack确认,若有过半ack已经确认,就可以向所有Follower发起Commit事务(2PC必须要等到所有的参与者反馈ack原创 2022-01-28 20:00:09 · 2323 阅读 · 0 评论 -
Java线程-AQS
讲一讲AQS的原理是什么?[面试7.0]AQS主要利用state,CLH队列,CAS来实现的若被请求的共享资源空闲: 则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态(state)若被请求的共享资源被占用: ,AQS利用CLH队列锁实现的,即将暂时获取不到锁的线程封装成Node节点加入到队列中CLH(指三个人名:Craig,Landin,and Hagersten)队列: 是一个虚拟的双向队列(仅存在结点之间的关联关系),AQS是将每条请求共享资源的线程封装成一个CLH锁队列的一原创 2022-01-26 11:21:01 · 118 阅读 · 0 评论 -
Java基础-Hashmap1.8
JDK1.8的HashMap数据结构和原理[面试9.9]?数据结构?数组+链表+红黑树数组?空间连续,查询快,但是插入和删除较慢,因为要移动元素链表?增加删除快,因为是内存地址指针,查找慢,因为需要按顺序依次查询红黑树: 一种平衡的二叉树,以O(log2(n))的时间复杂度进行搜索,插入,删除等操作hashmap数据结构-原理hashmap1.8数据结构-视频key是怎么进行hash运算的?若key为空直接返回0若key不为空才进行运算,key取hashCode的值(32位)向右移16位得到的值和该h原创 2022-01-27 21:43:14 · 640 阅读 · 0 评论 -
java面试题-攻击方式
跨站请求伪造攻击(CSRF)是怎样的?[面试9.0]CSRF防御: 关键操作采用Post->可以减少被CSRF关键操作加入验证码->可以减少一大部分被CSRF的可能性,但用户体验不友好服务端加入Referer验证,但黑客依然会利用伪造Referer的方式攻击,这时就需要加入Anti CSRF Token来解决Anti CSRF Token: 使用一个随机的Token保存在客户端页面上,提交到服务器后,验证服务端保存的这个Token值和该值是否匹配Header里加入一些参数: 原理和Anti原创 2022-01-26 11:23:35 · 128 阅读 · 0 评论 -
springboot的优点
SpringBoot的优点是什么?[面试7.5]更快速的构建能力,不用到处找依赖包起步依赖,创建项目时可以勾选依赖项,并生成初始化项目内嵌web容器,默认是tomcat自带监控,Actuator监控程序的运行状况,内存,线程池,Http请求统计等...原创 2022-01-24 20:21:06 · 98 阅读 · 0 评论 -
Java数据结构-优先队列
什么是优先队列?[面试7.0]优先队列的底层是一个二叉堆(完全二叉树),并且是一个利用数组实现的完全二叉树数组里的每一个元素有可能是其他元素的父节点,也有可能是其他元素的子节点特性: 数组里的第一个元素array[0]拥有最高的优先级给定一个下标i父节点对应元素的下标是(i - 1)/2左子节点对应的元素下标是2i + 1右侧子节点对应的元素下标是2i + 2数组中每个元素的优先级都必须要高于它两侧子节点基本操作: 向上筛选: 新数据首先放到二叉堆底部,然后向上比较和父节点的优先级,若高于父节点就交换节原创 2022-01-30 20:42:32 · 706 阅读 · 0 评论 -
Java数据结构-前缀树
什么是前缀树?[面试5.0]字典树字典查找: 查找在字典中以ABC开头的字符串,前缀树的时间复杂度为O(M),M为字典中最长字符串的长度,比如百度的Autocomplate功能就是使用前缀树来做的重要性质: 每个节点包含两个基本属性:children: 数组或集合,即每个分支中包含的所有字符isEnd: boolean值,该节点是否为字符串的结尾根节点是空的叶子节点一定是单词的结尾创建方法: 遍历所有字符,并将每个字符加到children中,对尾字符标记为isEnd=true搜索方法: 从前缀树根节点出原创 2022-01-30 20:42:21 · 252 阅读 · 0 评论 -
Java数据结构-图
什么是图?[面试5.0]图是一组顶点和一组能将两个顶点连接的线(也称为边)组成的自环: 即两个顶点就是自己平行边: 连接两个顶点的两条边(连接同一对顶点的两条边)概念了解: 拓扑排序最短路径联合查找算法重点了解: 环的检测: 有向图,无向图二部图(二分图)的检测,树的检测图的遍历: 深度优先,广度优先图的储存和表达方式: 邻接矩阵, 邻接链表什么是有向图?[面试5.0]两个顶点的边是有方向的图出度: 一个顶点指出的边的个数入度: 指向某个顶点的边的个数有向路径: 由有向的顶点组成有向环: 起点和原创 2022-01-30 20:42:09 · 275 阅读 · 0 评论 -
Java数据结构-堆
什么是堆?[面试5.0]堆是一种完全二叉树除了最后一层不是满的,其他每一层都是满的初始化一个大小为n的堆时间复杂度是O(n)原创 2022-01-30 20:41:57 · 548 阅读 · 0 评论 -
Java数据结构-数组
数组的内存模型是怎么样的?[面试5.0]数组的内存结构数组的内存结构-视频数组的优点和缺点是什么?[面试5.0]数组是一种顺序储存的线性表优点: 查询单个元素快(O(1),因为数组下标(index))缺点: 构建时必须分配一段连续的空间查询某个元素是否存在时慢(O(n),因为需要遍历整个数组)添加和删除某个元素时慢(O(n),因为要移动位置)为什么数组查询快而添删慢,链表查询慢添删快?[面试5.0]因为Cpu缓存会读入一段连续的内存,顺序存储符合连续的内存,所以顺序存储可以被Cpu缓存处理,原创 2022-01-30 20:41:45 · 96 阅读 · 0 评论 -
Java数据结构-栈
什么是栈?[面试5.0]拥有先进后出的虚拟储存结构(数组和链表都是物理储存结构),仅在一端进行插入和删除的线性表一般使用单向链表来实现为什么不用数组+指针来实现呢?因为我们用栈是要用它的O(1)时间内可以访问前一次的操作,数组添加删除元素时时间复杂度不再是O(1)...原创 2022-01-30 20:39:39 · 255 阅读 · 0 评论 -
Java数据结构-树
树有哪些?[面试5.0]普通二叉树平衡二叉树完全二叉树二叉搜索树四叉树多叉树红黑树自平衡二叉搜索数树的遍历方式有哪几种?[面试5.0]前序:先到根节点,再到左节点,最后到右节点中序:先到左子树,再到根节点,最后到右子树后序:先访问左节点,再访问右节点,最后才访问根节点层序:层序遍历就是按照树的层次由上到下的进行遍历,每一层要求访问的顺序为从左到右注:记忆方法,所有的顺序都是按照从左到右,前中后指的是根节点的前中后,层序一层一层的二叉树和红黑树有什么区别?[面试5.0]二叉树: 优点: 查原创 2022-01-30 20:39:28 · 381 阅读 · 0 评论 -
Java数据结构-树状数组
什么是树状数组?[面试5.0]使用数组表示多叉树的结构,和优先队列有点类似,区别在于优先队列只表示二叉树主要用来: 更新数组元素的数值并且求数组前K个元素的总和或平均值时间复杂度为O(logN)树状数组的第一个元素是空节点,若有y是x的父节点,那么需要满足y = x - (x & (-x))...原创 2022-01-30 20:39:03 · 848 阅读 · 0 评论 -
Java数据结构-队列
什么是队列?[面试5.0]先进先出,只能在一端进一端出,底层使用双链表实现(双链表的头指针允许在队头查看和删除数据,尾指针允许在队尾查看和添加数据)什么是双端队列?[面试5.0]使用双链表实现队列的头尾两端能在O(1)的时间内进行数据的增删查主要用于实现长度动态变化的窗口或连续区间什么是阻塞队列?[面试5.0]就是不管并发有多高,总是只有一个线程能进行入队或出队什么是有界队列,无界队列?[面试5.0]有界队列指队列有长度,当队列满时,只能出队无界队列没有给队列指定长度,但受计算机原创 2022-01-30 20:38:54 · 449 阅读 · 0 评论 -
Java数据结构-线段树
什么是线段树?[面试5.0]二叉搜索树,每个节点保存的都是数组里某一段的总和(父节点数据是子节点的数据之和),叶子节点保存的是数组元素的值主要用来: 更新数组元素的数值并且求数组任意一段区间里元素的总和或平均值时间复杂度为O(logN)...原创 2022-01-29 19:59:26 · 79 阅读 · 0 评论 -
Java数据结构-链表
什么是单向链表(LinkList)?[面试5.0]每个节点由一个数据域和指针域组成,指针单向头节点数据域为空,主要用来找到当前链表尾节点没有尾指针单向链表数据结构什么是双向链表(LinkList)?[面试5.0]每个节点由一个数据域和前后指针域组成头节点数据域和前指针为空,主要用来找到当前链表尾节点没有尾指针双向链表数据结构什么是循环链表(LinkList)?[面试5.0]在单向链表的基础上,尾节点的next指向头结点循环链表数据结构什么是双向循环链表(LinkList)?[面试5.原创 2022-01-29 19:58:59 · 66 阅读 · 0 评论 -
Java数据结构-高级
高级数据结构有哪些?[面试2.0]优先队列(Priority Queue)图(Graph)前缀树(Trie)线段树(Segment Tree)树状数组(Fenwick Tree / Binary Indexed Tree)什么是优先队列?[面试5.0]保证优先级别最高的数据优先取出,优先级别是自定义的优先队列的本质:二叉堆,即用数组实现完全二叉树,(是一个数组,元素为其他元素的父节点或子节点)基本操作:向上筛选,向下筛选(向上或向下根据优先级别,互相交换元素)使用场景:从杂乱无章的数据中心按照一原创 2022-01-29 19:57:21 · 82 阅读 · 0 评论 -
java分布式事务
你们的分布式事务怎么处理的?[面试9.0]2PC事务方案TCC方案(也是基于2PC)可靠消息最终一致性方案2PC事务方案?[面试7.5]2PC两阶段分布式事务提交协议两阶段提交又称2PC,2PC是一个非常经典的强一致,中心化的原子提交协议第一阶段: 投票阶段事务询问: 协调者向所有参与者发送事务预处理请求,并等待响应执行事务: 各个参与者执行本地事务操作,写Undo和Redo日志,此时事务并未提交反馈结果: 各参与者向协调者反馈yes或no第二阶段: 提交事务所有参与者都返回Yes后,协调者向原创 2022-01-29 19:56:39 · 1018 阅读 · 0 评论 -
Java基础-Unsafe
Unsafe类有什么特点?[面试5.0]Unsafe类可以通过反射直接调用native方法操作内存原创 2022-01-29 19:53:48 · 80 阅读 · 0 评论 -
Java基础-CountDownLatch
CountDownLatch用于多线程的什么场景?[面试3.0]最大并行场景: 测试一个单例类,创建一个初始计数为1的CountDownLatch,并让所有线程都在这个锁上等待(一次countDown就可以测试最大的并发性,类似于赛跑,将多个线程放到起点,等待发令枪响,然后同时开跑)等待执行场景: 主线程需要等待多个子线程加载完毕,之后再继续执行...原创 2022-01-29 19:54:06 · 82 阅读 · 0 评论 -
Java基础-单例
单例使用场景是什么?[面试6.0]需要频繁实例化然后销毁的对象创建对象时耗时过多或者耗资源过多,但又经常用到的对象有状态的工具类对象频繁访问数据库或文件的对象如何在Java中创建线程安全的单例?[面试6.0]饿汉式: 利用JVM构造时即new实例,暴露获取实例的方法,都是操作当前类,推荐用,唯一的缺点是没有静态内部类资源利用率高懒汉式: 实例在第一次使用时被new实例化,不能使用,会产生并发问题双重检测: 第一层判断实例是否为空,第二层做块同步再判断实例是否为空,不能使用,由于CPU指令重排序会原创 2022-01-29 19:53:37 · 60 阅读 · 0 评论 -
Java基础-常见的锁
Java中关于锁的名词有哪些?[面试1.0]自旋锁, 阻塞锁, 可重入锁, 读写锁, 互斥锁, 悲观锁, 乐观锁, 公平锁, 偏向锁, 对象锁, 线程锁, 锁粗化, 锁消除, 轻量级锁, 重量级锁, 信号量, 独享锁, 共享锁, 分段锁等Java锁的优化策略是什么?[面试2.0]读写分离分段加锁减少锁持有的时间多个线程尽量以相同的顺序去获取资源Java自旋锁是什么?[面试2.0]自旋锁:当前线程不停地的在循环体内执行,当循环的条件被其他线程改变时,其他线程才能进入临界区当有第二个线程调原创 2022-01-29 19:53:26 · 137 阅读 · 0 评论 -
docker
docker解决了什么问题?[面试7.0]Docker统一了基础设施环境(在Docker里可以用你熟悉的任何操作系统)Docker统一了程序的打包方式支持Docker镜像的导入Docker统一部署方式docker run原创 2022-01-29 19:53:12 · 597 阅读 · 0 评论 -
Java基础-CopyOnWriteArrayList
CopyOnWriteArrayList的原理是什么?[面试5.0]?当有数据写入的时候,将原有数据拷贝一份,然后在拷贝的这份数据中做写操作,写成功后再将原来的数组指向到新的数组,很多操作都是在锁的操作下进行的,避免多线程复制数据时复制了多份CopyOnWriteArrayList的缺点: 元素过多可能会导致Full GC,因为是复制操作(慎用)不能用于实时读的场景,因为复制,新增都需要时间,可能会读到旧数据,所以能,CopyOnWriteArrayList适用于读多写少的场景,因为只有写才加锁..原创 2022-01-29 19:54:14 · 334 阅读 · 0 评论 -
Java基础-Array
java的数组是静态数据类型还是动态数据类型?[面试5.0]动态数据类型,因为最终是根据newarray(创建基本数组)和anewarray(创建引用型数组)动态创建数组的原创 2022-01-28 20:00:24 · 48 阅读 · 0 评论 -
java分布式会话
分布式会话怎么实现?[面试7.0]spring session + redis给sping session配置基于redis来存储session数据,然后配置了一个spring session的过滤器将session相关操作都会交给spring session来管了,在代码中用原生的session操作,就是直接基于spring sesion从redis中获取数据了...原创 2022-01-28 19:59:48 · 926 阅读 · 0 评论 -
java分布式
什么是分布式?分布式跟集中式有哪些区别?[面试8.0]分布式: 很多子系统组成一个整体,多个子系统可以协作完成一个任务每一个子系统都可以部署在多台机器上面子系统之间有调用依赖关系,需要互相通信分布式系统和集中式系统的区别: 高可用性: 集中式系统中央处理服务器一宕机就崩盘了,分布式系统某一服务器宕机后其他机器可以继续提供服务高并发性: 集中式不支持高并发,流量全部由中央处理器支持,分布式系统分摊流量,负载均衡数据储存和处理: 集中式是靠中央处理器,分布式系统靠本机或其他机器协作处理为什么要使用微服务原创 2022-01-28 19:59:36 · 184 阅读 · 0 评论 -
java面试题-敏捷开发
什么是敏捷开发?[面试6.5]一种以人为核心,持续迭代的开发方法迭代:将一个大任务分解为多个小任务,将任务进行分期开发,每一期完成后进行评审和总结敏捷分开有哪些呢:比如:Scrum(增量开发),XP(极限编程),Scrum注重开发过程,XP注重结果敏捷开发Scrum怎么理解?[面试6.5]Scrum将开发任务分为多个周期(Sprint),需要先对每个Sprint确定需要完成的需求Scrum里面的成员包括: 产品负责人: 与客户沟通需求,交付日期,与团队沟通需求,考虑团队研发实力Scrum负责人:原创 2022-01-28 19:59:25 · 691 阅读 · 0 评论 -
select_poll_epoll
什么是Epoll?[面试6.5]epoll有一个特殊内存由应用程序和内核共享,内核可以直接读取,避免了用户态内存向内核态拷贝的问题epoll将Socket对应的文件描述符放到内核中,系统检测有事件发生时,通过回调通知进程执行,而不是采用轮询的方式select,poll,epoll有什么区别?[面试6.5]三种都是IO多路复用的实现select: select会维护文件描述符数据结构,且是遍历轮询文件描述符(fd),当量fd比较大时,轮询的效率会降低select支持的文件描述符也有限制,默认是10原创 2022-01-28 19:59:10 · 100 阅读 · 0 评论 -
java任务调度
Quartz大致是怎样的?[面试5.0]JobDetail和Trigger绑定,一个JobDetail可以绑定多个Trigger一个任务调度类实现Job接口,并实现excute方法,并通过Scheduler将JobDetail和Trigger绑定上下文:JobExecutionContext参数传递:JobStore将参数值存入内存或数据库,并通过上下文对象可以拿到怎样设计分布式任务调度?[面试7.0]将任务存放到数据库(任务配置表)任务管理动态管理配置(利用Scheduler的API做)集群化原创 2022-01-28 19:58:41 · 1408 阅读 · 0 评论 -
java面试题-代理
Jdk代理和CGLIB代理有什么区别?[面试7.0]标题JDK代理CGLIB代理代理方式通过接口进行代理通过子类覆盖父类方法(继承)的方式进行代理Spring代理的自动选择Bean实现了接口时Bean未实现接口时,Spring也可以强制使用CG代理代理速度较CG慢,利用的是反射方式CG通过动态字节码技术生成代理子类代理方法限制/CG不能对final的方法进行代理,因为final不能继承和覆盖...原创 2022-01-28 19:58:20 · 237 阅读 · 0 评论 -
为什么https比http安全
什么是Https?[面试8.0]HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密Https为什么比Http更安全?[面试8.0]HTTPS采用了对称加密+非对称加密,使用了证书,具体安全性需要对https的工作流程做分析,工作流程如下Https工作流程...原创 2022-01-28 19:58:06 · 2483 阅读 · 0 评论 -
http的个版本的区别
Http1.0和Http1.1有什么区别?[面试6.0]缓存处理: HTTP1.0主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准HTTP1.1引入了更多的缓存控制策略,如:Entity tag,If-Unmodified-Since,If-Match,If-None-Match等带宽优化: HTTP 1.0每次服务端都发送所有数据通知客户端HTTP 1.1支持只发送header信息(不带任何body信息),若服务器认为客户端有权限访问服务器则返回100,否原创 2022-01-28 19:57:46 · 102 阅读 · 0 评论 -
Java基础-Basic
Java有哪些基础数据类型?[面试3.0]整数类型(byte,short,int,long)浮点类型(float,double)字符型(char,string)布尔型(boolean)引用数据类型有哪些?[面试3.0]类(class)接口(interface)数组([])Java语言的四大特性是什么?[面试3.0]封装: 把拥有共性的属性或方法归到一个类中,方便使用继承: 继承父类,可拥有天生父类的特性多态: 子类以父类方式出现,实现分别在多个子类各自内部实现抽象: 是对事物,行为的抽象原创 2022-01-27 21:44:58 · 275 阅读 · 0 评论 -
java分布式锁
什么是分布式锁?[面试8.0]分布式锁: 保证分布式环境下多个线程同时对一个共享变量进行修改或删除时加一把锁,该锁能保证同一时间只能有一个线程在操作分布式锁有哪些实现方式?[面试8.0]基于数据库的悲观锁和乐观锁实现数据库悲观锁: for update实现(要注意语句针对行级时,如果where条件的字段不走索引,那么会锁整个表)缺点:会造成其他线程阻塞,有锁表的风险,吞吐量低,适用于写多的场景锁定失败后需要用轮询(while循环)继续锁定,这样的话占用CPU资源数据库乐观锁: 表添加versio原创 2022-01-27 21:44:34 · 213 阅读 · 0 评论