总结
06.20我从北京xxxx有限公司离职,结束了一年的见习生涯。07.05-08.04在帮我姐夫做翻译;毕竟这段时间比较空闲,在空闲的时候我都是在准备面试,不管是Java基础、JVM、数据库、数据结构、分布式、集群还是项目都准备的差不多,期间我看过《数据结构与算法分析》和《Java编程思想》等书籍。08.03我回到深圳,08.04开始的阿里一面到08.22的四面,今天得知四面挂了感觉很可惜,毕竟差Offer仅一步之遥,但又在意料之中;你选择公司,公司同样也选择你,如果你没有足够优秀,那么对不起-你只是一个过客,而我就是那么一个过客而已。我也留了退路,毕竟阿里没有十足的把握;在这段时间我也去面过三家公司都是自身产品研发,很巧很幸运也都拿到了Offer;公司没有好坏之分,你选择公司的原因无非看在该公司是否能够给予我们期望的salary、行业的前景和对自身的成长空间,这些之中阿里无非是首选。从阿里的这趟面试经历中,给我最大的领悟就是:只有自己足够优秀,才有选择的余地。以下就是近期的所有面试分享以及面试所需知识点总结。下方有资料获取方式!
目录结构
面试必备知识点
阿里巴巴集团1-4面经分享
xx科技股份有限公司面经
xx文化传媒有限公司(360子公司)面经
xx软件集团有限公司面经(太水了就没写)
面试必备知识点(数据库、Java基础、项目、网络、数据结构、spring框架)
一、数据库部分
基本要求:ACID,原子性、一致性、隔离性、持久性;并发事务问题:脏读、不可重读、幻读;4个事务隔离等级:读未提交、读已提交、可重读、串行化
索引(应用场景:状态比较多的字段,一般唯一的、底层:hash和B+索引算法、好处:应用数据结构进行查找)
使用复合索引的注意点
复杂查询(leftjoin、rightjoin、innerjoin、having、order by、limit、distinct等)
explain关键词优化表
MySQL的存储引擎InnoDB、MyISAM的区别以及如何选型
MySQL的意向锁(MySQL系统默认,人为无法使用)、乐观锁(一般用一个字段version)、悲观锁(for update)
Sharding-JDBC中间件(实现分表操作)
读写分离之主从复制如何实现
优化MySQL的方式(数据库设计方面:合理的索引、尽量使用数值型代替字符型(依赖MySQL底层查询机制)、使用定长字段而非定长;数据库语句优化方面:尽量使用exit和in、not in和in,like的用法要使用好,比如用 like ‘xxx%‘代替’%xxx%’,因为’%xxx%'这种方式可能不会走索引)
a:messages<500w 做数据库语句优化、表设计优化就可以应付
b:500w 又是一个瓶颈) c:1200w 用消息队列缓解写入压力。(1200-1500左右又是一个瓶颈) d:再多就要分库分表了。 二、Java基础部分 Java最新版本,及其新增的特性 集合框架(list、set、map、源码分析及其底层原理、有序集合有哪些[怎么实现的]) 集合去重(可依赖set的特性) ConCurrentHashMap的源码(分段锁,clear()、iterater()、get()弱一致性) ConCurrentHashMap与HashTable如何选择 同步锁(synchronized、reentrantLock-lock[ConCurrentHashMap的分段锁机制,jdk1.8之前]、CAS[ConCurrentHashMap的锁机制-synchronized+CAS,jdk1.7之后]) 线程池(核心ThreadPoolExecutor类的参数:corePoolSize、maxmumPoolSize、keepAliveTime(这个参数allowCoreThreadTimeOut要为true才可以设置空闲线程等待时间,默认为false,需要指定)、timeutil、workQueue[BlockingQueue、]、threadFactiry、handler) 作用:能够限定最大的线程数,避免过多的线程上线文切换而导致系统运行缓慢,减少 线程创建与销毁的开销;减少GC次数 自动装箱与自动拆箱 异常(运行时、非运行时;以及他们的区别) 反射 IO(字符流Writer、Reader、字节流InputStream、OutPutStream) JMM原理(可见性[一致性]、有序性、原子性、happen_before原则) volitale是什么(可以保证一致性,不能保证原子性) Transient关键词 Happen-Before原则 ThreadLocal(线程本地标量表,线程私有;内部是用ThreadLocalMap来存储相关信息,key为当前线程,value为Object) JVM内存划分及其内存分配、回收算法、怎么判断是否要回收某一对象[引用计数法、可达性分析算法]、分代对象比例(Eden:servivor0:servivor1=8:1:1)、老年代与年轻代的对象比例(2:1)、调优参数[Xmx、Xms、Xmn、PermSize、MaxPermSIze…] 引用的类别(强引用、软引用、弱引用、虚引用) 引用的种类与垃圾回收的关系 类加载机制(加载、验证[验证class字节码的准确性]、准备[为类分配存储空间、将类信息分配在方法区、在堆中新建java.lang.Class对象]、初始化[为变量初始化]、解析[将符号引用转为直接引用]、使用、销毁[即为回收]) 泛型、泛型类型擦除 菱形运算符 JIT逃逸分析(同步省略、堆内存转为栈内存、标量替换) 常用的设计模式(概念:经过无数的实践,可以反复使用,可以解决特定问题的设计方法;工厂设计模式、单例模式、代理模式、包装模式) 代理模式(jdk动态代理、cglib动态代理) JDK常用的设计模式(结构型模式、创建模式、行为模式) AQS(AbstractQueuedSynchronizer),AQS是一个用来构建锁和同步器的框架,使用AQS 能简单且高效地构造出应用广泛的大量的同步器,比如ReentrantLock、FutureTask、ReentrantReadWriteLock等等皆是基于AQS。 B_IO N_IO A_IO的区别,以及底层怎么实现的 JVM查看各个内存区域的分配(jmap…) 三、分布式部分 分布式锁的实现(基于数据库的排它锁、基于数据库建一张表作为锁表、基于redis缓存、基于zookeeper) 秒杀系统的实现(高并发、读多写少、资源竞争等场景;采用负载均衡、redis缓存、锁等解决方案) CAP理论(consistency、available、partition tolerance[分区容错])三者不可兼得,一般舍弃一致性,通过相关技术保证一致性。 分布式缓存(redis、memcached,两者如何选型,两者优缺点) dubbo(概念、原理、优点、缺点) 概念:是阿里的一个开源分布式RPC和微服务框架,基于Java的interface作为服务的契 约,通过注册中心完成服务的注册与发现,具体业务代码通过代理类屏蔽,致力 于提供透明化的RPC调用和SOA服务治理方案。 原理:提供者、消费者、注册中心、监控中心、容器 优点:服务自动发现、集群容错、错误重试、软负载、解耦等 缺点:单一的系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护。 redis(原理:支持存储的数据类型、支持事务、支持bgsave福全镜像持久化和aof增量持久化、单线程、数据淘汰策略[allKeys-lru、allKeys-random、volatile-lru、volatile-random、volatile-ttl、no-enviction]、回收算法[引用计数器、LRU算法]) MQ(作用:限流、削峰、异步、解耦) tomcat原理(线程池、proxy[BIO、NIO、APR]) Nginx的原理 Zookeeper的原理 四、项目部分 项目背景,如:为什么要重构;项目处理方案 项目总体结构需要清楚,要有层次感,先讲系统架构然后各个模块的作用 项目的亮点要体现出来 各个模块需要清楚,包括功能、技术 核心技术点需要了解怎么处理的 根据场景设想面试官会问什么在项目没有的场景你是什么解决的 要到的分布式技术要知道原理,如:内部通讯、消息队列、分布式缓存(dubbo、mq、redis) 按事实回答,如果不是自己做的模块但自己知道,你就说有去了解过,然后开始巴拉巴拉 五、网络部分 DNS cookie、session post、get请求的区别 TCP与UDP的区别 TCP三次握手过程 四次挥手 socket HTTP与HTTPS的区别 HTTP包含哪些信息 六、数据结构部分 七、框架部分 IOC(工厂模式、单例模式、xml、dom4j xml解析器) AOP(JDK代理、cglib代理) 一面(30分钟) 你最近在干吗?(********)、你能说下服装外贸的流程吗?、集合底层原理、介绍项目、介绍下buddo、如果我发了两笔相同的转账你是怎么处理的?(项目上,采用redis,开始巴拉巴拉)、redis挂了怎么办?(采取集群模式,能够持久化:命令行log和持久化到本地或者是远程服务器存储)、你能讲下对账吗?、你有什么要问我的吗? 二面(45分钟) 介绍一下自己、介绍一下项目、问了个交易场景是怎么处理的、你做过jvm的优化吗(答:没有,因为在项目上有专门的架构团队,他们负责这些工作,但我有简单了解过)?那你在项目上优化过什么没有?(答:将数据库数据放入缓存、因为这些数据是不常改的)你除了学习java还有学习其他语言吗?(答:有了解过python偶尔会去看一些视频,毕竟现在我还处在学习阶段,我觉得我现在应该先把java基础先打牢,然后再去把其他语言作为第二或者第三语言)、你看过redis、dubbo的源码吗?(答:没有,但我简单了解过;看源码就是看别人写的好的代码思想,因为看源码需要有足够的能力才有看得懂,我觉得java的基础得先掌握牢固,比如:设计模式啊、jdk源码啊等)你除了在项目上学的东西还有哪些途径获取知识(公众号、书)、你关注的公众号有哪些?(Hollis、Java后端技术、Java思维导图、Java技术栈、Java面试笔试)、在最近的一篇文章你学到了什么(JVM,开始巴拉巴拉)、你参加过世界知名的大赛吗?(如:ACM,答:我参加过蓝桥杯、创新大赛,ACM没能力去啊)、你的成绩怎样?(开始巴拉巴拉) 三面(49分钟,交叉面) 前戏: **A:**你面的是ICBU(国际技术事业部)是吗? **B:**是的,之前填的是这个部门 **A:**来我们部门(业务平台事业部)吧?现在阿里的重心在我们部门,ICBU的话不是公司的业务核心(面试官在憨笑) **B:**可以啊,可以转部门吗?可以的话我就转过来(在憨笑) **A:**可以转,不过一般是要在正式两年之后才可以 **A:**你之前面试过吗?你是第轮面试了啊? **B:**这是第三面了 **A:**你现在人在哪里呢? **B:**我现在在深圳这边 **A:**来杭州吧,深圳那边的话是一个研发基地,杭州是总部基本核心业务部门都在这里 **B:**可以的,听从安排,毕竟阿里牛人多,哪里需要去哪里(在笑着) **A:**好吧,现在开始面试吧 面试: **A:**自我介绍下… **B:**巴拉巴拉 **A:**你做过哪些项目 **B:**开始叙述…(先讲做过的项目,然后挑一个熟悉的项目精讲:包括项目背景、项目系统架构、用到的技术、模块的各个功能) **A:**为什么要用分布式?我单个应用集成也可以啊? **B:**分布式系统的话有这些优点:qps、运行可靠性、可扩展性、可维护性、解耦等(还好多,多巴拉巴拉) **A:**那分布式的数据一致性问题怎么解决? **B:**在我们项目的话,内部通讯主要采用的是MQ,MQ在一定程度上市可以保证数据的一致性的 **A:**MQ如何保证一致性的? **B:**比如A模块发了一个消息到Topic1,B模块监听Topic1;如果B获取了消息就会往下执行,如果没有获取则消息还在 **A:**如果此时我B系统奔溃了怎么办?这个怎么处理?(这个问题主要问的是分布式、集群的特点了) **B:**因为分布式系统在集群模式下,每一个服务实例都有运行数据的拷贝;比如B奔溃了导致线程中断,因为分布式有容灾的特性在每个B系统的集群实例都有相关数据的备份,即使B挂了也没事,还有B1、B2、B3… **A:**xxxxx模块是干什么的? **B:**巴拉巴拉 **A:**为什么网关要用restful接口方式? **B:**为了兼容之前的系统,客户化的时候去掉了网关模块;现在统一采用的是dubbo接口,因为dubbo也有错误重试、软负载、服务自动发现等优点(建议在回答的时候尽量要回答为什么,自己主动说而不是别人问) **A:**缓存你们一般用来干嘛? **B:**在我们项目的话,主要用于两个方面;一是:基础配置数据,二是:异步缓存 **A:**基础配置数据的话是你们服务起来的时候一个一个启动吗? **B:**是的,我们用的@PostConstruct注解,当服务一启动的时候就将数据库的配置加载到本地缓存;如果在应用程序中,某个请求拿不到缓存的话就去数据库查询(适当改编,因为之前是没有去数据库拿数据这一步,毕竟有可能缓存你拿不到消息) **A:**项目问完了,现在问下java基础 **A:**StringBuffer、StringBuilder的区别 **B:**巴拉巴拉 **A:**ArrayList、LinkedList的区别以及使用场景 **B:**巴拉巴拉 **A:**泛型用过吗? **B:**用过,比如List、Set、Map这些都有用到过泛型 **A:**泛型的优点是什么? **B:**避免了CastClassException的异常;在没有泛型之前是用Object,但这有一个问题是会有类转换异常;泛型有类型擦除,在编译期间类型是不会保留的 **A:**再来讲讲集合吧,HashMap是线程安全的吗? **B:**非线程安全,线程安全的有HashTable、ConCurrentHashMap **A:**设计模式用过吗? **B:**具体没用过,但了解过;比如IO的适配器模式和装饰器模式 **A:**使用单例模式的时候需要注意什么? **B:**侧重讲双重校验锁(再巴拉巴拉其他的) **A:**web开发了解吗? **B:**了解过一些 **A:**问个简单的,post与get的区别? **B:**巴拉巴拉 **A:**cookie与session的区别? **B:**巴拉巴拉 **A:**好的差不了了解了,你还有什么想问的吗? **B:**我问下的,阿里校招难吗?容不容易进啊? **A:**挺难的,现在我们部门一个都还没过,一个Offer都还没发;我是社招进来的。你这边我觉得没什么问题 **B:**阿里对待校招生有怎样的培养计划? **A:**进去之后都是有师兄带着的,也有全部的新人做一个项目… **B:**转正难不难啊? **A:**也不算难,转正的时候会参考以往的工作外加考核 **B:**好的,我差不多了解了 **A:**好的,谢谢,再见 **B:**谢谢啊,拜拜 四面(57分钟,交叉面;红色部分即回答有问题) **A:**你觉得Java跟其他高级语言有什么区别? **A:**Java的最新版本是什么?有哪些特性?(我只知道特性有stream流、lambda表达式;开始叙述lambda表达式怎么使用,stream流忘了,最新版不知道[想说java11,但不确定;查了下是java10]) A:StringBuffer、StringBuilder的区别 A:线程安全的概念 A:代理模式(jdk、cglib动态代理;区别、底层应用技术、应用场景) A:异常分为哪些,运行时异常与非运行时异常的区别,自定义异常属于什么异常 A:final与finally的区别 **A:**B_IO、N_IO、A_IO的区别以及底层原理、底层分别有哪些类进行处理与实现(我:讲了三个的概念;面试官追问:底层实现是什么?各有什么类或方法进行处理?,我:…这个不清楚) A:JMM A:JVM A:如果在代码中调用System.gc()会发生什么(我:会触发垃圾回收,可能会对线程不安全;可以在jdk中进行配置禁止在代码使用System.gc()即代码中写了System.gc()也无效因为System.gc()要JVM的配合) A:如果一个应用隔三天就会发生OutOfMemory,这个问题你会怎么排查?(我:可以用jmap工具查看相关jvm的内存区域占用情况,其他不知道了) A:数据库主从复制怎么实现,具体的配置(我:通过binlog实现主从复制,怎么配置不是很清楚,没有具体实现过) A:MySQL怎么备份数据(mysqldump -h127.0.0.1 -uroot -ppass myweb > d:/backupfile.sql)(我:之前一般都用navicat工具备份的,我记得是用mysqlxxx命令备份的;哎,记错了、忘记了这一点,这么简单的都不会) A:复合索引的问题 A:MySQL的存储引擎有哪些,他们有哪些区别以及使用场景(我:我知道有InnoDB,一般都是用这个存储引擎,从MySQL5.5.5开始默认也使用该引擎;该引擎支持事务、行级表等高级特性…;虽然是知道有其他的,记不起来了) A:MySQL事务的四个特性 A:xxxxx项目分为哪几个模块? A:适配器用来干嘛的?(面试官:没什么新颖的啊 编辑搜图 请点击输入图片描述 ; 可能我表达的方式不对吧) **A:**你们项目的幂等校验 A:我大概了解了;结果的话这个星期会出,你注意下手机或者邮件。先这样了,再见 A:谢谢,拜拜 …(还有其他的,记不起来了) 笔试(40分钟) 选择题-10分、应用题(string stringBuffer stringBuilder的区别、多线程的实现方式 举例线程不安全、JVM内存区域划分 并解释)-30分、算法题(两题;应用递归-20、应用二分查找-40)-60分(注:幸好算法题这两个都会,应用二分查找的其实题目是要求尽可能降低时间复杂度,我选择的二分算法,因为只有这个我才会) 技术(80分钟) 介绍下自己、你的职业规划、介绍项目、redis原理(巴拉巴拉单线程基于内存操作的key-value数据库;支持的数据类型、多种数据淘汰策略、回收算法)、redis多台实例怎么配置、dubbo原理、你用过哪些索引、讲讲socket(我就知道socket是基于传输层的,具体我没用过;在tomcat中到接收到一个请求的时候,会把socket请求放在accept队列,然后交给worker线程池处理,获取线程之后根据连接获取参数生成一个request转发至servlet容器)、http请求包含哪些信息(报文头-url http版本号 请求方式是post还是get等、报文体-内容)、你用过哪些线程池(我:没有用过,因为在项目中spring框架已经封装好了,但我了解过Excutor,ThreadPoolExcutor是线程池的核心类,有这些参数…)、你知道的常见设计模式(IOC的单例、工厂,AOP的动态代理 jdk和cglib,IO的适配器和装饰器模式,Object.clone()的原型模式、Integer Boolean Character的享元模式;面试官:那你知道解释器模式吗? 我:想了一会[忘了],这个忘了,因为23种有点多;format就是解释器模式[我怎么忘了呢,心累啊])、你知道哪些锁(开始巴拉巴拉Synchronized、ReentrantLock、CAS;看我回答到了底层,然后面试官就问:你看过源码是吗? 我:是的,jdk源码有些常用的看过)、数据库表级锁在MySQL5.6有吗?(5.6我不能很确认,因为我一般用的5.7;面试官:那5.7有表级锁吗? 我:有,比如事务隔离等级的串行化就是表级锁,表级锁锁粒度是最大的加锁快,但是性能最差,容易造成锁冲突)、你在项目上遇到过什么问题…(还好多问题记不到了) HR(30分钟) 介绍下自己、你的职业规划、你为什么离开之前公司(之前的公司偏向于业务,与我的职业规划有冲突)、你对职业行业有什么选择、如果安排你做大数据可以吗?你之前公司的实习薪资是怎样的、你的期望薪资是多少?(我:*****,HR:我们这里给不了这么高,我:没事儿,我相信贵公司能够给一个合理的工资,HR:不过你比较特殊,实习经验丰富…)、你住的离这里远吗?(很近,在前海,才三公里)、面试结果下午给你答复… 笔试 面试官说,直接来吧从第一题开始,指着题目说:你有什么想法… 题目大概意思:在一个已经排序好的数组,判定某个数组里面的两个数相加的和是否等于X返回boolean;方法参数数组A,数值X(然后我开始讲思路,面试官说:可以) 题目大概意思:求台阶的积水量(然后我开始巴拉巴拉,用这种算法可以,比如:…;面试官看了半天,最后微笑着说这种方法也行,就是代码实现起来有点复杂,不过方案可行) 题目大概意思:数据库有2000w条数据,内存为10G,最大应用内存为100M(类似于jvm内存);假设我需要更新某个字段的状态,如何保证这些数据都处理完? 我:我觉得可以使用线程池,首先测试单个线程的暂用内存,然后新建一个 线程池在内存允许的情况下设置maximunPoolSize,在select的时候用Limit关键词;在保证内存不会超出的状态下可以尽可能地加快执行效率 面试官:那线程池的作用是什么? ** 我**:线程池就类似于一个池子,这可以在应用可以承载的前提下尽可能发挥CPU的优势,也不会因为过多的线程导致上下文的切换导致系统运行缓慢 面试官:你做过正则校验码? 我:没做过,但简单了解过,之前项目有正则校验又去看过 面试官:最后这题有点难那就不为难你了 一面(python或go面试官) 介绍下自己 你知道http协议吗? http协议包含什么信息 cookie与session的区别 http是长连接还是短连接? 怎么可以让http可以像tcp一样实现长连接? tcp协议 我这边没问题,请稍等会 …(还好多,一下子面了四面太多了记不住) 二面(java面试官?) 介绍下自己 讲下项目 xxxx模块是什么功能 dubbo原理 redis原理 RocketMQ的原理你知道吗?(我:mq是消息队列,具有削峰、限流、异步、解耦等特点…具体怎么实现的不太了解) redis的RDB全镜像持久化底层是怎么做的 MySQL的索引 索引的底层数据结构有哪些(B+、B-、Hash) B+与B-有什么区别(B+是各个节点都是有数据的,B-的话是将数据放在叶子节点上) 有两个已经排序好的数组A、B,找出他们的中位数(我:新建一个空数组C,大小为这两个数组的长度;先将数组A放在C中从0下标开始,外层循环B获取值赋给temp,再在C中通过二分查找插入temp值[O(log2n)]或者是一个一个遍历找到位置插入temp[O(n)]);最终从C中选算中位数即可。 你还有什么要问我吗?(还是老套路) 我这边没问题,你稍等会 三面(C++面试官): 介绍下自己 你之前做的项目都是Java的吗? 你有了解过其他语言吗? 我们来一个非程序问题,你知道1000的阶乘有多少个0吗?(我:开始分析,巴拉巴拉利用5的倍数乘以2^n能得0的特性我们可以求出100的阶乘有多少个0,然后再乘以10,因为百位数我们可以不管…巴拉巴拉[面试官一旁也在帮我分析]) 你简历的是java开发让你做python、go可以吗?(python的话今年来越来越火;python的话我也了解过一些,一般用于非服务器端的数据分析,如果python的话我愿意) 然后我们聊了C++与java的区别与特性包括优缺点 你还有什么要问我吗?(还是老套路) 我这边没问题,你稍等会 …(还好多,一下子面了四面太多了记不住) HR面: 介绍下自己 你一直在北京吗? 为什么来深圳? 你是打算在深圳了吗? 你有去面其他的公司吗?(有:前几天拿了xx科技股份有限公司的Offer,现在还在阿里的三面)、阿里的三面什么时候?(我:就这个星期) 那意思是你下周才能确定来这里是吗?(我:是的,这周我还在等阿里的三面) 你面的那个公司给你多少(我:实习期间xxxx,转正后10k+) 你简历的是java开发让你做python、go可以吗?(python的话今年来越来越火;python的话我也了解过一些,一般用于非服务器端的数据分析,如果python的话我愿意来) 你还有什么要问我吗?(还是老套路) 好的现在也差不多了你也忙活一下午了,先就这样了 面试太水了(开始就问我mvc,然后mybatis的动态SQL,这也太古老了吧),不说了。两面技术面,一面HR面。 针对上面的技术我特意整理了一下,如果想学习Java工程化、高性能及分布式、深入浅出。性能调优、Spring,MyBatis,Netty源码分析的朋友可以查看一下: 这些书籍都是非常不错的, 值得大家研读, 不知道怎么去学习, 也可结合思维导图找到学习的方向。 资料获取方式:关注公众号:“程序员白楠楠”获取上述资料 重要的事情说三遍,转发+转发+转发,一定要记得转发哦!!!
阿里巴巴集团(给自己打分-一面:90、二面:85、三面:90、四面:75)
xx科技股份有限公司-150分钟
xx文化传媒有限公司(360子公司)-210分钟
......(还好多,一下子面了四面太多了记不住)
xx软件集团有限公司(90分钟)