前言
有人感慨,今年可能是过去十年中最为艰难的一年,却也是未来十年中充满希望的一年。在知名企业纷纷进行大规模裁员的风潮下,我们不得不正视一个严峻的现实:经济寒冬与裁员潮或将成为未来的新常态。
在这样的背景下,今年找工作确实不易,但我还算幸运,目前已成功斩获P8的offer。接下来,我就与大家简单分享一下我的经历和感悟。
我是一名拥有6年多经验的程序员,坐标南京。回首过去,我曾在面试中因水平有限和对部分问题的理解不足而表现不佳。我的技术掌握有限,学习主动性也一般,虽然遇到问题时会努力思考钻研,但如果没有遇到问题,我可能会过于放纵自己,被自由、轻松、安逸的生活所迷惑。此外,由于原公司项目背景的限制,我很少接触到新的技术框架,更没有涉及消息中间件、高并发分布式等主流技术。这些因素都导致我对很多新技术了解不足。
这些年来,我参加了不少面试,其中最让我印象深刻的是第一次Java面试。那时我还是本科生,并非科班出身,对Java的了解仅限于皮毛。我天真地以为只要学过Java课程就能找到一份Java工作,于是满怀期待地参加了多家公司的面试,结果却屡屡碰壁。
最初,我并没有从事Java后端开发工作,因为感觉自己并不适合那个方向。于是,我决定换一个方向或技术路径发展。由于时间和精力有限,我需要选择一个相对容易切入的领域,最终选择了Java后端开发工程师。
在这里,我想提醒大家,在找工作之前,一定要认真思考自己适合和感兴趣的工作类型。这对于未来的职业发展至关重要。
经过几个月的刻苦努力,我幸运地获得了P8的offer。虽然中间的艰辛过程难以言表,但我将所有需要的知识点进行了梳理,并提供了大部分答案。这些内容应该具有一定的参考价值,只要深入理解和掌握,相信找到一份满意的工作并非遥不可及。
Java知识
-
Java基础
-
新版本特性
-
跨平台特性
-
Java四个基本特性
-
Object类及其方法实现(尤其是equals() and hashCode())
-
基本数据类型与引用数据类型
-
Exception vs Error
-
finally vs final vs finalize
-
final vs final
-
四种引用:强引用、软引用、弱引用、幻象引用的比较
-
重载 vs 重写
-
接口 vs 抽象类
-
深克隆 vs 浅克隆
-
String vs StringBuffer vs StringBuilder (底层实现)
-
IO vs NIO vs AIO
-
反射与动态代理
-
序列化与反序列化(底层实现)
-
-
集合框架 (应用及源码分析)
-
集合框架的设计与所有的继承关系
-
Vector vs ArrayList vs LinkedList
-
HashTable vs HashMap vs TreeMap
-
HashTable vs HashMap vs ConcurrentHashMap
-
HashSet vs TreeSet
-
-
并发与多线程(应用及底层实现)
-
线程的创建方式
-
多线程应用场景
-
线程状态与转换
-
线程安全与同步机制:volatile vs synchronized vs Lock(ReentrantLock)
-
volatile底层原理
-
synchronized底层原理及其锁的升级与降级
-
Lock(ReentrantLock)底层原理
-
ThreadLocal
-
线程通信
-
线程池(底层实现)
-
死锁的出现场景、定位以及修复
-
CAS 与 Atomic*类型实现原理
-
AQS:并发包基础技术
-
Java并发包(java.util.concurrent及其子包)提供的并发工具类
-
比synchronized更加高级的各种同步结构,如:Semaphore,CyclicBarrier, CountDownLatch
-
各种线程安全的容器(主要有四类:Queue,List,Set,Map),如:ConcurrentHashMap,ConcurrentSkipListMap,CopyOnWriteArrayList
-
各种并发队列的实现,如各种BlockingQueue的实现(ArrayBlockingQueue, LinkedBlockingQueue, SynchorousQueue, PriorityBlockingQueue,DelayQueue,LinkedTranferQueue)等。
-
Executor框架与线程池
-
学习时用的相关资料+面试题:
JVM
-
JVM运行时数据区域 vs Java内存模型 (这2不一样!!!)
-
Java内存模型与happen-before原则
-
内存泄露、内存溢出以及栈溢出
-
JVM类加载机制及其作用与对象的初始化
-
JVM垃圾回收
-
如何判断对象已经死亡?引用计数法 vs 可达性分析
-
如何回收对象?垃圾收集算法
-
Minor GC vs Full GC
-
常用的垃圾收集器及其特点
-
内存分配与回收策略
-
-
GC调优
-
GC调优的思路
-
JVM常用参数
-
基于JDK命令行工具监控Java进程, 如 jps,jinfo,jstat,jmap,jstack
-
基于图形化工具监控Java进程,如MAT(Memory Analyzer),VisualVM,Btrace
-
学习时用的相关资料+面试题:
面向对象与设计模式(了解常用设计模式及其应用场景、示例)
-
-
面向对象的六个基本原则
-
单例模式(手撕各种单例模式)
-
工厂模式(Spring的BeanFactory,ApplicationContext)vs.抽象工厂模式
-
构造器模式(应用场景:解决构造复杂对象的麻烦。复杂:需要输入的参数的组合较多)
-
代理模式(Spring AOP(动态代理模式:2种实现方式,即jdk & 字节码方式))
-
装饰器模式(应用场景:若想对一个类从不同角度进行功能扩展,例如http://java.io中,InputStream是一个抽象类,标准类库中提供了FileInputStream\ByteArrayInputStream等各种不同的子类,分别从不同角度对InputStream进行了功能扩展。这些不同的实现类其构造函数的输入均为InputStream(的实现类),然后对InputStream添加不同层次的逻辑,从而实现不同的功能,这就是装饰。)
-
观察者模式(各种事件监听器)
-
策略模式(比较器Comparator)
-
迭代器模式(ArrayList等集合框架中的迭代器)
-
生产者消费者模式(消息队列)要能手撕
-
学习时用的相关资料+面试题:
数据结构与算法
-
时间复杂度和空间复杂度分析
-
常用的数据结构及其特点
-
数组 vs 链表
-
队列 vs 栈
-
跳表(Redis利用跳表实现有序集合Sorted Set)
-
散列表
-
堆与优先级队列
-
二叉树:普通二叉树 vs 二叉查找树 vs 平衡二叉树(AVL)vs 红黑树 (vs 哈夫曼树)
-
多叉树:B-Tree vs B+Tree vs B*Tree / Trie Tree
-
B+Tree: MySQL索引数据结构
-
Trie Tree: 实现敏感词过滤算法; 实现搜索引擎的关键词提示功能
-
-
常用算法
-
各种排序算法:内部排序+外部排序
-
需要手撕:冒泡、插入、堆排、归并、快排(2路快排+3路快排+随机枢值)
-
大数据排序:外部排序
-
-
各种查找算法:
-
二分查找算法及其变种
-
二叉查找树的查找
-
利用快排查找
-
-
常用的遍历算法
-
BFS vs DFS
-
Morris遍历
-
-
常用的Hash算法
-
一致性哈希
-
布隆过滤器
-
-
贪心算法
-
分治算法
-
回溯算法
-
动态规划
-
海量数据处理算法
-
bitmap算法
-
布隆过滤器
-
-
其他算法:
-
LRU算法
-
KMP算法
-
Manacher算法(面试问过1次)
-
BFPRT算法
-
-
常见的手撕代码问题
-
《剑指offer》的问题
-
学习时用的相关资料+面试题:
计算机网络
-
OSI七层模型 vs. TCP/IP 五层模型(有时候也说四层)及及各层协议
-
给定一个网址,访问这个网址经过了哪些过程?涉及哪些协议?
-
HTTP and HTTPS
-
HTTP报文格式
-
HTTP方法及相互区别
-
HTTP的无状态
-
HTTP状态码
-
HTTP 1.0 vs 1.1 vs 2.0
-
HTTP vs HTTPS
-
HTTP安全性
-
HTTP底层协作协议(如传输层为TCP协议)
-
-
TCP and UDP
-
TCP vs UDP
-
TCP如何保证可靠传输?
-
TCP的三次握手和四次挥手及其原因
-
TCP的流量控制与滑动窗口
-
TCP的拥塞控制与拥塞窗口
-
TCP的拆包粘包
-
-
-
RPC协议(经常和Dubbo一起问)
-
Socket编程
-
异步IO多路复用:select poll epoll
-
由于平台文章篇幅限制,细节内容过多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!需要的朋友可在文章末尾获取资料
数据库MySQL
-
数据库范式
-
数据库事务
-
什么是事务?
-
事务特性:ACID
-
事务隔离级别以及脏读、不可重复读、幻读
-
分布式事务
-
-
数据库索引
-
索引的应用场景
-
索引特点
-
索引的优点和缺点
-
索引的分类
-
索引选择原则
-
索引的优化
-
索引失效
-
索引的底层实现(B-Tree vs B+Tree)
-
对于建立索引的列,数据均匀分布好还是不均匀好?
-
-
数据库的锁
-
行锁 vs 表锁
-
读锁 vs 写锁
-
乐观锁 vs 悲观锁以及如何实现?(MVCC)
-
加锁的方式
-
分布式锁
-
-
数据库存储引擎比较
-
InnoDB
-
MyISAM
-
Memory
-
-
MySQL连接池对比
-
MySQL命令
-
JOIN的执行计划?
-
数据库分库分表
-
主从复制
学习时用的相关资料+面试题:
数据库Redis
-
-
为什么使用Redis?
-
Redis的优点与缺点
-
Redis的数据类型、底层实现以及各种数据类型的使用场景
-
Redis是单线程吗?单线程的Redis为啥这么快?
-
Redis持久化的方式
-
谈谈Redis的过期策略以及内存淘汰机制
-
如何解决Redis和和数据库双写一致性的问题?
-
如何应对缓存穿透与缓存雪崩的问题?
-
如何解决Redis的并发竞争Key问题
-
学习时用的相关资料+面试题:
Web与常见框架
-
Servlet的生命周期(问的很少)
-
Cookie vs Session
-
分布式Session
-
Spring相关(应用与源码分析)
-
看过Spring的源码吗?
-
IOC应用及原理
-
AOP应用及原理
-
事务
-
Spring涉及的设计模式
-
谈谈Spring Bean的生命周期和作用域
-
Spring MVC的工作原理
-
Spring vs Spring MVC
-
Spring vs Spring Boot
-
了解微服务,Spring Cloud
-
-
-
Netty (网络框架)
-
Dubbo
-
分布式架构
-
-
服务调度,涉及服务发现、配置管理、弹性伸缩、故障恢复等
-
资源调度,涉及对底层资源的调度使用,如计算资源、网络资源和存储资源等。
-
流量调度,涉及路由、负载均衡、流控、熔断等。
-
数据调度,涉及数据复本、数据一致性、分布式事务、分库、分表等
-
容错处理,涉及隔离、幂等、重试、业务补偿、异步、降级等。
-
自动化运维,涉及持续集成、持续部署、全栈监控、调用链跟踪等。
-
学习时用的相关资料:
需要以上【JAVA全栈知识笔记】的朋友
点击下方名片
文章评论