写点什么

已拿 offer 热乎乎的蚂蚁金服面经分享,建议收藏 (Java 岗、附答案)

用户头像
极客good
关注
发布于: 刚刚

红黑树(Red-Black Tree,简称 R-B Tree),它一种特殊的二叉查找树。红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。除了具备该特性之外,红黑树还包括许多额外的信息。


红黑树的每个节点上都有存储位表示节点的颜色,颜色是红(Red)或黑(Black)。红黑树的特性:


每个节点或者是黑色,或者是红色。


根节点是黑色。


每个叶子节点是黑色。


如果一个节点是红色的,则它的子节点必须是黑色的。


从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。


关于它的特性,需要注意的是:


第一,特性(3)中的叶子节点,是只为空(NIL 或 null)的节点。


第二,特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。



具体实现代码这里不贴了,要实现起来,需要包含的基本操作是添加、删除和旋转。在对红黑树进行添加或删除后,会用到旋转方法。旋转的目的是让树保持红黑树的特性。旋转包括两种:左旋 和 右旋。


红黑树的应用比较广泛,主要是用它来存储有序的数据,它的查找、插入和删除操作的时间复杂度是 O(lgn)。


TCP 三次握手


三次握手(three times handshake;three-way handshake)所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。


为了提供可靠的传送,TCP 在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP 总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到 TCP。



第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SENT 状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。


第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;


第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED(TCP 连接成功)状态,完成三次握手。


2.突然的二面


一面的时候大概是 3 月 12 号,面完等了差不多半个月才突然接到二面面试官的电话。


介绍项目


Storm 怎么保证一致性


Storm 是一个分布式的流处理系统,利用 anchor 和 ack 机制保证所有 tuple 都被成功处理。如果 tuple 出错,则可以被重传,但是如何保证出错的 tuple 只被处理一次呢?Storm 提供了一套事务性组件 Transaction Topology,用来解决这个问题。


Transactional Topology 目前已经不再维护,由 Trident 来实现事务性 topology,但是原理相同。


参考:https://dwz.cn/8bXRPexB


说一下 hashmap 以及它是否线程安全


HashMap 基于哈希表的 Map 接口的实现。HashMap 中,null 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为 null。HashMap 中 hash 数组的默认大小是 16,而且一定是 2 的指数。Hashtable、HashMap 都使用了 Iterator。而由于历史原因,Hashtable 还使用了 Enumeration 的方式 。HashMap 实现 Iterator,支持 fast-fail。


哈希表是由数组+链表组成的,它是通过把 key 值进行 hash 来定位对象的,这样可以提供比线性存储更好的性能。



HashMap 不是线程安全的。


十亿条淘宝购买记录,怎么获取出现最多的前十个


这是一道典型的有限内存的海量数据处理的题目。一般这类题目的解答无非是以下几种:


分治,hash 映射,堆排序,双层桶划分,Bloom Filter,bitmap,数据库索引,mapreduce 等。


具体情形都有很多不同的方案。这类题目可以到网上搜索一下,了解下套路,后面就基本都会了。


平时有没有用 linux 系统,怎么查看某个进程


ps aux|grep java 查看 java 进程


ps aux 查看所有进程


ps –ef|grep tomcat 查看所有有关 tomcat 的进程


ps -ef|grep --color java 高亮要查询的关键字


kill -9 19979 终止线程号位 19979 的进程


说一下 Innodb 和 MySIAM 的区别


MyISAM 类型不支持事务处理等高级处理,而 InnoDB 类型支持。MyISAM 类型的表强调的是性能,其执行数度比 InnoDB 类型更快,但是不提供事务支持,而 InnoDB 提供事务支持以及外部键等高级数据库功能。


InnoDB 不支持 FULLTEXT 类型的索引。


InnoDB 中不保存表的具体行数,也就是说,执行 select count(*) from table 时,InnoDB 要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。注意的是,当 count(*)语句包含 where 条件时,两种表的操作是一样的。


对于 AUTO_INCREMENT 类型的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中,可以和其他字段一起建立联合索引。


DELETE FROM table 时,InnoDB 不会重新建立表,而是一行一行的删除。


LOAD TABLE FROM MASTER 操作对 InnoDB 是不起作用的,解决方法是首先把 InnoDB 表改成 MyISAM 表,导入数据后再改成 InnoDB 表,但是对于使用的额外的 InnoDB 特性(例如外键)的表不适用。


说一下 jvm 内存模型,介绍一下你了解的垃圾收集器


其实并没有 jvm 内存模型的概念。应该是 Java 内存模型或者 jvm 内存结构,这里面试者一定要听清楚问的是哪个,再回答。


可以参考:JVM 内存结构 VS Java 内存模型 VS Java 对象模型


你说你是大数据方向的,了解哪些大数据框架


作者回答了一些 zookeeper、storm、HDFS、Hbase 等


其他问题


100 个有序的整型,如何打乱顺序?


如何设计一个可靠的 UDP 协议?


二面大概就是这些,其中 storm 一致性这个问题被面试官怀疑了一下,就有点紧张,其实没答错,所以还是要对知识掌握得更明确才行。


3.准备充足的三面


清明节的时候例外地没有回家扫墓,因为知道自己的弱项是操作系统和海量数据题这块,所以想着恶补这方面的知识,不过之后的面试意外的并没有问到这方面的内容。


介绍项目


项目介绍完之后没问太多


介绍一下 hashmap


HashMap 真的是面试高频题,多次面试都问到了,一定要掌握。


介绍一下并发


这里可以把整个并发的体系都说下,包括 volatile、synchronized、lock、乐观悲观锁、锁膨胀、锁降级、线程池等


银行账户读写怎么做


我说了读写锁以及可能出现死锁问题


说一下关系型数据库和非关系型数据库的区别


非关系型数据库的优势:


性能:NOSQL 是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过 SQL 层的解析,所以性能非常高


可扩展性:同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。


使用场景:日志、


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


埋点、论坛、博客等


关系型数据库的优势:


复杂查询:可以用 SQL 语句方便的在一个表以及多个表之间做非常复杂的数据查询


事务支持:使得对于安全性能很高的数据访问要求得以实现。


使用场景:所有有逻辑关系的数据存储


如何访问链表中间节点


对于这个问题,我们首先能够想到的就是先遍历一遍整个的链表,然后计算出链表的长度,进而遍历第二遍找出中间位置的数据。这种方式非常简单。


若题目要求只能遍历一次链表,那又当如何解决问题?


可以采取建立两个指针,一个指针一次遍历两个节点,另一个节点一次遍历一个节点,当快指针遍历到空节点时,慢指针指向的位置为链表的中间位置,这种解决问题的方法称为快慢指针方法。


说下进程间通信,以及各自的区别


进程间通信是指在不同进程之间传播或交换信息。方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams 等。


访问淘宝网页的一个具体流程,从获取 ip 地址,到怎么返回相关内容

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
已拿offer热乎乎的蚂蚁金服面经分享,建议收藏(Java岗、附答案)