首页 文章详情

工作4年的程序员,这些面试题一个都答不上来

程序IT圈 | 533 2020-06-05 23:30 0 0 0
UniSMS (合一短信)

最近有很多朋友去目前主流的大型互联网公司面试(阿里巴巴、京东、字节跳动、蚂蚁金服、滴滴),面试回来之后会发给我一些面试题。有些朋友轻松过关,拿到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 等技术栈,文末获取免费领取方式

c7d38eb4a926bc2208a05d2f40d0e181.webp


JVM


  1. 线程

  2. JVM内存区域

  3. JVM运行时内存

  4. 垃圾回收与算法

  5. JAVA 四种引用类型

  6. GC分代收集算法 VS 分区收集算法

  7. GC垃圾收集器

  8. JAVA IO/NIO

  9. JVM 类加载机制

3b243ee14b6e59da0c5c71343cc591c9.webp


JAVA集合


  1. 接口继承关系和实现

  2. List

  3. ArrayList(数组)

  4. Vector(数组实现、线程同步)

  5. LinkList(链表)

  6. Set

  7. HashSet(Hash表)

  8. TreeSet(二叉树)

50c5488000d9b1d33c69ec6e86e98eb4.webp

JAVA多线程并发


  1. JAVA并发知识库

  2. JAVA线程实现/创建方式

  3. 4种线程池

  4. 线程生命周期(状态)

  5. 终止线程4种方式

  6. sleep与wait 区别

  7. start与run区别

  8. JAVA后台线程

  9. JAVA锁

  10. 线程基本方法4.1.11. 线程上下文切换

  11. 同步锁与死锁

  12. 线程池原理

  13. JAVA阻塞队列原理

  14. CyclicBarrier、CountDownLatch、Semaphore的用法

  15. volatile关键字的作用(变量可见性、禁止重排序)

  16. 如何在两个线程之间共享数据

f64b7308567801353f230aa1c55c77cc.webp

JAVA基础


  1. JAVA异常分类及处理

  2. JAVA反射

  3. JAVA注解

  4. JAVA内部类

  5. JAVA泛型

  6. JAVA序列化(创建可复用的Java对象)

  7. JAVA复制

10b4e09dc088a54bbb4063693b7c59c3.webp

Spring 原理


  1. Spring 特点

  2. Spring 核心组件

  3. Spring 常用模块

  4. Spring 主要包

  5. Spring 常用注解

  6. Spring第三方结合

  7. Spring IOC原理

  8. Spring APO原理

  9. Spring MVC原理

  10. Spring Boot原理

  11. JPA原理

  12. Mybatis缓存

  13. Tomcat架构

45e982b6a90648fceeeec3fef751d5bc.webp

微服务


  1. 服务注册发现

  2. API 网关

  3. 配置中心

  4. 事件调度(kafka)

  5. 服务跟踪(starter-sleuth)

  6. 服务熔断(Hystrix)

  7. Hystrix断路器机制

  8. API管理

faef6cb97048de3ff185ecab4b218f51.webp

Netty 与RPC


  1. Netty 原理

  2. Netty 高性能

  3. Netty RPC实现

  4. 关键技术

  5. 核心流程

  6. 消息编解码

  7. 通讯过程

  8. RMI实现方式

f1896deb1ae4cf79c78b1c12c35bd67b.webp

分布式缓存
  1. 缓存雪崩

  2. 缓存穿透

  3. 缓存预热

  4. 缓存更新

  5. 缓存降级

c7032989eab18ac00f240064f23e413d.webp

Zookeeper
  1. Zookeeper概念

  2. Zookeeper角色

  3. Zookeeper工作原理(原子广播)

  4. Znode有四种形式的目录节点

b46baa273104c2cbbcd22ed2d465972a.webp

Kafka
  1. Kafka概念

  2. Kafka数据存储设计

  3. partition的数据文件(offset,MessageSize,data)

  4. 数据文件分段segment(顺序读写、分段命令、二分查找)

  5. 数据文件索引(分段索引、稀疏存储)

  6. 生产者设计

  7. 负载均衡(partition会均衡分布到不同broker上)

  8. 批量发送

  9. 压缩(GZIP或Snappy)

  10. 消费者设计

2cc23c9e54540fa4f68d2a8c3f26ce1d.webp

RabbitMQ
  1. RabbitMQ概念

  2. RabbitMQ架构

  3. Exchange 类型

43e8c0c84e3841ce9f955d764368083d.webp

算法


  1. 一致性算法

  2. Java算法

  3. 数据结构

  4. 加密算法

e34db11c49b832512099271f33826548.webp


看完上面的内容,相信大家已经有了清晰的目标与方向,接下来就是查找学习资料了,我们为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考,学习资料包内容及领取方法如下



部分资料展示:

4b6d46fd5080954c67f662c50a661687.webp

1c80cae9377f4042f524151d7f9a1a97.webp

bb23143d9ea5f49c20b9abd614ee510b.webp

44a4f9d345eb976c215a12586387b2c5.webp

【上图展示的只是一小部分】领取方式

扫码加QQ群:932010690

免费领取资料

ps:资料每周都会在群内定时更新。

d1fbca07b2955904a77aa0f982c6f11e.webp


最后祝愿即将跳槽和已经在求职的大家都能找到一份好的工作,我把这些面试题,放在我的Java资源分享群里,群里会各种书籍,群里也有资深HR可以推荐工作,跟行业大牛交流技术,欢迎大家来交流学习。

02be5a394a49e61872a0e89b8723f2bb.webp

“阅读原文”也可以直接进QQ群免费领取面试资料!
good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter