金三银四后,阿里,京东,美团,蚂蚁金服等面试经验总结
一、心态
心态很重要!
心态很重要!
心态很重要!
重要的事情说三遍,这一点我觉得是必须放到前面来讲。
找工作之前,有一点你必须清楚,就是找工作是一件看缘分的事情,不是你很牛,你就一定能进你想进的公司,都是有一个概率在那。如果你基础好,项目经验足,同时准备充分,那么你拿到offer的概率就会比较高;相反,如果你准备不充分,基础也不好,那么你拿到offer的概率就会比较低,但是你可以多投几家公司,这样拿到offer的几率就要大一点,因为你总有运气好的时候。所以,不要惧怕面试,刚开始失败了没什么的,多投多尝试,面多了你就自然能成面霸了。得失心也不要太重,最后每个人都会有offer的。
还有就是对待校招的态度,校招的目的并不仅仅是为了找工作,而且也是为了锻炼自己,提升自己;对于每个大学生来说,真正的校招只有一次,因此一定要珍惜;经过了校招的磨练后,自己的能力将得到很大的提升;这也是人生一个重要的经历;
二、基础
基础这东西,各个公司都很看重,尤其是BAT这种大公司,他们看中人的潜力,他们舍得花精力去培养,所以基础是重中之重。之前很多人问我,项目经历少怎么办,那就去打牢基础,当你的基础好的发指的时候,你的其他东西都不重要了。基础无外乎几部分:语言(C/C++或java),操作系统,TCP/IP,数据结构与算法,再加上你所熟悉的领域。这里面其实有很多东西,各大面试宝典都有列举。在这只列举了java后台工程师所需要的和我的学生面试中所遇到的知识点,尽量做到全面,如果你掌握了以下知识点,去面java后台工程师应该得心应手。
J2SE基础
- 八种基本数据类型的大小,以及他们的封装类。
- 如果两个Integer的值相等,使用==进行判断的结果是否相等(常量池问题)?
- 你重写过hashcode和equals么,要注意什么
- Object有哪些公用方法?
- Java的四种引用,强弱软虚,用到的场景。
- equals与==的区别。
- try catch finally,try里有return,finally还执行么?
- Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。
- Java面向对象的三个特征与含义。
- Override和Overload的含义与区别。
- Interface与abstract类的区别。
- Static class 与non static class的区别。
- String、StringBuffer与StringBuilder的区别。
- ArrayList、LinkedList、Vector的区别。
- Hashmap的原理
- Map、Set、List、Queue、Stack的特点与用法。
- HashMap和HashTable的区别。
- HashMap和ConcurrentHashMap的区别,HashMap的底层源码。
- TreeMap、HashMap、LindedHashMap的区别。
- Collection包结构,与Collections的区别。
- Hashmap的大小为什么指定为2的幂次
- Arraylist的原理
- Hashmap中jdk1.8之后做了哪些优化
- 多线程条件变量为什么要在while体里
- Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。
- 实现多线程的三种方法:Thread,Runable,Callable.
- 线程同步的方法:sychronized、lock、reentrantLock等。
- 写一个单例模式,如何解决线程安全的问题;
- 问了为什么用Volatile,synchronize移到方法最外面会怎么样?
- 锁的等级:方法锁、对象锁、类锁。
- 写出生产者消费者模式。
- Synchronize关键字为什么jdk1.5后效率提高了
- 讲一下countDownLatch
- ThreadLocal的设计理念与作用。
- ThreadPool用法与优势。
- wait()和sleep()的区别。
- 说一个你最熟悉的设计模式
- 讲一下你项目中用到了哪些设计模式
- 讲一下线程状态转移图
- Java IO与NIO。
- Nio的原理
- Channel和buffer
- directBuffer和buffer的区别
- nio和aio的区别
- I++操作怎么保证线程安全
- 如何解决并发访问的错误
- 死锁是什么呢
- 怎么解决死锁
- 反射的作用于原理。
- 泛型常用特点,List<String>能否转为List<Object>。
- 解析XML的几种方式的原理与特点:DOM、SAX、PULL。
- 设计模式:单例、工厂、适配器、责任链、观察者等等。
- 单例模式在你项目里哪些应用?
Java里有很多很杂的东西,有时候需要你阅读源码,大多数可能书里面讲的不是太清楚,需要你在网上寻找答案。
JVM
- 内存模型以及分区,需要详细到每个区放什么。
- 堆里面的分区:Eden,survival from to,老年代,各自的特点。
- 对象创建方法,对象的内存分配,对象的访问定位。
- GC的两种判定方法:引用计数与引用链。
- GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
- GC收集器有哪些?CMS收集器与G1收集器的特点。
- Minor GC与Full GC分别在什么时候发生?
- 几种常用的内存调试工具:jmap、jstack、jconsole。
- 类加载的五个过程:加载、验证、准备、解析、初始化。
- 双亲委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。
- 分派:静态分派与动态分派。
- Java的full gc
- Full gc会导致什么问题
- 垃圾回收算法的过程
- 你了解的垃圾收集器? Cms收集器的过程
- 怎样进入老年代?
JVM过去过来就问了这么些问题,没怎么变,内存模型和GC算法这块问得比较多,可以在网上多找几篇博客来看看。
操作系统
- 进程和线程的区别。
- 死锁的必要条件,怎么处理死锁。
- Window内存管理方式:段存储,页存储,段页存储。
- 进程的几种状态。
- IPC几种通信方式。
- 什么是虚拟内存。
- 虚拟地址、逻辑地址、线性地址、物理地址的区别。
TCP/IP
- OSI与TCP/IP各层的结构与功能,都有哪些协议。
- TCP与UDP的区别。
- TCP报文结构。
- TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。
- TCP拥塞控制。
- TCP滑动窗口与回退N针协议。
- Http的报文结构。
- Http的状态码含义。
- Http request的几种类型。
- Http1.1和Http1.0的区别
- Http怎么处理长连接。
- Cookie与Session的作用于原理。
- 电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP。
- Ping的整个过程。ICMP报文是什么。
- C/S模式下使用socket通信,几个关键函数。
- IP地址分类。
- 路由器与交换机区别。
- http请求流程
网络其实大体分为两块,一个TCP协议,一个HTTP协议,只要把这两块以及相关协议搞清楚,一般问题不大。
数据结构与算法
- 链表与数组。
- 队列和栈,出栈与入栈。
- 链表的删除、插入、反向。
- 字符串操作。
- Hash表的hash函数,冲突解决方法有哪些。
- 各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。
- 快排的partition函数与归并的Merge函数。
- 对冒泡与快排的改进。
- 二分查找,与变种二分查找。
- 二叉树、B+树、AVL树、红黑树、哈夫曼树。
- 二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。
- 图的BFS与DFS算法,最小生成树prim算法与最短路径Dijkstra算法。
- KMP算法。
- 排列组合问题。
- 动态规划、贪心算法、分治算法。
- 大数据处理:类似10亿条数据找出最大的1000个数.........等等
- 加密解密了解么?几种算法,讲一下你了解的
- 写一个两个有序链表合并成一个有序链表
- 堆排序的原理
- 介绍一下红黑树
- 对算法有什么了解?答主先回答了动态规划,解释了一下dp的思想
- 快排的思想讲一下
- 讲一下稳定的排序算法和不稳定的排序算法
- 手撕算法:一棵二叉排序树,给定一个数,找到与给定数差值最小的数
- 场景题:设计一个系统,解决抢购时所需要的大量的短链接的功能,如何保证高并发,如何设计短链接
- 手撕算法:两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,答主用的二分,时间复杂度为O(log (m+n))。结果面试官不满意,
- 让用归并的思想做,时间复杂度其实更高了
- 算法题:给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
- 手撕算法:最小公倍数和最大公约数
- 手撕算法:反转单链表
- 手撕算法:实现类似微博子结构的数据结构,输入一系列父子关系,输出一个类似微博评论的父子结构图
- 手撕一个单例模式
- 智力题:时针分针什么时候重合
算法的话其实是个重点,因为最后都是要你写代码,所以算法还是需要花不少时间准备,这里有太多算法题,写不全,我的建议是没事多在OJ上刷刷题(牛客网、leetcode等),剑指offer上的算法要能理解并自己写出来,编程之美也推荐看一看。
javaEE:
- servlet工作流程,如何解决配置文件过于繁琐的问题
- JSP和Servlet有什么区别?为什么要搞出两个来。
- forward 和 redirect区别
- servlet的几个方法 doget dopost区别
- 在多个服务器之间session是怎么共享的。
- servlet工作流程,如何解决配置文件过于繁琐的问题
- session的机制;session和cookie区别
- servlet和filter的区别。filter你在哪些地方用到过。
- 怎么解决session一致性缓存的问题
框架:
- Mybatis高级映射
- Spring IOC和AOP的理解,它们的原理是什么,如果让你自己搞个IOC,AOP的话,怎么搞。
- spring实现事务的方式有哪些。
- spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为。
- spring中用到了哪些设计模式,线程池;
- Spring中autowire和resourse关键字的区别
- 讲讲你对spring的理解,不要把ioc和aop背给我听
- 介绍spring中的熟悉的注解
- 让你实现autowire注解的功能你会如何实现
- Spring的aop怎么实现
- Spring的aop有哪些实现方式
- 动态代理的实现方式和区别
框架里有很多很杂的东西,有时候需要你阅读源码,大多数可能书里面讲的不是太清楚,需要你在网上寻找答案,也同时需要看一下官方的文档
数据库,分布式
- 讲一下数据的acid
- 什么是一致性
- 什么是隔离性
- Mysql的隔离级别
- 每个隔离级别是如何解决
- 数据库的索引原理
- 非聚簇索引和聚簇索引
- 索引的使用注意事项
- 项目用到什么数据库?隔离级别?每个隔离级别各做了什么
- 数据库的索引?mysql不同引擎索引的区别
- 数据库的索引原理
- 索引使用的注意事项
- Mysql的数据库引擎,区别特点
- 一千万用户并发抢购,怎么设计
- 什么时候用读锁
- 什么时候用写锁
- Cas的原理,使用场景
- 数据库的瓶颈
- 缓存还没更新到主存,服务器挂了怎么办
- 数据库挂了怎么办
- 锁的实现原理
- 怎么解决缓存和主存的一致性问题
- 数据库挂了怎么怎么办
- 怎么保证一致性
- 分布式事务知道么
- 介绍分布式事务
- 为什么负载均衡
- 怎么实现负载均衡
- 数据库挂了怎么办?除了热备份还有什么方法
- 数据库的索引
- 数据库的隔离级别
- Mysql的容灾备份
- Redis和memcache 的区别
- 为什么选择redis
- mysql数据库的引擎和区别
- 看你最近博客写的是redis,介绍redis和mysql的区别
- Redis的应用场景
- 设计题,一个图书馆管理系统,数据库怎么设计,需求自己定
- Redis的特点
- 分布式事务了解么
- Mongodb和关系型数据库之间的区别,还了解其他的非关系型数据库没
- Redis如何解决key冲突
- 有深入了解过redis吗?
- Redis的优势和特点
- Redis和mysql的区别
- Redis的持久化有哪些方式,具体原理
- 如果成功的用户有10万,redis存不下怎么处理
- 了解redis源码么,了解redis集群么
- Mysql对联合索引有优化么?会自动调整顺序么?哪个版本开始优化?
高并发架构
- 如果你够牛,mq,dubbo,zookeeper都会问到
- 对高负载有了解么
- 对高并发有了解么?
- 消息队列了解么
- 分布式了解么
- 自己写一个tomcat服务器,你会怎么写
- 分布式服务器会出现哪些问题
- 反爬虫的机制,有哪些方式
场景
- 场景题:设计一个下单系统,下单成功后可以给用户发优惠券
- 接上面场景题:服务器挂了,优惠券还没发怎么办
- 场景题:千万用户抢购,如何处理高并发,并且有一个链接,指向前一天抢购成功的用户,如何设计这个系统和数据库
- 如果后台处理抢购请求的服务器,每次最多承受200的负载,系统该怎么设计
hr
- 你的职业规划
- 有哪些offer
- 为什么还来我们这
- 自我介绍
三、 项目
关于项目,这部分每个人的所做的项目不同,所以不能具体的讲。项目不再与好与不好,在于你会不会包装,有时候一个很low的项目也能包装成比较高大上的项目,多用一些专业名词,突出关键字,能使面试官能比较容易抓住重点。在聊项目的过程中,其实你的整个介绍应该是有一个大体的逻辑,这个时候是在考验你的表达与叙述能力,所以好好准备很重要。、
面试官喜欢问的问题无非就几个点:
- XXX(某个比较重要的点)是怎么实现的?
- 你在项目中遇到的最大的困难是什么,怎么解决的?
- 项目某个部分考虑的不够全面,如果XXXX,你怎么优化?
- XXX(一个新功能)需要实现,你有什么思路?
- XXX项目的亮点有哪些?
- 如果数据量很大,并发数很多怎么处理?
- 项目介绍,最复杂的表
- 项目介绍
- 项目架构
- 项目难点
- 项目里一个完整请求的流程
- 项目的优化
其实你应该能够预料到面试官要问的地方,请提前准备好,如果被问到没有准备到的地方,也不要紧张,一定要说出自己的想法,对不对都不是关键,主要是有自己的想法,另外,你应该对你的项目整体框架和你做的部分足够熟悉。
四、 其他
你应该问的问题
面试里,最后面完之后一般面试官都会问你,你有没有什么要问他的。其实这个问题是有考究的,问好了其实是有加分的,一般不要问薪资,主要应该是:关于公司的、技术和自身成长的。
软实力
什么是软实力,就是你的人际交往、灵活应变能力,在面试过程中,良好的礼节、流畅的表达、积极的交流其实都是非常重要的。很多公司可能不光看你的技术水平怎么样,而更看重的是你这个人怎么样的。所以在面试过程中,请保持诚信、积极、乐观、幽默,这样更容易得到公司青睐。很多时候我们都会遇到一个情况,就是面试官的问题我不会,这时候大多数情况下不要马上说我不会,要懂得牵引,例如面试官问我C++的多态原理,我不懂,但我知道java的,哪我可以向面试官解释说我知道java的,类似的这种可以往相关的地方迁移(但是需要注意的是一定不要不懂装懂,被拆穿了是很尴尬的),意思就是你要尽可能的展示自己,表现出你的主动性,向面试官推销自己。还有就是遇到智力题的时候,不要什么都不说,面试官其实不是在看你的答案,而是在看你的逻辑思维,你只要说出你自己的见解,有一定的思考过程就行。
读者分享
对于很多初级Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。
整理的这些架构技术希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。同时我经过多年的收藏目前也算收集到了一套完整的学习资料,希望对想成为架构师的朋友有一定的参考和帮助。
下面是部分资料截图,诚意满满:特别适合有1-5年开发经验的Java程序员们学习。
资料免费领取方式:加入合作Java架构学习交流Qqun:810589193,管理员处免费领取资料。
部分资料如下:
资料免费领取方式:加入合作Java架构学习交流Qqun:810589193,管理员处免费领取资料。