阿里 P9 架构师力荐:Java 面试必刷的 17 套一线大厂真题(含答案)
金三银四过去之后,回顾好多同学的面试经历,总结出了这份大厂面试真题的合集(含答案),里面包含了 Java 中级到 Java 架构师的方方面面,其中大厂也包含了阿里巴巴,京东,百度,拼多多,顺丰,携程,唯品会,OPPO 等等大厂。
下面先给大家看一个总的目录大纲。
由于文章篇幅有限,楼主下面为大家展示部分的面试题内容,同时后边也会为大家分享面试的软技能(面试突击指导的视频+文字的教程)
大厂面试真题(含答案展示)
阿里巴巴
问题: 二叉搜索树和平衡二叉树有什么关系,强平衡二叉树(AVL 树)和弱平衡二叉树(红黑树)有什么区别
二叉搜索树:也称二叉查找树,或二叉排序树。定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树:
(1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)任意节点的左、右子树也分别为二叉查找树;
(4)没有键值相等的节点。
平衡二叉树:在二叉搜索树的基础上多了两个重要的特点
(1)左右两子树的高度差的绝对值不能超过 1;
(2)左右两子树也是一颗平衡二叉树。
红黑树:红黑树是在普通二叉树上,对每个节点添加一个颜色属性形成的,需要同时满足以下五条性质:
(1)节点是红色或者是黑色;
(2)根节点是黑色;
(3)每个叶节点(NIL 或空节点)是黑色;
(4)每个红色节点的两个子节点都是黑色的(也就是说不存在两个连续的红色节点);
(5)从任一节点到其每个叶节点的所有路径都包含相同数目的黑色节点。
区别:AVL 树需要保持平衡,但它的旋转太耗时,而红黑树就是一个没有 AVL 树那样平衡,因此插入、删除的效率会高于 AVL 树,而 AVL 树的查找效率显然高于红黑树。
问题: B 树和 B+树的区别,为什么 MySQL 要使用 B+树
B 树:
(1)关键字集合分布在整棵树中;
(2)任何一个关键字出现且只出现在一个结点中;
(3)搜索有可能在非叶子结点结束;
(4)其搜索性能等价于在关键字全集内做一次二分查找;
B+树:
(1)有 n 棵子树的非叶子结点中含有 n 个关键字(b 树是 n-1 个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b 树是每个关键字都保存着数据);
(2)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接;
(3)所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字;
(4)通常在 b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点;
(5)同一个数字会在不同节点中重复出现,根节点的最大元素就是 b+树的最大元素。
B+树相比于 B 树的查询优势:(1)B+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”;
(2)B+树查询必须查找到叶子节点,B 树只要匹配到即可不用管元素位置,因此 B+树查找更稳定(并不慢);
(3)对于范围查找来说,B+树只需遍历叶子节点链表即可,B 树却需要重复地中序遍历
问题:说说三种分布式锁?
1、Zookeeper:基于 zookeeper 瞬时有序节点实现的分布式锁,其主要逻辑如下(该图来⾃于 IBM⽹站)。⼤致思想即为:每个客户端对某个功能加锁时,在 zookeeper 上的与该功能对应的指定节点的⽬录下,⽣成⼀个唯⼀的瞬时有序节点。判断是否获取锁的⽅式很简单,只需要判断有序节点中序号最⼩的⼀个。当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁⽆法释放,⽽产⽣的死锁问题。
2、优点
锁安全性⾼,zk 可持久化,且能实时监听获取锁的客户端状态。⼀旦客户端宕机,则瞬时节点随之消失,zk 因⽽能第⼀时间释放锁。这也省去了⽤分布式缓存实现锁的过程中需要加⼊超时时间判断的这⼀逻辑。
3、缺点
性能开销⽐较⾼。因为其需要动态产⽣、销毁瞬时节点来实现锁功能。所以不太适合直接提供给⾼并发的场景使⽤。
4、实现
可以直接采⽤zookeeper 第三⽅库 curator 即可⽅便地实现分布式锁。
5、适⽤场景
对可靠性要求⾮常⾼,且并发程度不⾼的场景下使⽤。如核⼼数据的定时全量/增量同步等。
2、memcached:memcached 带有 add 函数,利⽤add 函数的特性即可实现分布式锁。add 和 set 的区别在于:如果多线程并发 set,则每个 set 都会成功,但最后存储的值以最后的 set 的线程为准。⽽add 的话则相反,add 会添加第⼀个到达的值,并返回 true,后续的添加则都会返回 false。利⽤该点即可很轻松地实现分布式锁。
2、优点
并发⾼效
3、缺点
memcached 采⽤列⼊LRU 置换策略,所以如果内存不够,可能导致缓存中的锁信息丢失。memcached⽆法持久化,⼀旦重启,将导致信息丢失。
4、使⽤场景
⾼并发场景。需要 1)加上超时时间避免死锁; 2)提供⾜够⽀撑锁服务的内存空间; 3)稳定的集群化管理。
3、redis:redis 分布式锁即可以结合 zk 分布式锁锁⾼度安全和 memcached 并发场景下效率很好的优点,其实现⽅式和 memcached 类似,采⽤setnx 即可实现。需要注意的是,这⾥的 redis 也需要设置超时时间。以避免死锁。可以利⽤jedis 客户端实现。
问题:sychronized 的自旋锁、偏向锁、轻量级锁、重量级锁,分别介绍和联系
自旋锁:如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗。
偏向锁:顾名思义,它会偏向于第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,减少加锁/解锁的一些 CAS 操作(比如等待队列的一些 CAS 操作),在这种情况下,就会给线程加一个偏向锁。 如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM 会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。轻量级锁:轻量级锁是由偏向锁升级来的,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁;
重量级锁:我们知道,当我们要进入一个同步、线程安全的方法时,是需要先获得这个方法的锁的,退出这个方法时,则会释放锁。如果获取不到这个锁的话,就意味着有别的线程在执行这个方法,这时我们就会马上进入阻塞的状态,等待那个持有锁的线程释放锁,然后再把我们从阻塞的状态唤醒,我们再去获取这个方法的锁。这种获取不到锁就马上进入阻塞状态的锁,我们称之为重量级锁
以上就是阿里巴巴的部分面试题,由于题目太多,楼主这里就不为大家一一展示出来了!
腾讯面试真题
问题:说说⼏种常⻅的消息中间件的区别?
1. 中⼩型公司⾸选 RabbitMQ:管理界⾯简单,⾼并发。
2. ⼤型公司可以选择 RocketMQ:更⾼并发,可对 rocketmq 进⾏定制化开发。
3. ⽇志采集功能,⾸选 kafka,专为⼤数据准备。
问题:Spring Cloud 服务发现原理?
a. 每 30s 发送⼼跳检测重新进⾏租约,如果客户端不能多次更新租约,它将在 90s 内从服务器注册中移除。
a. 注册信息和更新会被复制到其他 Eureka 节点,来⾃任何区域的客户端可以查找到注册中⼼信息,每 30s 发⽣⼀次复制来定位他们的服务,并进⾏远程调⽤。
b. 客户端还可以缓存⼀些服务实例信息,所以即使 Eureka 全挂掉,客户端也是可以定位到服务地址的。
问题:介绍下 Spring Cloud 各个组件?Spring Cloud 的注册中⼼除了 eureka 还可以⽤什么?
Spring Cloud 的⼯作原理
springcloud 由以下⼏个核⼼组件构成:
Eureka:各个服务启动时,Eureka Client 都会将服务注册到 Eureka Server,并且 Eureka Client 还可以反过来从 Eureka Server 拉取注册表,从⽽知道其他服务在哪⾥
Ribbon:服务间发起请求的时候,基于 Ribbon 做负载均衡,从⼀个服务的多台机器中选择⼀台
Feign:基于 Feign 的动态代理机制,根据注解和选择的机器,拼接请求 URL 地址,发起请求
Hystrix:发起请求是通过 Hystrix 的线程池来⾛的,不同的服务⾛不同的线程池,实现了不同服务调⽤的隔离,避免了服务雪崩的问题
Zuul:如果前端、移动端要调⽤后端系统,统⼀从 Zuul⽹关进⼊,由 Zuul⽹关转发请求给对应的服务
注册中心还是可以用 ZooKeeper 的。
面试太多,就不为大家全部展示出来了,就随便截取了几道题目,同时还为大家准备一套面试 HR 面试的软技能篇,这套学习教程也是通过视频+笔记的形式送给大家的~
配套笔记
配套笔记
以上全部的学习资源都是马士兵老师免费赠送给大家,需要全部免费获取的朋友,麻烦帮忙点赞、收藏文章,关注我,然后加小助理 VX:wjj2632646 领取即可!
版权声明: 本文为 InfoQ 作者【Java架构追梦】的原创文章。
原文链接:【http://xie.infoq.cn/article/17accae4d3936dd4f2619d22c】。未经作者许可,禁止转载。
评论