面试题目 金服-资深工程师
蚂蚁 Java 一面
1. 二叉搜索树和平衡二叉树有什么关系, 强平衡二叉树( AVL 树) 和弱平衡二叉树
(红黑树) 有什么区别
二叉搜索树: 也称二叉查找树, 或二叉排序树。 定义也比较简单, 要么是一颗空
树, 要么就是具有如下性质的二叉树:
( 1) 若任意节点的左子树不空, 则左子树上所有结点的值均小于它的根结点的
值;
( 2) 若任意节点的右子树不空, 则右子树上所有结点的值均大于它的根结点的
值;
(3) 任意节点的左、 右子树也分别为二叉查找树;
(4) 没有键值相等的节点。
平衡二叉树: 在二叉搜索树的基础上多了两个重要的特点
(1) 左右两子树的高度差的绝对值不能超过 1;
(2) 左右两子树也是一颗平衡二叉树。
红黑书: 红黑树是在普通二叉树上, 对每个节点添加一个颜色属性形成的, 需要
同时满足一下五条性质
(1) 节点是红色或者是黑色;
(2) 根节点是黑色;
(3) 每个叶节点(NIL 或空节点) 是黑色;
(4) 每个红色节点的两个子节点都是黑色的(也就是说不存在两个连续的红色节
点) ;
(5) 从任一节点到其没个叶节点的所有路径都包含相同数目的黑色节点。
区别: AVL 树需要保持平衡, 但它的旋转太耗时, 而红黑树就是一个没有 AVL 树
那样平衡, 因此插入、 删除效率会高于 AVL 树, 而 AVL 树的查找效率显然高于红黑树。
参考文章 1: https://blog.csdn.net/qq_25940921/article/details/82183093
参考文章 2: https://blog.csdn.net/yang_yulei/article/details/26066409
2. 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 树却需要重复地中序遍
历
参考文章: https://www.cnblogs.com/xueqiuqiu/articles/8779029.html
3. HashMap 如何解决 Hash 冲突
通过引入单向链表来解决 Hash 冲突。 当出现 Hash 冲突时, 比较新老 key 值是否相等,
如果相等, 新值覆盖旧值。 如果不相等, 新值会存入新的 Node 结点, 指向老节点, 形成
链式结构, 即链表。
当 Hash 冲突发生频繁的时候, 会导致链表长度过长, 以致检索效率低, 所以 JDK1.8 之
后引入了红黑树, 当链表长度大于 8 时, 链表会转换成红黑书, 以此提高查询性能。
参考文章: https://blog.csdn.net/qedgbmwyz/article/details/79908333
4. epoll 和 poll 的区别, 及其应用场景
select 和 epoll 都是 I/O 多路复用的方式, 但是 select 是通过不断轮询监听 socket 实
现, epoll 是当 socket 有变化时通过回掉的方式主动告知用户进程实现
参考文章:https://www.cnblogs.com/hsmwlyl/p/10652503.html
5. 简述线程池原理, FixedThreadPool 用的阻塞队列是什么?
Java 线程池的实现原理其实就是一个线程集合 workerSet 和一个阻塞队列 workQueue。
当用户向线程池提交一个任务(也就是线程)时, 线程池会先将任务放入 workQueue 中。
workerSet 中的线程会不断的从 workQueue 中获取线程然后执行。 当 workQueue 中没有
任务的时候, worker 就会阻塞, 直到队列中有任务了就取出来继续执行。
FixedThreadPool 使用的是“无界队列”LinkedBlockingQueue
参考文章: https://blog.csdn.net/wanghao112956/article/details/99938893
6. sychronized 和 ReentrantLock 的区别
( 1) ReentrantLock 显示获得、 释放锁, synchronized 隐式获得释放锁
( 2) ReentrantLock 可响应中断、 可轮回, synchronized 是不可以响应中断的, 为处理
锁的不可用性提供了更高的灵活性
( 3) ReentrantLock 是 API 级别的, synchronized 是 JVM 级别的
( 4) ReentrantLock 可以实现公平锁
( 5) ReentrantLock 通过 Condition 可以绑定多个条件
参考文章: https://blog.csdn.net/zxd8080666/article/details/83214089
7. sychronized 的自旋锁、 偏向锁、 轻量级锁、 重量级锁, 分别介绍和联系
自旋锁: 果持有锁的线程能在很短时间内释放锁资源, 那么那些等待竞争锁的线程就不
需要做内核态和用户态之间的切换进入阻塞挂起状态, 它们只需要等一等( 自旋) ,
等持有锁的线程释放锁后即可立即获取锁, 这样就避免用户线程和内核的切换的消耗。
偏向锁: 顾名思义, 它会偏向于第一个访问锁的线程, 如果在运行过程中, 同步锁只
有一个线程访问, 不存在多线程争用的情况, 则线程是不需要触发同步的, 减少加锁/ 解
锁
的一些 CAS 操作( 比如等待队列的一些 CAS 操作) , 这种情况下, 就会给线程加一个
偏向锁。 如果在运行过程中, 遇到了其他线程抢占锁, 则持有偏向锁的线程会被挂起,
JVM 会
消除它身上的偏向锁, 将锁恢复到标准的轻量级锁。
轻量级锁: 轻量级锁是由偏向所升级来的, 偏向锁运行在一个线程进入同步块的情况
下, 当第二个线程加入锁争用的时候, 偏向锁就会升级为轻量级锁;
重量级锁: 我们知道, 我们要进入一个同步、 线程安全的方法时, 是需要先获得这个
方法的锁的, 退出这个方法时, 则会释放锁。 如果获取不到这个锁的话, 意味着有别的线
程在
执行这个方法, 这时我们就会马上进入阻塞的状态, 等待那个持有锁的线程释放锁,
然后再把我们从阻塞的状态唤醒, 我们再去获取这个方法的锁。 这种获取不到锁就马上进
入阻
塞状态的锁, 我们称之为重量级锁。
参考文章: https://blog.csdn.net/zqz_zqz/article/details/70233767
参考文章: https://www.cnblogs.com/myseries/p/10773078.html
8. HTTP 有哪些问题, 加密算法有哪些, 针对不同加密方式可能产生的问题, 及其
HTTPS 是如何保证安全传输的
HTTP 的不足:
通信使用明文, 内容可能会被窃听;
不验证通信方的身份, 因此有可能遭遇伪装;
无法证明报文的完整性, 有可能已遭篡改;
常用加密算法: MD5 算法、 DES 算法、 AES 算法、 RSA 算法
参考文章: https://blog.csdn.net/baidu_22254181/article/details/82594072
蚂蚁 Java 二面
1. 设计模式有哪些大类, 及熟悉其中哪些设计模式
创建型模式、 结构型模式、 行为型模式
参考文章: http://c.biancheng.net/design_pattern/
2. volatile 关键字, 他是如何保证可见性, 有序性
volatile 可以保证线程可见性且提供了一定的有序性, 但是无法保证原子性。 在 JVM 底
层 volatile 是采用“内存屏障”来实现的。
观察加入 volatile 关键字和没有加入 volatile 关键字时所生成的汇编代码发现, 加入
volatile 关键字时, 会多出一个 lock 前缀指令,
lock 前缀指令实际上相当于一个内存屏障( 也成内存栅栏) , 内存屏障会提供 3 个功
能:
I. 它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置, 也不会把前面
的指令排到内
存屏障的后面; 即在执行到内存屏障这句指令时, 在它前面的操作已经全部完成;
II. 它会强制将对缓存的修改操作立即写入主存;
III. 如果是写操作, 它会导致其他 CPU 中对应的缓存行无效。
参考文章: https://blog.csdn.net/summerZBH123/article/details/80547516
3. Java 的内存结构, 堆分为哪几部分, 默认年龄多大进入老年代
Java 的内存结构: 程序计数器、 虚拟机栈、 本地方法栈、 堆、 方法区。
Java 虚拟机根据对象存活的周期不同, 把堆内存划分为几块, 一般分为新生代、 老年代
和永久代。
默认的设置下, 当对象的年龄达到 15 岁的时候, 也就是躲过 15 次 Gc 的时候, 他就
会转移到老年代中去躲过 15 次 GC 之后进入老年代。
4. ConcurrentHashMap 如何保证线程安全, jdk1.8 有什么变化
JDK1.7: 使用了分段锁机制实现 ConcurrentHashMap, ConcurrentHashMap 在对象中保
存了一个 Segment 数组, 即将整个 Hash 表划分为多个分段;
而每个 Segment 元素, 即每个分段则类似于一个 Hashtable; 这样, 在执行 put 操作时
首先根据 hash 算法定位到元素属于哪个 Segment, 然后对该
Segment 加锁即可。 因此, ConcurrentHashMap 在多线程并发编程中可是实现多线程
put 操作, 不过其最大并发度受 Segment 的个数限制。
JDK1.8: 底层采用数组+链表+红黑树的方式实现, 而加锁则采用 CAS 和 synchronized
实现
参考文章: https://blog.csdn.net/weixin_44460333/article/details/86770169
5. 为什么 ConcurrentHashMap 底层为什么要红黑树
因为发生 hash 冲突的时候, 会在链表上新增节点, 但是链表过长的话会影响检索效
率, 引入红黑书可以提高插入和查询的效率。
6. 如何做的 MySQL 优化
MySQL 的优化有多种方式, 我们可以从以下几个方面入手:
存储引擎的选择、 字段类型的选择、 索引的选择、 分区分表、 主从复制、 读写分离、
SQL 优化。 详细优化请查看参考文章
参考文章: https://blog.csdn.net/zls986992484/article/details/52860496
7. 讲一下 oom 以及遇到这种情况怎么处理的, 是否使用过日志分析工具
OOM, 全称“Out Of Memory”, 翻译成中文就是“内存用完了”, 当 JVM 因为没有足够的
内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时, 就会抛出这个 error。
处理过程: 首先通过内存映射分析工具 如 Eclipse Memory Analyzer 堆 dump 出的异常
堆转储进行快照解析确认内存中的对象是否是必要的,
也就是先分清楚是 内存泄漏 Memory Leak 还是 Memory Overflow 如果是内存泄漏 可
通过工具进一步查看泄露的对象到 GC Roots 的引用链,
就能找到泄露对象是怎么通过路径与 GC Roots 相关联导致垃圾收集器无法回收他们如
果不存在泄露 就检查堆参数 -Xmx 与 -Xms 与机器物理
内存对比是否还可以调大 从代码上检测 是否是某些对象的生命周期过长持有状态时间
过长 尝试减少代码运行期间的内存消耗。
参考文章: https://www.cnblogs.com/ThinkVenus/p/6805495.html
蚂蚁 Java 三面
1. 项目介绍
2. 你们怎么保证 Redis 缓存和数据库的数据一致性?
可以通过双删延时策略来保证他们的一致性。
参考文章: https://blog.kido.site/2018/12/07/db-and-cache-02/
3. Redis 缓存雪崩? 击穿? 穿透?
缓存雪崩: 缓存同一时间大面积的失效, 所以, 后面的请求都会落到数据库上, 造成数
据库短时间内承受大量请求而崩掉。
缓存击穿: key 对应的数据存在, 但在 redis 中过期, 此时若有大量并发请求过来, 这
些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存, 这个时候大并发的请求
可能会瞬间把后端 DB 压垮。
缓存穿透: key 对应的数据在数据源并不存在, 每次针对此 key 的请求从缓存获取不
到, 请求都会到数据源, 从而可能压垮数据源。 比如用一个不存在的用户 id 获取用户信
息, 不论缓存还是数据库都没有, 若黑客利用此漏洞进行攻击可能压垮数据库。
4. 你熟悉哪些消息中间件,有做过性能比较?
RocketMQ、 RabbitMQ、 ActiveMQ、 Kafka
参考文章: https://blog.csdn.net/wqc19920906/article/details/82193316
面试题目 金服-资深工程师相关推荐
- 蚂蚁金服资深技术专家经国:云原生时代微服务的高可用架构设计
经国 蚂蚁金服数字金融线担任技术风险架构师 读完需要 15 分钟 速读仅需 5 分钟 经国,蚂蚁金服资深技术专家,毕业于浙江大学. 2014 年加入蚂蚁金服,先后负责过支付宝的单元化.弹性.去 ORA ...
- 面试 | 蚂蚁金服面试经历
晚上面试蚂蚁金服,前端,觉得大厂问的问题就是不一样,有纵向有横向,针对下列几个问题,我面试时候答的不好,现在重新学习,沉思一会... 第一个问题: 1.先问熟悉jq吗?解释一下jq的架构, jq源码的 ...
- 面试蚂蚁金服(意外拿到offer)分享四面经历,从线程锁到数据库
最近一位笔者经历了漫长一个月的等待,终于在前几天通过面试官获悉已被蚂蚁金服录取,这期间的焦虑.痛苦自不必说,知道被录取的那一刻,一整年的阴霾都一扫而空了. 笔者面的是阿里的Java研发工程师岗,面试流 ...
- 看看别人是怎么面试蚂蚁金服的!社招Java面经分享
最近几天,有的人在偷偷地买蚂蚁的基金,有的人却偷偷的在蚂蚁面试. 最近确实是面试的好时候.大家都奔着大厂去的,最近也分享了好多大厂的面经了,什么阿里.字节.京东.美团.百度.腾讯.滴滴.网易-已经数不 ...
- 蚂蚁金服资深总监韩鸿源:企业级数据库平台的持续与创新
2019年11月19日,蚂蚁金服在北京举办"巅峰洞见·聚焦金融新技术"发布会,介绍2019双11支付宝背后的技术,并重磅发布全新OceanBase 2.2版本.欢迎持续关注- 蚂蚁 ...
- 分布式SQL学习总结(1)——蚂蚁金服资深总监韩鸿源:像使用集中式数据库一样使用OceanBase分布式数据库
很多人对蚂蚁金服的了解还仅仅停留在支付宝,其实今天的蚂蚁金服已经逐步成长为大型的金融集团,覆盖了很多范围的业务,这些业务中不仅包括超过8.7亿实名注册用户,日活2亿多的支付宝APP,还包括服务亿级免押 ...
- 蚂蚁金服软件测试工程师一面面试题(附答案)建议收藏
根据面试录音整理,真实有效. 面试时间:2021.4.17. 面试地点:西溪园区. 面试岗位:软件测试工程师. 一:基础部分: 1. 什么是软件测试? 答:软件测试就是发现软件当中存在的缺陷,提高软件 ...
- 蚂蚁金服资深架构师解析Zeppelin不是飞艇
Zeppelin是一个高性能,高可用的分布式Key-Value存储平台,以高性能.大集群为目标,说平台是因为Zeppelin不是终点而是起点,在Zeppelin的基础上,不仅能够提供KV的访问,还可以 ...
- 缓存在哪里_蚂蚁金服中间件(4轮题目):MVCC+缓存穿透+悲观锁+NIO+负载均衡等
第一轮 说说HaspMap底层原理?再说说它跟HaspTable和ConcurrentHashMap他们之间的相同点和不同点? 讲讲jdk1.7和1.8的区别? 几种内置的线程池 MySQL事务隔离级 ...
最新文章
- 他是阿里 P11,靠写代码写成合伙人,身家几十亿,没有他,我们可能刷不了淘宝!...
- matlab 查看函数属性,matlab – 使用FFT属性查找2D函数的导数
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记32 NSNotification
- 对软件工程课程的期望
- Vue页面加载使用二级属性的时候报错TypeError: Cannot read property ‘name‘ of undefined“
- 计算机基础算术加法,2011年自考计算机基础知识精选部分及答案(一)-2
- 工具型产品+社区为何无法从根本上解决留存问题?
- leetcode27:移除元素(暴力+双指针)
- java 读取pdf、word、Excel文件
- apicloud - addEventListener 接收不到 sendEvent 的解决方法
- Thinkphp新增字段无法插入到数据库问题
- javascript开发中的封装模式(转)
- TechEd2011分享
- linux svn服务器同步,Linux服务器实现SVN与WEB同步解决方案
- 【学习教程】CMIP6数据处理方法与典型案例分析
- CodeSmith 介绍
- 赛制出炉!西门子白帽黑客大赛吹响集结号
- marshmallow——快速入门
- 微信小程序map组件callout与label简单用法
- WKWebView使用及注意点(keng)
热门文章
- mysql json unquote_mysql json 操作
- Int 的范围 是 65535 还是2147483647
- vs2015 重装失败 修复失败 error1402 could not open key: UNKNOW\Components
- IA32计算机系统,计算机CPU之CISC、RISC、x86、IA32、x86-64、IA64、ARM
- 关于amd64和ia64的理解
- 【VMware虚拟机 U盘启动】
- 计算机科学家莱,科学界也有很多让人感动的人,麻省理工学院计算机科学家巴尔齐莱就是其中的一个...
- 【SQL】匹配两张表中时间最近的记录
- 退役军人信息化服务平台订花开发服务流程
- eclipse tomcat启动失败