记一次2020年蚂蚁金服的面试经历(小结)

这篇文章主要介绍了记一次蚂蚁金服的面试经历,文中详细的介绍了几回面试的记录,对你们的学习或者工做具备必定的参考学习价值,分享给你们,也但愿你们都面试成功
本文源自网络node

前言:

2016在实习的时候,当时一个一块儿实习的朋友在2020年5月份的时候忽然在微信上找我,问我要不要面试下蚂蚁金服。问了下相关信息才知道他在2019年11月的时候进到蚂蚁金服,如今招人就想到了我,问我要不要试一下。web

刚开始仍是有所顾虑的,由于毕竟是大厂,进去应该不容易,可是这个朋友进去了,想一想应该也没有很难吧,毕竟当时实习的时候,他技术并不怎么样。可是毕竟过去好几年了,如今人家可能变厉害了。面试

因此一开始并无急着提交简历,而是说准备下再提交简历。而后就准备了一周,写简历,刷题,在网上找蚂蚁金服的面经。提交了一份简历,而后发现简历上面没有写学历,幸亏他还没提交,就修改了下从新发了一份,而后他又给我提了几个建议,因此又改了一版,才最终提交。redis

提交简历后的次日下午,上班的时候蚂蚁金服的面试官打电话过来了,说要面试,当时正在上班,就说了下不方便,就约了当天晚上再面试。谁知道当天小组由于来了新人,晚上要聚餐,因此没办法,就厚着脸皮给面试官发了短信,说了下晚上临时有事不能参加,想约下次日或者周末。没想到面试官很理解,主要提出次日晚上八点面试,短信上还让我好好准备,好好加油。数据库

题外话: 有时间冲突的时候及时跟面试官沟通,每每第一面是技术面,你们都是作技术的,能理解的。 平时多交点朋友每每会有意外的惊喜。
在这里插入图片描述编程

电面一

次日晚上六点多快七点的时候面试官提早打电话了,这天是周五幸亏及时下班,本来是想着早点下班回去再准备准备,谁知道电话来的那么忽然,刚点好晚饭,还没来得及吃。既然电话都打来了,那就面呗,就到店外面面试了。数组

流程

一、2分钟的自我介绍

大体讲了本身的姓名,毕业院校,哪年毕业,我的爱好以及平时空闲时间作点什么,这个如实回答就好。由于以前有面试过,因此准备过。建议能够本身提早写下来,多说几遍,找点感受。缓存

二、你本身认为本身最熟悉的技术是什么?

这个就因人而异了,每一个人熟悉的东西都不同,必定要说本身最擅长的东西,不要给本身挖坑。由于面试官下一步就会根据你的回答进行提问。对于我来是,工做了几年学的东西多而杂,没有什么很深刻的,可是总不能说没有吧,因此就说了 Java 开发比较多,因此 Java 语言熟悉多一点。而后面试官就说:“好,那我就问你一点 Java 语言方面的。”安全

三、 HashMap 底层实现原理是什么?

这个做为一个面试必问的题目,因此我仍是提早准备过的,看过源码。因此这个问题不是问题,答完,面试官说回答的对了。
HashMap,HashTable,ConcurrentHashMap 面试必备,针对1.7和1.8的不一样实现加以说明。包括底层的数据结构,Hash 碰撞生成链表,Java8的链表转红黑树。微信

四、Java 的多线程有没有使用过

根据自身状况,用过就用过,没用过就没有用过。我回答有简单的使用过,可是使用的场景很少。面试官也就没追问了,说了不要紧,就继续。

五、讲一下线程池,以及实现固定大小线程池底层是如何实现的?

讲了下四中线程池,单一线程池,固定大小线程池,缓存线程池,定时线程池。可是关于固定大小线程池底层是如何实现的,回答的很差,面试官直接问底层的源码是否是没看过,就说是的。面试官说不要紧。。。

  • 追加:线程池底层都是经过ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)来实现的。

corePoolSize: 表示须要设置的线程个数; maximumPoolSize: 线程池容许的最大线程个数; keepAliveTime: 空闲线程存活的时间,超过这个时间就会被回收; unit: 存活时间的单位;workQueue: 须要执行的任务队列。threadFactory: 线程工厂,用于建立线程,通常用默认的便可; handler: 拒绝策略,当任务太多来不及处理,如何拒绝任务; 拒绝策略: 直接丢弃(DiscardPolicy) 丢弃队列中最老的任务(DiscardOldestPolicy) 抛异常(AbortPolicy) 将任务分给调用线程来执行(CallerRunsPolicy)

六、Redis 为何这么高效,使用的场景是什么?

回答了一下咱们使用 redis 作缓存和登陆 session 存在的场景,以及 redis 是单线程的。

一、彻底基于内存,大多数请求都是内存操做,很是快速;
二、数据结构简单,操做简单;
三、采用单线程,避免了没必要要的上下文切换和竞争条件,不存在多进程或者多线程的切换,不用考虑锁带来的性能消耗;
四、使用多路 I/O复用模型,非阻塞 IO

七、分布式服务是否了解,zookeeper,dubbo 是否使用过?

关于 zk 和 dubbo 这块用的很少,zk 主要是在使用 kafka 的时候会用到,可是不涉及原理上面的研究。dubbo 虽然项目中有用过,可是并非很深刻,就没说用过,直接说没用过。

八、幂等概念有没有了解过

幂等性是数学上的含义是对于参数 x,f(x)=f(f(x));好比绝对值函数。 在分布式环境下表示的是对于一样的请求,在一次或者屡次请求的状况下对系统的使用资源是同样的。保证失败重试不会致使提交两次。 方法: 带版本号的方式; 采用数据库惟一索引方式;

九、经常使用的数据库是什么?

咱们经常使用的数据库是 MySQL,因此就回答了 MySQL。

十、MySQL 的事务特性有哪些?

首先事务是做为单个逻辑工做单元执行的一系列操做,这些操做做为一个总体一块儿向系统提交,要么都执行,要么都不执行。事务是一个不可分割的逻辑单元。

  • (原子性)事务的各步操做是不可分的,保证一系列的操做要么都完成,要么都不完成;
  • (一致性)事务完成,数据必须处于一致的状态;
  • (隔离性)对数据进行修改的全部并发事务彼此之间是相互隔离,这代表事务必须是独立的,不该以任何方式依赖或影响其余事务;
  • (持久性)表示事务对数据处理结束后,对数据更改必须持久化,无论是事务成功仍是回滚。事务日志都可以保持事务的永久性。

十一、若是如今一台生产的数据库挂了怎么处理?

首先这题没有 get 的面试官想问的点是什么,因此就根据本身项目自己的状况作答了。咱们项目生产上的数据库是有主备的,在主数据库挂掉的状况下是会切换到备数据库,先保证业务的稳定性,而后在对崩溃现场进行保留,方便后续分析问题,找到缘由。这里面试官追问了一下,咱们主备的切换是自动的仍是手动的,这个因为是公司运维团队负责的,本身自己不是特别清楚,可是根据对公司运维团队的了解,应该是自动的。因此就这样如实的回答了。

十二、数据库如何实现 rollback 的?

数据库在写入数据以前是先讲对数据的改动写入 redo log 和 undo log,而后在操做数据,若是成功提交事务就会讲操做写入磁盘;若是失败就会根据redo log 和 undo log 逆向还原到事务操做以前的状态。

1三、工做这么久你遇到的最难的技术点是什么?

我这边根据具体的工具经理,回答的是 kafka 的初次使用,由于当时是公司内部第一个引入 kafka,以前没有小组使用过,因此要采不少坑。而且那个时候 kafka 尚未发布1.0版本,官网和网上提供的版本很杂乱不兼容。

1四、用过Kafka 的话说下 Kafka优缺点有哪些?

  • Kafka 是一个高吞吐量的消息队列。基本的组件有生产者,消费者,node 节点,生产者负责生产消息,将消息发送到指定的 topic 或者 partition 当中。
  • 每一个 partition 能够有多个分区副本,而且存放在不一样的 broker 节点上,保证数据的安全。partiton 的底层是根据 segment 段存放的一系列日志文件,文件里面存放的具体的消息内容,每条消息都有一个惟一的 offset 偏移量,而且是按照磁盘顺序存放的。因为磁盘是顺序读写,因此 kafka 能够有很高的吞吐量。磁盘的顺序读写比随机读写的性能高不少。
  • 每一个消费者都属于一个消费者组,能够消费指定 topic 下的数据。

1五、TCP/IP 协议是如何保证数据可靠性的?

首先 TCP是面向链接的传输协议。主要经过消息确认和重试机制来保证数据传输的可靠性。

电面二

二面的时间是在第二周,周四下午的时候打电话过来,问是否能够面试。可是当时在上班就说不方便,可否周五晚上面试。面试官说能够。谁知道,次日中午还没下班就打电话过来讲面试,可能原本周五你们各自事情都多吧,他也想尽快搞完。我这边被忽然的面试电话给搞懵了一下,想着不是约好了晚上么,怎么搞突击。。。可是没办法,已经推过一次,没好意思再推掉。就说了我要找个安静地方,稍等下。
整个面试过程不是很好,主要是在公司内部找了个没人的地方,说话声音都不敢大,并且还常常有人通过,来来回回的。感受这点没有决策好,也是此次的一个遗憾。因此你们电话面试的时候必定要找个没人的地方。
在这里插入图片描述

流程

一、先进行自我介绍,而后介绍本身作过的项目,从项目流程架构设计等方面介绍

根据我的经历说了本身所作的项目,以及流程和架构方面,由于是本身参与的项目,因此整个流程说的仍是很流畅的。毕竟本身很熟悉。这块尽可能多从几个方面讲,流程,架构,设计等。

二、HashMap 的查询时间复杂度

理想状况下是 O(1)的,可是实际中会出现 hash 碰撞,致使没法达到效果。

三、LinkedList和ArrayList的区别

LinkedList 底层是基于双向链表实现的,而 ArrayList 底层是基于动态数组实现的;

  • 查询的时候 LinkedList 的效率要低于 ArrayList,由于 LinkedList 须要遍历链表,而 ArrayList 底层数组根据下标直接获取数据。
  • 插入删除数据的时候,LinkedList 效率比ArrayList 效率高,由于 ArrayList 在数据多的状况下会进行数组扩容或移动数组。
  • 多进程与多线程在编程上面有什么须要注意的

首先进程是资源分配的最小单元,线程是任务调度的最小单元
在这里插入图片描述

四、ThreadLocal的使用场景

ThreadLocal 适用于每一个线程须要本身独立的实例且该实例须要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景。

五、堆内存和栈内存有什么区别

堆内存是线程共享的,栈内存是线程私有的;
堆内存用来存放由new建立的对象和数组,栈内存中存放一些基本类型的变量和对象的引用变量;

六、堆排序时间复杂度

在这里插入图片描述

七、若是优化数据库的数据查询,另外应用层上还能如何优化?

1)数据库层面上:
除了主键索引,惟一索引以外,对于经常使用的查询字段也要加索引。查询的时候尽可能使用主键索引,由于MySQL 的 InnoDB 的主键索引索引的是整行数据,而普通索引索引的是主键,会有回表操做。固然索引并非越多越好,索引当然能够提升相应的 select 的效率,但同时也下降了 insert 及 update 的效率,须要酌情考虑。 二、优化查询语句,尽可能采用确认性查询语句,减小 or,in,not in,%xxx%语法的使用。
2)应用层面上:

  • 采用缓存机制,将经常使用的数据进行缓存,增长访问速度;
  • 分库分表,读写分离,将数据分开读写,提高性能

八、强一致性,弱一致性,最终一致性

强一致性:对于更新后的数据,要求后续全部节点的任何操做都要获取最新值的状况;
弱一致性:对于更新后的数据,后续节点的数据操做能够是新值,也能够是旧值,经过一段时间后后续节点对数据的操做都是新值;
最终一致性:是弱一致性的特殊形式,存储系统保证在没有新的更新的条件下,最终全部的访问都是最后更新的值。

九、有一个一百万行的文件,内部是购买的商品ID,如何获取到购买最多的前一百个商品。

思路:首先考察的确定是大数据处理方案,这些数据确定不能一次性读取到内存,那就须要拆分,将数据分隔处理。假设要分隔为 n 个文件。

分隔:若是 ID 是整型的话,能够直接采用取模(id % n)的方式;若是 ID 是字符串能够先计算 hash 值而后再取模(hash(x) % n)的方式,将相同 ID 的商品分到同一个文件中。

针对每一个小文件进行 top100的排序,返回购买最多的100个商品 ID•根据 n 个文件中的100个 ID,在进行一次排序,便可获得须要的数据。

小结

在这里插入图片描述
首先很感谢内推的那个朋友才有了此次的面试机会,虽然结果不尽人意,可是为本身的学习成长之旅增长了一些精彩。
而后说下此次的面试体验,总得来讲,感受不是很好,由于几回打电话都是在公司上班期间,毕竟在公司接到面试电话仍是很很差的。没有按照约定的时间点打电话,多是我接触的少,不知道其余公司是怎么样的,总以为这样不太好。

身为一个目前在职三年,工做在深圳这样的大环境下,仍是有很大压力的。之前上学的时候想着何时能月入过万应该就不愁什么的,可是渐渐的发现,及时月入过万也仍是过很差生活。周围比你厉害比你强的人多了去了,你能作的就只有不断的学习,不断的进步。

全部的面试题目都不是一成不变的,像蚂蚁的面试真题只是给你们一个借鉴做用,最主要的是给本身增长知识的储备,有备无患。

最后给你们分享:Java面试题总结+各知识点学习思惟导图
点点我:领取方式:csdn

在这里插入图片描述 到此这篇关于记一次蚂蚁金服的面试经历(小结)的文章就介绍到这了。