首先三万的月薪在BAT实在太普遍了,一般是高级工程师和资深工程师的职位。在阿里是p6左右,在百度是t5左右,腾讯是t2-3左右,京东是t3-1,美团是p6左右,其他的我不了解。这种级别是他们主要码农层级,加班多,能解决大部分问题,但对系统的整体架构能力和深入分析瓶颈的能力还需要培养。
其次掌握的技能树主要有三个方面:
第一个是基础。
比如对集合类,并发包,类加载,IO/NIO,JVM,内存模型,泛型,异常,反射,等有深入了解,最好是看过源码了解底层的设计。比如一般面试都会问ConcurrentHashMap,CopyOnWrite,线程池,CAS,AQS,虚拟机优化等知识点,因为这些对互联网的企业是绝对重要的。而且一般人这关都过不了,还发牢骚说这些没什么用,为什么要面试。举一例子,在使用线程池时,因为使用了无界队列,在远程服务异常情况下导致内层飙升,怎么去解决?你要是连线程池都不清楚,你怎么去玩?再举一例,由于对ThreadLocal理解出错,使用它做线程安全的控制,导致没能实现真的线程安全。还有遇到内存泄露怎么排查问题,怎么优化系统性能。所以作为一个拿三万的JAVA程序员这点基础是要有的。
第二你需要有全面的互联网技术相关知识。
从底层说起,你起码得深入了解mysql,redis,nginx,tomcat,rpc,jms等方面的知识。你要问需要了解到什么程度,我可以给你说个大慨。首先对于MySQL,你要知道常见的参数设置,存储引擎怎么去选择,还需要了解常见的索引引擎,知道怎么去选择。知道怎么去设计表,怎么优化sql,怎么根据执行计划去调优。高级的你需要去做分库分表的设计和优化,一般互联网企业的数据库都是读写分离,还会垂直与水平拆分,所以这个也有经验的成分在里面。然后redis几乎是必须的技能,而nginx和tomcat几乎都是JAVA互联网方面必配。至于rpc相关的就多的去,必须各种网络协议,序列化技术,SOA等等,你要有一个深入的理解。现在应用比较广的rpc框架,在国内就是dubbo了,开源的还有spring cloud相关技术栈,可以自行搜索。至于jms相关的起码得了解原理吧,一般情况下不是专门开发中间件系统和支撑系统的不需要了解太多细节,国内企业常用的主要是activeMQ和kafka。你能对我说的都有研究,阿里p7都不是太大问题的。
第三就是编程能力,编程思想,算法能力,架构能力。
首先2W程序员对算法的要求我觉得还是比较低,再高级也最多红黑树吧,但是排序和查询的基本算法得会。编程思想是必须的,问你个AOP和IOC你起码的清清楚楚,设计模式不说每种都用过,但也能了解个几种。编程能力这个我觉得不好去评价,但是拿一个2000W用户根据姓名年龄排序这种题目也能信手拈来。最后就是架构能力,这种不是说要你设计个多牛逼多高并发的系统,起码让你做一个秒杀系统,得有一个明确的思路和方向。
针对以上三点,小编整理了一整套的Java学习笔记,足够你的月薪达到3W左右!
JVM篇
线程
JVM内存区域(程序计数器(线程私有)、虚拟机栈(线程私有)、本地方法区(线程私有)、堆(Heap-线程共享) -运行时数据区、方法区/永久代(线程共享))
JVM运行时内存(新生代、老年代、永久代)
垃圾回收与算法(如何确定垃圾、标记清除算法(Mark-Sweep)、复制算法(copying)、标记整理算法(Mark-Compact)、分代收集算法)
JAVA四种引用类型(强引用、软引用、弱引用、虚引用)
GC分代收集算法VS分区收集算法(分代收集算法、分区收集算法)
GC垃圾收集器(Serial垃圾收集器(单线程、复制算法)、ParNew垃圾收集器(Serial+多线程)、Parallel Scavenge收集器(多线程复制算法、高效)、Serial Old收集器(单线程标记整理算法)、Parallel Old收集器(多线程标记整理算法)、CMS收集器(多线程标记清除算法))
JAVA IO/NIO(阻塞IO模型、非阻塞IO模型、多路复用IO模型、信号驱动IO模型、异步IO模型、JAVA IO包、JAVA NIO、Channel 、Buffer、Selector)
JVM类加载机制(加载、验证、准备、解析、符号引用、直接引用、初始化、类构造器< client>、类加裁器、双亲委派、OSGI (动态模型系统))
JAVA集合篇
接口继承关系和实现
List(ArrayList (数组)、Vector (数组实现、线程同步)、LinkList (链表))
Set(HashSet (Hash表)、TreeSet (二叉树)、LinkHashSet (HashSet+ LinkedHashMap))
Map(HashMap (数组+链表+红黑树)、ConcurrentHashMap、HashTable (线程安全)、TreeMap (可排序)、LinkHashMap (记录插入顺序))
多线程与高并发篇
JAVA并发知识库
JAVA线程实现/创建方式(继承Thread类、实现Runnable接口、ExecutorService、Callable <Class>、Future有返回值线程、基于线程池的方式)
4种线程池(newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor)
线程生命周期(新建状态(NEW)、就绪状态(RUNNABLE)、运行状态(RUNNING)、阻塞状态(BLOCKED) 、线程死亡(DEAD))
终止线程4种方式(正常运行结束、使用退出标志退出线程、Interrupt方法结束线程、stop方法终止线程(线程不安全))
sleep与wait区别
start与run区别
JAVA后台线程
JAVA锁(乐观锁、悲观锁、自旋锁、Synchronized同步锁、ReentrantLock、Semaphore信号量、AtomicInteger、可重入锁(递归锁)、公平锁与非公平锁、ReadWriteLock读写锁、共享锁和独占锁、重量级锁(Mutex Lock)、轻量级锁、偏向锁、分段锁、锁优化)
线程基本方法(线程等待(wait)、线程睡眠(sleep)、线程让步(yield)、线程中断(nterrupt)、Join等待其他线程终止、为什么要用join0方法?、线程唤醒(notiy)、其他方法)
线程上下文切换(进程、上下文、寄存器、程序计数器、PCB-“切换桢”、上下文切换的活动、引起线程上下文切换的原因)
同步锁与死锁
线程池原理(线程复用、线程池的组成、拒绝策略、Java线程池工作过程)
JAVA阻塞队列原理(阻塞队列的主要方法、Java中的阻塞队列、ArrayBlockingQueue (公平、非公平)、LinkedBlockingQueue (两个独立锁提高并发)、PriorityBlockingQueue (compareTo排序实现优先)、DelayQueue (缓存失效、定时任务)、SynchronousQueue (不存储数据、可用于传递数据)、LinkedTransferQueue、LinkedBlockingDeque)
CyclicBarrier. CountDownLatch. Semaphore的用法
volatile关键字的作用(变量可见性、禁止重排序)
如何在两个线程之间共享数据
ThreadLocal作用(线程本地存储)
synchronized和ReentrantLock的区别
ConcurrentHashMap并发(减小锁粒度、ConcurrentHashMap分段锁)
Java中用到的线程调度(抢占式调度、协同式调度、JVM的线程调度实现(抢占式调度)、线程让出cpu的情况)
进程调度算法(优先调度算法、高优先权优先调度算法、基于时间片的轮转调度算法)
什么是CAS (比较并交换-乐观锁机制-锁自旋)
什么是AQS (抽象的队列同步器)
Spring原理篇
Spring特点(轻量级、控制反转、面向切面、容器)
Spring核心组件
Spring常用模块
Spring主要包
Spring常用注解
Spring第三方结合
Spring IOC原理(概念、Spring容器高层视图、IOC容器实现、Spring Bean作用域、Spring Bean生命周期、Spring依赖注入四种方式、5种不同方式的自动装配)
Spring APO原理(概念、AOP核心概念、AOP两种代理方式、实现原理)
Spring MVC原理
Spring Boot原理(创建独立的Spring应用程序、嵌入的Tomcat,无需部署WAR文件、简化Maven配置、自动配置Spring、提供生产就绪型功能,如指标,健康检查和外部配置、绝对没有代码生成和对XML没有要求配置)
JPA原理(事务、本地事务、分布式事务、两阶段提交)
Mybatis缓存(一级、二级)
Tomcat架构
数据库篇
存储引擎(概念、InnoDB (B+树)、TokuDB (Fratal Tree节点带数据)、MyIASM、Memory)
索引
数据库三范式.第一范式(1st NF -列都是不可再分)、第二范式(2nd NF-每个表只描述件事情、第三范式(3rd NF-不存在对非主键列的传递依赖)
数据库是事务(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、永久性(Durability))
存储过程(特定功能的SQL语句集)
触发器(一段能自动执行的程序)
数据库并发策略(乐观锁、悲观锁、时间戳)
数据库锁(行级锁、表级锁、页级锁)
基于Redis分布式锁
分区分表(垂直切分(按照功能模块)、水平切分(按照规则划分存储))
两阶段提交协议(准备阶段、提交阶段、缺点)
三阶段提交协议(CanCommit阶段、PreCommit阶段、doCommit阶段)
柔性事务
CAP(一致性 、可用性、分区容忍性)
这份知识点内容真的太多了,一篇文章根本写不完,我让大家看看这份笔记的目录吧
这份笔记的每一个部分都涵盖了很多内容,从基础到进阶,同时这份笔记有近1000页,全部都是笔记作者自己最精华部分的总结