BAT三大公司的面试经历分享:腾讯SNG后台开发工程师
作者亲身经历,分享在BAT等公司的面试经验,特别是在腾讯SNG后台开发工程师的面试过程。
一、面试经历概述作者在大约八月初投递了简历,选择了腾讯的SNG部门。很快,他的简历被部门录用,随后展开了一系列的面试。在一周内完成了三次技术面试,接着等待了大约三周,完成了四面和HR面。整个过程充满了曲折,技术面试的难度也相当大。
二、技术面试细节1. 一面:
有序数组排序、二分法及其复杂度。常见排序算法,尤其是快速排序的过程及其时间复杂度。
满二叉树的高度与N个节点的关系。
利用图维护朋友间的点对点关系,如何判断两人是否为朋友,并涉及到了并查集的时间复杂度和过程。
单元点最短路的方法及其时间复杂度。
关键字输入提示的实现,如字典树及其复杂度,对于中文的处理方式。
Java中的垃圾回收机制。
两个项目中的贡献和技术学习经历。
额外学习的技术和框架。
死锁的产生原因。
线程与进程的区别。
进程的通信方式。
CPU的执行方式。
面对进程阻塞、僵死和内存泄漏等问题的排查方法。
Linux相关命令和工具的使用。
大文件中查找指定字符串的方法。
2. 二面:
进一步探讨了排序算法的时间复杂度和稳定性,特别是的过程。
如何从100万个数中找到前1000个最大的数,涉及堆排序的构造和调整。
一个权值矩阵中找到从左上角到右下角的最小权值路径,初步探讨了DFS和迪杰斯特拉算法。
四辆小车的行走问题,如何优化方案使一辆小车走最远。
hashmap、hashtable和concurrenthashmap的实现。
MySQL的索引结构,尤其是B+树的性质。
Linux下CPU满载的排查方法和工具。
大文件中查找某一行的内容的方法。
三、总结与展望Redis内存数据库与秒杀系统架构
本文首发于微信公众号:程序员江湖。我参与了阿里巴巴中间件部门的提前批面试,经历了四轮面试,并成功获得了口头offer。在此,我为大家分享我的面经。
一面:
1. 自我介绍。
2. 详述项目经历及遇到的难点。
3. 简述Java线程池的工作原理及各个参数的作用。
4. Redis内存数据库的介绍。
5. 如何实现分布式系统的全局id?利用Zookeeper如何实现?
6. 探讨分布式锁的解决方案,对比Redis和Zookeeper在高并发集群部署下的性能。
7. 对Kafka的了解,以及其他消息队列的认识。
8. 职业倾向:业务or研究?
9. 编程题:使用Linux访问权限的rwx格式,设计一个类支持访问权限的增删改查,并注重数据格式与效率。
二面:
1. 再次介绍项目经历及难点。
2. 反射在编程中的作用。
3. 数据仓库、多线程和并发工具的相关知识。
4. 私有云、Docker和Kubernetes等技术的了解。
5. 谈谈对常见中间件的认知,如dubbo、rocketmq、mycat等。
6. dubbo中rpc的实现原理。
三面:
关于Redis内存数据库:
1. Redis中的内存是否指共享内存?
2. Redis的持久化方式是什么?
关于秒杀系统:
1. 秒杀系统的架构设计是怎样的?
2. 如何处理高并发下的订单生成与支付?
还探讨了以下内容:
1. 对于集合操作:如何求十亿个数集合与十万个数集合的交集?面试官提到对小数组进行hash处理,然后遍历大数组的方法。
2. 对于大数据处理:如何从十亿个数中找到前100个最大的数,并探讨堆排序的实现与调整。
3. TCP与UDP的区别,具体使用场景是什么?TCP四次挥手的流程,以及当客户端未收到最后一次ack时的处理方式。
4. Socket编程中的accept方法的作用及其在三次握手中的地位。对Linux操作系统的了解程度,以及对Linux基础命令的掌握情况。还探讨了Linux的文件系统,如proc文件系统。
5. 单例模式的使用场景以及分布式id生成器的实现方式(如使用Zookeeper)。还探讨了Zookeeper的原理,如Zab协议。此外还涉及了适配器模式的实现与应用场景。在网络方面,探讨了直播场景的架构设计要点,并提及了避免广播风暴的问题。最后探讨了Redis与MySQL的区别以及它们的使用场景。面试还询问了关于最近的学习情况和博客写作经历等。三面结束后还经历了HR面,主要了解了个人情况、职业规划和对公司的期望等。整个面试过程虽然漫长但收获颇丰最终成功获得了口头offer。希望这篇文章能对即将参加面试的朋友们有所帮助!【面试经验分享:如何实现RPC及百度智能云研发岗面试经历】
耗时将近30分钟,我对如何实现RPC有了更深入的了解。简单来说,要实现RPC,首先要设计接口,然后使用序列化与反序列化技术将数据进行传输,同时还需要设计网络通信协议来保证数据传输的可靠性。至于Dubbo的服务注册与发现,这是一个关于服务发现与负载均衡的技术,用于实现服务的自动发现和调用。
接下来是一场三面笔试,耗时三个小时。这场考试主要考察Java核心基础,考点包括Java并发的知识点、集合类、线程池、多线程之间的通信等。题目难度颇大,让人印象深刻。
在HR面中,主要聊的是人生理想等话题。与HR小姐姐的交流十分愉快,持续了大约30分钟。
接下来是百度智能云研发岗的面试经历。一面中,我被问到了一系列技术问题:自我介绍和项目经历是基础问题;关于static关键字的使用和内部类的区别;对hashmap、hashtable、concurrenthashmap的区别和适用场景;volatile关键字的作用;jvm的分区和gc算法,以及gc的停顿和延迟问题;关于OOM和内存泄漏的例子,以及为什么有GC还会出现这些问题;线程和进程的区别以及通信方式;悲观锁和乐观锁在Java和数据库中的实现;数据库索引除了B+树索引还有哪些;倒排索引的优化方法;前缀树的结构和原理;浏览器发起http请求的过程;缓存和数据库的一致性保证问题;在网上写了一个快速排序的代码;等等。
在二面中,技术问题依旧占据主导:自我介绍和项目中的技术难点;多线程的状态和状态转换;多线程的sleep方法和wait方法为什么来源不同;object的wait和notify必须在同步块中使用的原因;jvm的gc机制,两个对象的引用循环依赖是否会被垃圾回收;GC root是什么;数据库和Redis的相关技术;Spring的interceptor和filter的区别;网络方面的dns请求过程,dns的缓存机制;get和post的区别,底层的实现是否有区别;数据结构和算法问题,如树的层次遍历使用的结构和图的遍历方式,最小生成算法和迪杰斯特拉算法等。还问到了一个有趣的问题:如何找到数组中唯一一个出现两次的数。
深入剖析MySQL引擎的差异与使用场景
在面试过程中,你被邀请探讨了MySQL的引擎差异及运用场景。通过细致的分析,你了解了InnoDB、MyISAM等引擎的特点,并清晰地阐述了它们在处理不同数据类型和工作负载时的优势。这次对话不仅让你对MySQL有了更深入的了解,还展示了你的技术洞察力和问题解决能力。
查询优化:掌握最新数据触手可及
对于查询最新的10条数据,你不仅凭借“order by id desc limit 10”这一简单命令轻松应对,更展现了你在数据库查询优化方面的深厚功底。你对数据库索引的见解,以及如何通过优化SQL语句来提高查询效率的策略,让面试官对你刮目相看。
揭开MySQL Union与Union All的神秘面纱
在探讨MySQL的Union和Union All时,你展示了扎实的基础知识。你深入解释了两者之间的差异,并分享了在实际项目中如何根据需求选择适当的策略。你的回答不仅准确,而且富有洞察力。
解析MySQL的Join魔法:底层原理大揭秘
面对MySQL的Join操作,你不仅了解了它们的表现形式,更深入探究了它们的底层原理。你详细解释了不同类型的Join操作是如何在数据库中执行的,以及它们在实际应用中的使用场景。
Redis的奥秘:数据结构与基本原理探秘
你对Redis的数据结构和基本原理了如指掌。从Redis的持久化机制到哨兵部署的问题,你都能够给出深入且富有洞察力的回答。你对Redis的AOF和RDB持久化方式的比较,展示了你在技术细节上的敏锐洞察力。
分布式系统的奇幻之旅:Hadoop及更多
在探讨分布式系统时,你展现了对Hadoop的基本了解,并简要分享了搭建环境的过程。虽然对Hadoop的某些细节问题回答不够完美,但你的好奇心和求知欲让面试官印象深刻。你还分享了对分布式数据库中分片技术的理解,显示出你在大规模数据处理领域的潜力。
编程江湖:面试心得与经验分享
除了技术问题,你还分享了在其他公司如美图、迅雷等的面试经历。从Java工程师的角度,你详细描述了面试过程中的问题以及自己的回答思路。这不仅展示了你的技术实力,更体现了你的成长和学习态度。你的经验分享让面试官看到了你在编程江湖中的成长和进步。
---
华为优招研发工程师面经分享
在华为优招的面试过程中,我经历了初面和二面两大环节。首先谈谈初面。初面的焦点集中在项目经历上,面试官详细询问了我在项目中承担的角色和具体工作内容。也探讨了我在重构过程中采取的原因和方式,对docker和k8s的技术理解也进行了深入交流。接着,话题转向jvm,我被问到关于类加载的多个问题,如类加载的时间点、重复类加载的后果等。数据库方面,对MySQL也有一定程度的探讨。二面则更加关注个人背景和家庭情况,同时针对我的项目进行了更深入的探讨,询问了关于创新点和项目细节的问题。整个面试过程虽然紧张但非常充实。
深信服大数据研发工程师面试经历
在深信服大数据研发工程师的面试过程中,我首先被询问了关于Python和C语言的知识。接着是算法题,面试官让我解析了跳台阶问题以及斐波那契数列的多种解法。网络方面的知识也涉及到了,比如TCP的四次挥手中的time-wait状态的意义。还讨论了操作系统的fork进程返回的内容以及hadoop的组件和hdfs的写入流程。二面时,我详细描述了项目中的难点以及解决方案,并探讨了如何设计一个高并发的秒杀系统。面试官还让我解释了Python中的线程和协程的区别和应用场景。三面则更多地关注个人背景和城市意向等个人问题。
蚂蚁金服中间件研发工程师面试经历分享
我在蚂蚁金服中间件研发工程师的面试过程中经历了多面。首先是一面,主要围绕Java多线程和线程池展开,探讨了线程池的增长策略和拒绝策略,以及并发编程中的并发juc和其他线程安全的list结构。我也被问及HTTP协议与TCP的区别、HTTP 1.0与2.0的差异等网络知识。整个面试过程紧张而富有挑战性。后来我还参加了蚂蚁财富事业群的面试流程,包括多轮面试和HR面试,分享的内容也涵盖了更多关于个人背景和项目经验的细节。这次面试经历让我收获颇丰。
---
关于BIO和NIO的区别,首先我想说一下阻塞与非阻塞的概念。BIO是阻塞I/O模式,意味着在等待数据到来或发送数据时,线程会被阻塞。而NIO则是非阻塞模式,允许线程在等待数据的同时去做其他事情,这就是所谓的IO多路复用。在NIO中,我们使用了Selector、SelectedKey和Channel等类来实现这一机制。通过单线程处理连接,多线程处理IO请求,大大提高了处理效率。
再来说说NIO的类库或框架,Netty是其中的佼佼者。我在服务端和客户端都做过Demo,虽然还没有在生产环境中实践过,但对其中的ChannelHandler、ByteBuf和EventLoop等概念有深入了解。ChannelHandler负责请求就绪时的IO响应,ByteBuf支持零拷贝,通过逻辑缓冲合并实际缓冲。EventLoop线程组负责实现线程池,任务队列里就是IO请求任务。
对于数据库方面的讨论,我主要聚焦在MySQL上。关于SQL优化,我首先提到了使用索引的优化方法。我也提到了在某些情况下索引会失效,需要进行全表扫描,比如联合索引的前缀匹配、跳跃索引、聚合函数以及判空和<>等情况。
分布式领域的Paxos和Raft算法我也有所了解。Paxos通过多个proposer发提议,每个提议都有id和value。当超过半数的acceptor返回某个提议时,就会进行value的修改并广播。Raft则要求每个节点有一个选主的时间间隔,通过心跳包来维持主节点的地位,当心跳失败时重新选主。
至于中间件部分,我知道的有阿里系的Dubbo和RocketMQ的事务消息等。我还了解MyCat的分表分库实现、消息队列如Kafka和RabbitMQ等。
在蚂蚁金服中间件二面中,我被问到Spring和SpringMVC的相关知识。我讲解了Spring的IoC和AOP机制,以及SpringMVC的基本架构和请求流程。对于分布式服务、Tomcat的基本原理等也有一定理解。在项目中,我通过并发编程提高系统性能,也使用了Docker进行容器化管理。对于Docker的实现原理,我解释了其使用cgroup和namespace进行硬件和命名空间的隔离的方式。
在回答过程中,我始终保持内容生动、文体丰富,并深入理解了文章的内容,将其转化为流畅、有吸引力的文本。希望这样的表述能更好地展现我的技术实力和面试经历。程序员江湖:京东与美团研发面经分享
首发于微信公众号:程序员江湖。我会分享我在京东Java工程师和美团点评后台开发工程师面试过程中的经历。希望通过这篇文章能给大家提供一些面试经验。
京东Java开发面试经历
电话面试环节:
1. 自我介绍,简单描述自己在项目中关于多线程的实现经验。
2. 深入讨论Java的线程池参数、拒绝策略以及阻塞队列的具体实现和使用场景。
3. 讨论ArrayList和LinkedList的区别,以及它们的扩容机制。
4. 深入探讨了HashMap、Hashtable、ConcurrentHashMap在JDK 1.7和1.8中的差异。
5. 针对JDK 1.8中HashMap使用红黑树的优化进行深入探讨,并解释了红黑树的结构和特性。
6. 询问了关于JVM的了解,包括内存结构、堆区的分代、垃圾回收及其所用算法。
7. 探讨了为什么要划分年轻代和老年代,以及方法区是否进行垃圾回收。还涉及了GC时扫描的位置、GC Root的具体细节,包括虚拟机栈的局部变量等。
在Java虚拟机中,判断一个对象是否可以被回收的可达性分析算法是核心。从GC Root开始,如果某个对象存在可达的引用链,那么这个对象就不能被回收;否则,等待被垃圾回收。
美团点评后台开发工程师面试经历
一面:
(具体的面试问题暂时空缺,待后续补充)
交叉面/其他部门技术主管面:
隔壁部门的技术主管提到了一个算法题,关于链表的排序。讨论了多种排序方案,包括转成数组直接排序、拆分再排序、顺序连接等。我展示了几种优化方案后,他表示没有其他问题。
HR面:
涉及了兴趣爱好、职业规划、意向公司和城市、实习经历和收获、实习中遇到的困难、为何换公司、你的优缺点、觉得自己比其他人优秀的地方以及为什么想来这个部门等问题。
关于GC Root的理解
提及GC Root,自然引起好奇:哪些对象能成为GC Root呢?这一问题在面试中屡见不鲜。《深入理解Java虚拟机》为我们揭晓答案:虚拟机栈中的引用对象、方法区中类静态属性引用的对象、方法区中常量引用对象以及本地方法栈中的JNI引用对象,这些都是可能的GC Root。
关于MySQL索引的考量
当我们谈及MySQL的索引时,有几个要点值得注意。表的主键、外键必须有索引,这是基础。当数据量超过300时,索引的设立显得尤为重要。对于那些经常与其他表连接的表以及在WHERE子句中频繁出现的字段,特别是大表的字段,索引的设立能显著提高查询效率。索引的选择性越高、建立的字段越小,其效果越好。但要注意,对于超长文本字段,不宜建立索引。对于频繁进行数据操作的表,索引的数量要适度,过多的索引可能影响性能。
MySQL的隔离级别与并发控制
MySQL的隔离级别中,可重复读是默认的。在可重复读级别下,SELECT操作默认不加锁,这得益于乐观锁策略,即MVCC多版本并发控制。这种策略适用于读多写少的场景,确保并发环境下的数据一致性。
Redis的数据类型
谈到Redis,其丰富的数据类型是一大亮点。
面试深入交流
在面试中,还探讨了多个项目和学习的经历。被问及两个项目的差异和改进之处,以及平时的学习方法和博客内容。对于Java虚拟机,探讨了内存分区、GC及如何排查堆内存问题,使用工具如jmap、jstat等进行分析。对于Java线程池,探讨了其源代码、如何修改以监控线程状态,以及visualvm工具的使用。在web框架方面,深入讨论了SpringMVC的启动过程、mvc上下文及请求流程等。还探讨了设计模式如单例、工厂的应用场景。面试中还涉及了MySQL的select1和select 的区别、负载均衡的算法、缓存淘汰策略、计算机网络知识等。
电话面试经历
---
面试挑战:深度解析与实战应对
你正经历一场极具挑战性的面试之旅,让我们一起深入了解每一个问题的内涵并作出精彩的回答。
第一部分:Java技术栈深度探索
1. ArrayList与LinkedList的奥秘与遍历之道
2. JVM内存模型揭秘:堆区与垃圾回收的艺术
JVM内存模型中的堆区是对象的主要存储空间。它通常被分为新生代和老年代,采用分代垃圾回收策略。老年代使用标记清除法时可能会遇到的问题主要是内存碎片的产生。标记清除多次后,老年代可能因内存碎片过多而触发Full GC。
3. 垃圾回收器的选择与CMS的高级应用
Java有多种垃圾回收器,如Serial、Parallel、CMS和G1等。CMS回收器是Concurrent Mark Sweep的缩写,其过程涉及多个阶段,并可能引起短暂的停顿。如果老年代产生内存碎片,可能会导致Full GC的触发,影响性能。优化JVM时,选择合适的垃圾回收器是关键。
第二部分:数据库技术与事务隔离
4. MySQL索引背后的故事:InnoDB的B+树与索引策略
InnoDB在MySQL中使用的B+树索引是其性能的关键。主键索引、聚簇索引等各有特点。理解它们的差异有助于更好地利用数据库性能。
5. 事务隔离级别与死锁揭秘
在事务处理中,隔离级别决定了数据在并发访问时的行为。MySQL的RR(可重复读)隔离级别有助于避免幻读问题。死锁的产生往往涉及多个事务的竞争资源。理解这些概念对于避免数据库性能问题至关重要。
第三部分:系统知识与项目经验大考验
6. 系统知识深度挑战:从Linux到Docker
面试官可能会深入考察你的系统知识,包括Linux磁盘管理、进程通信、共享内存等。Docker作为现代开发的重要工具,如何清晰地讲解其原理也是加分项。通过分享你在项目中的实际经验,展示你的技术实力。
第四部分:后端开发技能大挑战
在一面中,你可能需要展示你的编程实力和算法掌握程度。如写一个找无序数组中位数的题目,或者一个找第k大数的题目,并讨论相关算法的时间复杂度等。可能还会涉及网络编程、项目经验分享等内容的考察。
---
自我介绍:
今天我非常荣幸能够站在这里进行自我介绍。我对编程有着深厚的兴趣,特别是在Java领域,我对其集合类、多线程技术都有深入的了解和实践经验。除此之外,数据库技术如MySQL以及缓存系统如Redis也是我关注的重点。对于数据结构和算法,我有着扎实的基础并乐于探索新的技术方向。今天希望能通过面试,与贵公司一同成长。
Java的集合类线程安全性及HashMap实现原理:
Java的集合类中,如Vector、HashTable以及Collections.synchronizedXXX方法都是线程安全的集合类。HashMap基于哈希表实现,其内部使用数组+链表或树结构进行数据存储,以实现快速查找。HashMap在并发环境下可能会引发数据不一致问题,因此线程安全的使用场景需要考虑其他并发控制手段。
MySQL索引及事务隔离级别:
MySQL的索引主要基于B+树结构实现,这种结构能有效提高数据查询速度。InnoDB存储引擎中的索引与磁盘页紧密关联,每个节点存储的数据量及大小规定都与磁盘块大小有关。MySQL的事务隔离级别分为四级,旨在解决不同场景下的数据一致性问题。
Redis相关知识:
Redis是一个高性能的键值对缓存系统。当Redis中存在大量key时,使用KEYS命令可能会影响线上服务,因为Redis是单线程模型。持久化方面,Redis有两种方式:RDB和AOF。RDB是定期持久化,生成快照文件;AOF则是记录每次操作命令。Redis内部数据结构如List、SortedSet等都有其特定的实现方式,如ziplist和quicklist用于实现List等。
消息队列及算法问题:
三面:
项目介绍:
在此次面试中,我详细介绍了自己参与的项目,包括项目中遇到的并发问题和技术挑战,以及如何解决这些问题。其中涉及到了CHM和CountDownLatch等并发控制技术。
并发技术及操作系统知识:
面试官询问了关于并发技术的具体使用方式以及为何选择特定方式处理。我解释了线程池的使用及其优势。还讨论了操作系统的进程通信、僵尸进程和孤儿进程的概念以及如何避免僵尸进程。
计算机网络及死锁问题:
在计算机网络方面,我解释了TCP和UDP的区别,以及迅雷下载基于UDP的原因。面试官对此进行了深入的追问,我尝试从建立连接的开销、P2P的特点等方面解释,尽管有些回答不准确,但我尽力给出了自己的理解。我们讨论了操作系统的死锁必要条件以及如何避免死锁。
缓存问题及HR环节:
最后的部分是关于缓存的编程问题,要求实现一个带有超时淘汰和LRU淘汰的缓存。我尝试用LinkedList和HashMap实现,但未完全满足面试官的要求。对此我深感遗憾,尤其是未能完成过期淘汰的逻辑。HR小姐姐让我等待面试结果。此次面试虽未完美,但也让我学到了很多。
文章来自《钓虾网小编|www.jnqjk.cn》整理于网络,文章内容不代表本站立场,转载请注明出处。