最近有很多朋友去目前主流的大型互联网公司面试(阿里巴巴、京东、字节跳动、蚂蚁金服、滴滴),面试回来之后会发给我一些面试题。有些朋友轻松过关,拿到offer,但是有一些是来询问我答案的。
在沟通中发现,由于年限不小,他们的定位基本都是高级及以上,毕竟,年限摆在那里,面个中级也不体面。
沟通时我打算聊点基础的,先打开一下话题,结果发现对于一些开发中很基本的问题,比如:
- Git的分支你们是怎么管理的?
- 接口保证幂等性是基本的要求,那么幂等性你们是怎么做的?
- 你们有用@Transactional来控制事务是吧,那么能不能说出一些事务不生效的场景?
上面几个问题没有一个是“造火箭”的,结果发现,这些很基本的问题,他们普遍都答得很模糊,或者支支吾吾。其中,一个老哥的反问,令我印象特别深刻,他说:
上面的问题我虽然都不懂,但是我都工作六年了,如果我不能胜任工作,那你告诉我,我这5年经验是怎么来的?
再说了,做Java开发,说到底,还不是产品输出原型,对着原型进行数据库建表,然后CRUD吗?
遇到问题网上搜索一下,再不行就群里问一下,我又不找什么中间件的团队,Java开发,不都是这样吗,还能有什么别的花样?
听完我沉思了良久,做为一个高级开发,如果连Git分支如何管理都没思考过,幂等性名词的含义都解释不清,事务注解打上就完事,连生不生效的场景都不知道,只会对着产品原型CRUD,测试不提bug,代码都不想复盘多看一眼,试问谁又愿意和这样的“高级大佬”一起干活?
其实我想了一下,他之所以有这样的想法,很大程度取决于他的经历,长年在传统行业,或者“小作坊”,平时就两三个Java开发,大家都是“难兄难弟”的水平。让他认为,Java开发,就是对着原型CRUD,年限上去了,就是高级开发。
思维一旦形成,就很难改变。但是,互联网是个瞬息万变的行业。
从BAT等各种大厂的应届生招聘薪水就可以看得出,现在应届生的水平越来越6,如果还以为大家都是一样的,都是对着原型CRUD,有问题就把报错信息网上一搜,群里一丢等回复这种方式,迟早给淘汰。即使不做中间件开发,基本的原理、源码还是要了解的!
我特意整理了一下,有很多问题不是靠几句话能讲清楚,所以整理了一份Java核心知识点来解答这些面试题。很多问题其实答案很简单,但是背后的思考和逻辑不简单,要做到知其然还要知其所以然。
目录:
这个PDF的内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈,文末获取免费领取方式
JVM
- 线程
- JVM内存区域
- JVM运行时内存
- 垃圾回收与算法
- JAVA 四种引用类型
- GC分代收集算法 VS 分区收集算法
- GC垃圾收集器
- JAVA IO/NIO
- JVM 类加载机制
JAVA集合
- 接口继承关系和实现
- List
- ArrayList(数组)
- Vector(数组实现、线程同步)
- LinkList(链表)
- Set
- HashSet(Hash表)
- TreeSet(二叉树)
JAVA多线程并发
- JAVA并发知识库
- JAVA线程实现/创建方式
- 4种线程池
- 线程生命周期(状态)
- 终止线程4种方式
- sleep与wait 区别
- start与run区别
- JAVA后台线程
- JAVA锁
- 线程基本方法4.1.11. 线程上下文切换
- 同步锁与死锁
- 线程池原理
- JAVA阻塞队列原理
- CyclicBarrier、CountDownLatch、Semaphore的用法
- volatile关键字的作用(变量可见性、禁止重排序)
- 如何在两个线程之间共享数据
JAVA基础
- JAVA异常分类及处理
- JAVA反射
- JAVA注解
- JAVA内部类
- JAVA泛型
- JAVA序列化(创建可复用的Java对象)
- JAVA复制
Spring 原理
- Spring 特点
- Spring 核心组件
- Spring 常用模块
- Spring 主要包
- Spring 常用注解
- Spring第三方结合
- Spring IOC原理
- Spring APO原理
- Spring MVC原理
- Spring Boot原理
- JPA原理
- Mybatis缓存
- Tomcat架构
微服务
- 服务注册发现
- API 网关
- 配置中心
- 事件调度(kafka)
- 服务跟踪(starter-sleuth)
- 服务熔断(Hystrix)
- Hystrix断路器机制
- API管理
Netty 与RPC
- Netty 原理
- Netty 高性能
- Netty RPC实现
- 关键技术
- 核心流程
- 消息编解码
- 通讯过程
- RMI实现方式
分布式缓存
- 缓存雪崩
- 缓存穿透
- 缓存预热
- 缓存更新
- 缓存降级
Zookeeper
- Zookeeper概念
- Zookeeper角色
- Zookeeper工作原理(原子广播)
- Znode有四种形式的目录节点
Kafka
- Kafka概念
- Kafka数据存储设计
- partition的数据文件(offset,MessageSize,data)
- 数据文件分段segment(顺序读写、分段命令、二分查找)
- 数据文件索引(分段索引、稀疏存储)
- 生产者设计
- 负载均衡(partition会均衡分布到不同broker上)
- 批量发送
- 压缩(GZIP或Snappy)
- 消费者设计
RabbitMQ
- RabbitMQ概念
- RabbitMQ架构
- Exchange 类型
算法
- 一致性算法
- Java算法
- 数据结构
- 加密算法