金九银十就要来了,不知道程序员们都准备好了吗?
今天就给大家分享一波一位小伙伴面试大厂的经历、知识点和面试题分享,主要内容包括:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、 Zookeeper、 Kafka、 RabbitMQ、 Hbase、 MongoDB、 Cassandra、设计模式、负载均衡、数据库一致性算法、 JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算。
Zookeeper+微服务+消息中间件+高并发架构设计+幻影读+分段锁+Spring Cloud+秒杀+事务+集群+秒杀架构等等。
希望能够成就大家的大厂梦!!!
北京985渣硕一枚,是真的渣,舍友商汤、旷世,出国留学,学校中各类大佬一坨,在夹缝中求生,混口饭吃。
主攻方向:无。领导搞行政的,天天端茶倒水取快递,外挂写不尽的基金本子,论文全靠个人参悟+上天怜悯。
说点正事吧,关于工作路线,我最终选择的是大数据研发方向,主要原因是研一上了点分布式的课,拿出来吹一吹,还能唬的住人。个人感觉算法也能做,研发、算法半斤八两吧
学校这边的话,有优秀高校背书自然要好,没有的话,就没有吧,大牛们不差这点,渣渣们大家也强不到哪去,不必强求。
项目,在读书过程中,一定要了解个项目,否则面试官真没啥问题你的,尬场基本就凉凉了。这项目不必真的是你的,当找工作时,所有前辈、朋友的项目全都是你的,包装下,你说是你的就是你的,没人去查你底细的,关键了解要深,这样和别人说底气才足。我有幸给一个数据流项目做了些边角任务,但在简历上,我成为了该项目的负责人...自己体会包装的艺术...
简历,我以前认为大家“没见过猪跑还没吃过猪肉吗”,网上那么多强调简历重要性的,直到我看见我小师弟的简历,发现真的有人没吃过猪肉(我学硕他专硕,一起找工作,他有百度大厂背书,可这工作找的唉...)。最简单的修改方法,让你附近的同学看看,第一眼感觉可以吗,可以就ok,不可以就gg,照着人家的改改。
现在前头,准备要早,投的也要早基本7月中旬就陆陆续续开始有提前批了,错过就没了。>...< 。
一面
二面
三面
一面
二面
三面
一面(50分钟)
二面(40分钟)
三面(约1个小时)
一面
二面
三面
HR面
写给需要的,不想死磕互联网的人:ヽ(。◕‿◕。)ノ
最后,送上我面试过程中整理出的Java核心知识点(可能有误-_-||),供大家查漏补全,希望大家都能找到个好offer~~~~~~~~~~
线程并发
这就是一天坑,基本问不完,难度也是拉满的那种...
Q:进程和线程的区别?
Q:进程间通信方式?
核心目的是交换数据
除了会枚举,这些名词的具体概念也应该做到心中有数,传送门
Q:线程间通信方式?
核心目的是同步
Q:Callable、Runnable区别?
Q:Future和Callable的关系?
Q:创建线程的方法?
Q:volatile关键字的作用?
Q:synchronized的用法?
Q:讲一下Java内存模型?
网上一大堆,引用前人的清明上河图
Q:CountDownLatch和CyclicBarrier了解吗?
Q:Semaphore用法?
控制一组资源的使用,通过acquire()和release()获取和释放这组锁,盼盼防盗门
Q:ThreadLocal作用?
修饰变量,控制变量作用域,使变量在同一个线程内的若干个函数中共享。
大佬指路
Q:单例与多例的区别?
Q:锁释放的时机?
Q:notify唤醒时机?
notify后不会立刻唤醒处于线程等待池中的线程,而是等当前同步代码块执行完,才释放当前的对象锁,并唤醒等待线程。
Q:notify和notifyAll区别?
notify通知一个线程获取锁,而notifyAll通知所有相关的线程去竞争锁
Q:讲一下Lock?
Lock是为了弥补synchronized的缺陷而诞生的,主要解决两种场景
Lock是一个类,并非Java本身带的关键字,相对于synchronized而言,需要手动释放锁。
Q:锁的种类?
集合相对容易,常规送分题,基本都会问到HashMap
Q:TreeSet特性?
内部元素通过compare排序。
Q:LinkedHashMap特性?
内部有个双向链表维护了插入key的顺序,使得map能够依据插入key的顺序迭代。
Q:ArrayList与Vector的差别?
ArrayList是非线程安全的,Vector是线程安全的。
Q:LinkedList与ArrayList的差别?
Q:HashMap与HashTable的差别?
Q:Set与List的差别?各自有哪些子类?
Set不允许重复元素,List允许重复元素,List有索引
Q:hashCode()、equals()、==区别?
Q:Java容器中添加的对象是引用还是值?
引用
Q:Iterator和ListIterator的区别?
Q:HashMap实现?
内容巨多,引用大佬面经,值得一看,目录供大家参考
PS:HashSet是通过HashMap实现的
Q:ConcurrentHashMap和HashTable区别?
这块主要介绍JVM内存的划分以及GC算法
Q:什么是内存泄漏和内存溢出?
内存泄漏最后会导致没有足够的空间分配对象,从而导致内存溢出,当然也可能开始分配过大的对象导致内存溢出
Q:导致内存溢出的因素?
Q:JVM内存划分?
基本说出上面三条就可以了,更详细的见下图,前门
Q:简单说一下垃圾回收?
这可不简单...
垃圾定义:
堆中内存分布:
垃圾回收算法:
Q:Minor GC、Major GC和 Full GC的区别?
Q:Full GC触发时机?
Q:什么是常量池?
常量池分为静态常量池和运行时常量池。
包含的信息:
该问题一般会引出字符串常量比较
String s1 = "Hello";
String s2 = "Hello";
String s3 = "Hel" + "lo";
String s4 = "Hel";
String s5 = "lo";
String s6 = s4 + s5;
String s7 = "Hel" + new String("lo");
String s8 = new String("Hello");
String s9 = s8.intern();
System.out.println(s1 == s2); // true,直接取自常量池
System.out.println(s1 == s3); // true,在编译时会优化成常量池内字符串的拼接,区别 s6
System.out.println(s1 == s6); // false,本质上是变量拼接,区别 s3
System.out.println(s1 == s7); // false,含有对象 new String("lo")
System.out.println(s1 == s8); // false,对象与字符串常量比较
System.out.println(s1 == s9); // true,字面量比较
复制代码
面试时有人问到过,回去大概查了下
Q:讲一下类加载过程?
Q:Java初始化顺序?
这是在爱奇艺碰到的一面试道题,当时差点两眼一抹黑过去了...头一次发现这么多东西要初始化
类内容(静态变量、静态初始化块) => 实例内容(变量、初始化块、构造器)
父类的(静态变量、静态初始化块)=> 子类的(静态变量、静态初始化块)=> 父类的(变量、初始化块、构造器)=> 子类的(变量、初始化块、构造器)
Q:Java类加载器的种类?
Q:双亲委派模式了解吗?
我理解的深度比较浅,个人理解,委派就是加载类时先看上层加载过没,如果加载过了,当前就不加载了,直接使用当成加载器加载的类。
其次是加载顺序,System->Extension->Boostrap
优点:
这些问题很弱鸡,但考的也比较多
Q:面向对象的三大特性?
顺口溜一般的背出来:封装、继承、多态
然后会让你讲讲这三个特性如何体现,大家自己想想吧,言之有理即可
Q:Java中接口和抽象类区别?
Q:重载和重写?
猪脑子,老记混
Q:例举一下你了解的设计模式?
一般说5、6个,有个样例就行了
Q:手撸单例?
撸完,让你讲讲内部细节,volatile或多例问题
public class Singleton {
private volatile static Singleton singleton;
private Singleton(){}
public static Singleton getSingleton(){
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
复制代码
Q:TCP3次握手4次挥手?
基本画张图就K.O.了,fate门,内部的问题也建议看一下
Q:TCP为什么是一定要是3次握手,而不是2次或3次以上?
2次挥手的问题
在第1次建立过程中,client请求链接在网络中滞留过久,导致client发送第2次请求,建立完毕后,这时第1次的请求到达server,server接收又维护一链接,但该链接实际上已经作废,浪费了server端的资源。
3次以上的方案
理论上,做到3次以上是可行的,但真正想做到一个完美可靠的通信是不可能的,因为每次答复都是对上次请求的响应,但该次答复在不可靠的信道中仍是会丢失的,考虑到现实效率问题,3次足以。
Q:TCP为什么是4次挥手,而不是3次呢?
Q:TCP半连接池与全连接池?
Q:TCP和UDP的区别?
Q:TCP和UDP的应用?
Q:TCP/IP与OSI模型?
TCP/IP模型,自下而上
OSI模型,自下而上
Q:ping命令基于哪种协议?
ICMP
Q:阻塞式和非阻塞式IO区别?
阻塞式
非阻塞式
用数据库做过开发,但是了解的不深入,面试问我会不会写SQL时,我多答“简单的可以,复杂的尝试一下”...SQL复杂起来真不是人写的...
Q:聚集索引和非聚集索引区别?
Q:where、group by、having执行顺序?
Q:星型、雪花结构?
出自
Q:SQL纵向转横向,横向转纵列?
基本上,除了 group by + 聚集函数 外,这是最难的 SQL 题了
sum(case when A='a' then B else 0 end) as D
这里需要用sum或其他聚集函数,因为作用在一个group中
核心用union
记住这两条做到举一反三就可以了,Demo
Q:脏读、不可重复读、幻读?
这引出事务隔离级别
事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 是 是 是 不可重复读(read-committed) 否 是 是 可重复读(repeatable-read) 否 否 是 串行化(serializable) 否 否 否
Q:join实现的三种方式?
Q:查看xxx端口占用?
Q:查看xxx进程占用?
Q:查看CPU使用情况?
Q:查看内存使用情况?
Q:查看硬盘使用情况?
Q:$0、$n、$#、$*、$@、$?、$$含义?
变量 含义 $0 当前脚本的文件名 $n 传递给脚本的第n个参数 $# 传递给脚本的参数个数 $* 传递给脚本所有参数 $@ 传递给脚本所有参数。与$*有小差别,出门下扒 $? 上个命令的退出状态 $$ 当前Shell进程ID
Q:>、>>区别?
Q:>、1>、2>、2>&1、2>1区别?
Q:定时任务命令?
算法的海洋的无边无际,但是应付面试题的算法,个人认为《剑指offer》一本足矣...
个人《剑指offer》刷了大概四遍,基本上看到一道题,所有解法都知道,面试上也基本从这里出
我遇到现场出的算法题(除了《剑指offer》上的),一般是暴力搜索题,不要上来想DP...
经典问题
智力题
这方面一般问的是偏向于各类框架
以上框架,大家各取所需吧,总有几个要能拿出来吹的,我个人主要吹Spark这块
Hive、HBase一般也是当工具用的,主要问平时用没用过,用过的话就会多问些,我一般是回答搭建过,照着文档看过一阵子,对方一般就不问了
Zookeeper在底层维护分布式的一致性,多少了解一些分布式协议raft这类的也是加分点
Q:两表Join方案?
3、4方案了解即可,个人感觉有些不靠谱,面试中一般没提,面试官一般要求到2,有数据倾斜的另说
Q:MapReduce过程?
大数据岗位必考题
三言两语也说不清,建议去看网上大佬的,传送门
看完后能回答如下几个问题即可:
Q:Hadoop 中 Secondary NameNode作用?
合并fsimage与editlog
Q:Yarn架构?
Q:Yarn相对于Hadoop的优势,或说为什么要有Yarn?
Q:Yarn延迟调度的含义?
主要针对当作业所需的资源,在本地并没有满足时,会延迟一段时间,再尝试调度,实在不行时会放到别的机器上调度,主要因为本地调度效率最高。
Q:Spark有几种部署模式?
Q:standalone基本架构?
Q:groupByKey和reduceByKey哪个效率高?
Q:数据倾斜是什么?如何处理?
必考题,可以问的很深...
定义:shuffle过程中,某个几个key对应的value太多,集中在某一个reduce task中,导致该task处理过慢或直接崩掉(out of memory)
解决方案:
求大佬点拨,个人认为随机数这种算法可以解决一定的数据倾斜,但
Q:倾斜join如何处理?
和上面的数据倾斜有一定联系,但不完全相同
Q:基本概念?
问的很多,主要看你对Spark的了解程度
Q:枚举一下transform和action?
Q:基本架构?
能把以上这些概念串起来基本就OK
Q:介绍下ISR副本策略?
一个leader与一堆副本follower,follower从leader上拉取副本并返回ack,leader收集到足够多的ack后,认为该message是committed,并返回给client。
该leader与这些follower被称为 in sync 状态,这个集合是动态变化的,当某个follower拉下太多时,会被踢出该集合,从而保证了能快速的响应用户请求,当它追上来时会再加入该集合。
为了保证数据不丢失,可以设置该集合最少需要多少个follwer,当小于该数时该partition便不可用瞅一眼?
JVM
2.1. 线程
2.2. JVM内存区域
2.3. JVM运行时内存
2.4.垃圾回收与算法
2.5. JAVA四中引用类型
2.6. GC分代收集算法VS分区收集算法
2.7. GC垃圾收集器
2.8. JAVA IO/NIO
2.9. JVM类加载机制
JAVA集合
3.1. 接口继承关系和实现
3.2. List
3.3. Set
3.4. Map
Java多线程并发
4.1.1. JAVA并发知识库
4.1.2. JAVA线程实现/创建方式
4.1.3. 4种线程池
4.1.4.线程生命周期(状态)
4.1.5.终止线程4种方式
4.1.6. sleep与wait区别
4.1.7. start与run区别
4.1.8. JAVA后台线程
4.1.9. JAVA锁
4.1.10.线程基本方法
4.1.11.线程上下文切换
4.1.12.同步锁与死锁
4.1.13.线程池原理
4.1.14. JAVA阻塞队列原理
4.1.15. CyclicBarrier、CountDownLatch、Semaphore的用法
4.1.16. volatile关键字的作用(变量可见性、禁止重排序)
4.1.17.如何在两个线程之间共享数据
4.1.18. ThreadLocal作用(线程本地存储)
4.1.19. synchronized和ReentrantLock的区别
4.1.20. ConcurrentHashMap并发
4.1.21. Java中用到的线程调度
4.1.22.进程调度算法
4.1.23.什么是CAS (比较并交换-乐观锁机制锁自旋)
4.1.24.什么是AQS (抽象的队列同步器)
Java基础
5.1.1. JAVA异常分类及处理
5.1.2. JAVA反射
5.1.3. JAVA注解
5.1.4. JAVA内部类
5.1.5. JAVA泛型
5.1.6. JAVA序列化(创建可复用的Java对象)
5.1.7. JAVA复制
Spring原理
6.1.1. Spring特点
6.1.2. Spring核心组件
6.1.3. Spring常用模块
6.1.4. Spring主要包
6.1.5. Spring常用注解
6.1.6. Spring第三方结合
6.1.7. Spring I0C原理
6.1.8. Spring APO原理
6.1.9. Spring MVC原理
6.1.10. Spring Boot原理
6.1.11. JPA原理
6.1.12. Mybatis缓存
6.1.13. Tomcat架构
微服务
7.1.1.服务注册发现
7.1.2. API网关
7.1.3.配置中心
7.1.4.事件调度(kafka)
7.1.5.服务跟踪(starter-sleuth
7.1.6.服务熔断(Hystrix)
7.1.7. AP|管理
Netty与RPC
8.1.1. Netty原理
8.1.2. Netty高性能
8.1.3. Netty RPC实现
8.1.4. RMI实现方式
8.1.5. Protoclol Buffer
8.1.6. Thrift
网络
9.1.1.网络7层架构
9.1.2. TCP/IP原理
9.1.3. TCP三次握手/四次挥手
9.1.4. HTTP原理
9.1.5. CDN原理
日志
10.1.1. SIf4j
10.1.2. Log4j
10.1.3. LogBack
10.1.4. ELK
Zookeeper
11.1.1. Zookeeper概念
11.1.1. Zookeeper角色
11.1.2. Zookeeper工作原理(原子广播)
11.1.3. Znode有四种形式的目录节点
Kafka
12.1.1. Kafka概念
12.1.2. Kafka数据存储设计
12.1.3.生产者设计
12.1.1.消费者设计
RabbitMQ
13.1.1.概念
13.1.2. RabbitMQ架构
13.1.3. Exchange类型
Hbase
14.1.1.概念
14.1.2.列式存储
14.1.3. Hbase核心概念
14.1.4. Hbase核心架构
14.1.5. Hbase的写逻辑
14.1.6. HBase Vs Cassandra
MongoDB
15.1.1.概念
15.1.2.特点
Cassandra
16.1.1.概念
16.1.2.数据模型
16.1.3. Cassandra-致Hash和虚拟节点
16.1.4. Gossip协议
16.1.5.数据复制
16.1.6.数据写请求和协调者
16.1.7.数据读请求和后台修复
16.1.8.数据存储(CommitLogMemTable、SSTable)
16.1.9.二级索引(对要索弓的value摘要,生成RowKey)
16.1.10.数据读写
设计模式
17.1.1.设计原则
17.1.2.I厂方法模式
17.1.3.抽象工厂模式
17.1.4.单例模式
17.1.5.建造者模式
17.1.6.原型模式
17.1.7.适配器模式
17.1.8.装饰器模式
17.1.9.代理模式
17.1.10.外观模式
17.1.11.桥接模式
17.1.12.组合模式
17.1.13.享元模式
17.1.14.策略模式
17.1.15.模板方法模式
17.1.16.观察者模式
17.1.17.迭代子模式
17.1.18.责任链模式
17.1.19.命令模式
17.1.20.备忘录模式
17.1.21.状态模式
17.1.22.访问者模式
17.1.23.中介者模式
17.1.24.解释器模式
负载均衡
18.1.1.四层负载均衡vs七层负载均衡
18.1.2.负载均衡算法/策略
18.1.3. LVS
18.1.4. Keepalive
18.1.5. Nginx反向代理负载均衡
18.1.6. HAProxy
数据库
19.1.1.存储引擎
19.1.2.索引
19.1.3.数据库三范式
19.1.4.数据库是事务
19.1.5.存储过程(特定功能的SQL语句集)
19.1.6.触发器(一段能自动执行的程序)
19.1.7.数据库并发策略
19.1.8.数据库锁
19.1.9.基于Redis分布式锁
19.1.10.分区分表
19.1.11.两阶段提交协议
19.1.12.三阶段提交协议
19.1.13.柔性事务
19.1.14. CAP
一致性算法
20.1.1. Paxos
20.1.2. Zab
20.1.3. Raft
20.1.4. NWR
20.1.5. Gossip
20.1.6.一致性Hash
JAVA算法
21.1.1.二分查找
21.1.2.冒泡排序算法
21.1.3.插入排序算法
21.1.4.快速排序算法
21.1.1.希尔排序算法
21.1.2.归并排序算法
21.1.3.桶排序算法
21.1.4.基数排序算法
21.1.5.剪枝算法
21.1.6.回溯算法
21.1.7.最短路径算法
21.1.8.最大子数组算法
21.1.9.最长公共子序算法
21.1.10.最小生成树算法
数据结构
2.1.1.栈(stack)
2.1.2.队列(queue)
2.1.3.链表(ink)
22.1.4.散列表(Hash Table)
22.1.5.排序二叉树
22.1.6.红黑树
22.1.7. B-TREE
22.1.8.位图
加密算法
23.1.1. AES
23.1.2. RSA
23.1.3. CRC
23.1.4. MD5
分布式缓存
24.1.1.缓存雪崩
24.1.2.缓存穿透
24.1.3.缓存预热
24.1.4.缓存更新
24.1.5.缓存降级
Hadoop
25.1.1.概念
25.1.2. HDFS
25.1.3. MapReduce
25.1.4. Hadoop MapReduce作业的生命周期
Spark
26.1.1.概念
26.1.2.核心架构
26.1.3.核心组件
26.1.4. SPARK编程模型
26.1.5. SPARK计算模型
26.1.6. SPARK运行流程
26.1.7. SPARK RDD流程
26.1.8. SPARK RDD
Storm
27.1.1.概念
27.1.1.集群架构
27.1.2.编程模型(spout-> tuple-> bolt)
27.1.3. Topology运行
27.1.4. Storm Streaming Grouping
YARN
28.1.1.概念
28.1.2. ResourceManager
28.1.3. NodeManager
28.1.4. ApplicationMaster
28.1.5. YARN运行流程
机器学习
29.1.1.决策树
29.1.2.随机森林算法
29.1.3.逻辑回归
29.1.4. SVM
29.1.5.朴素贝叶斯
29.1.6. K最近邻算法
29.1.7. K均值算法
29.1.8. Adaboost算法
29.1.9.神经网络
29.1.10.马尔可夫
云计算
30.1.1. SaaS
30.1.2. PaaS
30.1.3. laas
30.1. .4. Docker
30.1.4.1.概念
30.1.4.2. Namespaces
30.1.4.3.进程(CLONE_ NEWPID实现的进程隔离)
30.1.4.4. Libnetwork与网络隔离
30.1.4.5.资源隔离与CGroups
30.1.4.6.镜像与UnionFS
30.1.4.7.存储驱动
30.1.5. Openstack
还有一份大厂面试题分享给大家!