拜托,别再问我怎么自学 Java 了!和盘托出
假如有那么残酷的一天,我不小心喝错了一瓶药,一下子抹掉了我这十多年的编程经验,把我变成了一只小白。我想自学 Java,并且想要找到一份工作,我预计需要 6 个月的时间,前提条件是每天都处于高效率的学习状态当中,并且每天的学习时间至少在 12 个小时以上。
即便是这样,我敢肯定,找到的工作肯定不会太好,勉强能够维持生活吧,毕竟是零基础入门啊。
如果想更进一步,真正成为一名不可或缺的高级 Java 工程师,时间需要更久,两年、三年、五年,直到秃的那天。
想着想着,我就觉得有必要为那一天做点准备,以备不时之需。
01、第一个阶段,环境和工具准备
- 准备一台电脑,要能联网
- 下载、安装 JDK,配置 Java 开发环境
- 下载、配置 Maven
- 下载、安装 IntelliJ IDEA
- 准备一个 GitHub 仓库(或者码云),管理 Java 源代码
Java 是一门计算机编程语言,学它的话,连台电脑都没有,学个屁。我有个亲戚家的孩子想学编程,就只看书,家里连台电脑都不配,说什么“先打好理论基础,再实操”,我真的是有点醉。
有了电脑,还得联网,自学的过程中肯定会遇到很多问题,遇到问题的时候先问搜索引擎,推荐谷歌和必应;实在没有答案的话,也可以来找我,申请加入技术交流群,问问群里面的大佬们。
既然要学 Java,JDK 是必须要先安装的,否则 Java 程序就没法编译和执行。
Maven 也是需要提前安装和配置的,因为后面进阶的话,需要一些练手项目,它们通常都需要 Maven 来加载第三方类库。
使用集成开发环境 IntelliJ IDEA 来敲 Java 代码吧,比 Eclipse 更流行。千万不要使用记事本编写源代码了,对于小白来说,时间是宝贵的,记事本只适合大牛们用来装逼,不适合小白用来编程(入门),纯浪费时间。
有了 IDEA,后面学习源码的话,就会方便很多,包括反编译字节码。
如果英语功底不太好的话,建议安装这两款 IDEA 插件:chinese 和 translation。
如果注重编码规范的话,建议安装这两款 IDEA 插件:Alibaba 和 SonarLint。
为什么还需要 GitHub 仓库或者码云仓库呢?它们可以用来在线云同步源代码,防止版本丢失。学到最后,还可以形成一套自己的工具库,轮子就有了,上班的时候工作效率就会高很多,能直接用的代码再也不用重新写了。
02、第二个阶段,Java 基础入门
1)基本数据类型
- 8 种基本数据类型(boolean、char、byte、short、int、long、float、double)
- 整形中 byte、short、int、long 的取值范围
- 单精度和双精度
- 为什么不能使用“==”比较浮点数
- 基本类型和包装类型的区别
- 自动拆箱与装箱
- Integer 的缓存机制
2)操作符
- 算术运算符
- 逻辑运算符
- 比较运算符
3)流程控制语句
- 条件分支(if/else/else if、三元运算符、switch)
- 循环或者遍历(for、while、do-while)
- break 和 continue
4)包
- 创建包
- 导入包
- 包全名
5)main 方法详解
- public 关键字
- static 关键字
- void 关键字
- main 方法
- 字符串数组参数(
String[] args)
6)数组
7)注释
- 单行注释
- 多行注释
- 文档注释
- 注释真的不会被执行吗?
- 优秀的程序员真的不写注释吗
8)字符串
- 双引号字符串和 new 字符串对象
- 字符串为什么是不可变的?
- String、StringBuilder 和 StringBuffer 之间的区别
- 字符串拼接的几种方式
- 字符串常量池
- 关于 intern
- 字符串比较(== 和 equals)
- 字符串拆分
- 字符串操作小技巧
- 字符串转整形
- 生成 UUID
- 字符串可以引用传递吗?
- 字符串长度
- 关于 substring
03、第三个阶段,Java 核心技术
1)面向对象
- 面向对象和面向过程
- 封装
- 继承
- 多态
- 接口
- 抽象类
- 重写和重载
- 构造方法
- 局部变量、成员变量、静态变量、常量
- 值传递还是引用传递
- final 关键字
- this 关键字
- super 关键字
- 不可变对象
- equals() 和 hashCode()
- 打印 Java 对象
- NullPointerException
2)常用工具类
3)集合框架
- ArrayList
- LinkedList
- ArrayList 和 LinkedList 之间的区别
- 不可变 List
- CopyOnWriteArrayList
- HashMap
- LinkedHashMap
- TreeMap
- ConcurrentHashMap
- fail-fast
4)反射机制
- 什么是反射?
- 反射有什么用?
- Class 类
5)异常处理
- 为什么需要异常处理机制?
- Error 和 Exception
- try-catch-finally
- try-with-resource
- 自定义异常
- 尽量捕获原始异常
- 不要打印堆栈后再抛出异常
- 不要用异常处理机制代替判断
- 不要过早捕获异常
6)注解
- 注解是什么?
- 注解的生命周期
- 注解装饰的目标
- 自定义注解
- 使用注解
7)IO 流
- 字符流、字节流
- 输入流、输出流
- 同步、异步
- 阻塞、非阻塞
- BIO、NIO 和 AIO
- NIO 2.0
8)序列化
- 什么是序列化和反序列化
- Java 如何实现序列化和反序列化
- Serializbale 和 Externalizable
- serialVersionUID
9)泛型
- 什么是泛型?
- 类型擦除
- 泛型带来的问题
- 泛型中 K T V E 这些特殊字幕的含义
- 通配符
- 上下界限定符 extends 和 super
- 不要在集合中使用 Java 原始类型
10)单元测试
- Junit
- TestNG
11)编码方式
- ASCII
- Unicode
- UTF-8
- GBK、GB2312
- 如何解决乱码问题
12)并发编程
- 什么是并发
- 什么是并行
- 什么是线程
- 什么是进程
- 线程的状态
- 线程的优先级
- 创建线程
- 创建线程池
- 什么是线程安全
- 多级缓存和一致性问题
- CPU 时间片和原子性问题
- 指令重排和有序性问题
- 线程安全和内存模型
- happens-before
- 可重入锁
- 阻塞锁
- 乐观锁
- 悲观锁
- 分布式锁
- CAS
- ABA
- 偏向锁
- 轻量级锁
- 重量级锁
- 自旋锁
- 什么是死锁
- 如果避免死锁
- synchronized
- volatile
- ThreadLocal
- Executors
- CountDownLatch
- Thread
- Runnable
- Callable
- ReentrantLock
- ReentrantReadWriteLock
- Atomic 相关类
13)Java 8 新特性
14)源码阅读
- String
- Integer
- ArrayList
- LinkedList
- CopyOnWriteArrayList
- HashMap
- TreeMap
- LinkedHashMap
- ConcurrentHashMap
- CopyOnWriteArrayList
04、第四个阶段,Java 进阶升级
1)JVM
- Java 内存结构
- 堆
- 栈
- 垃圾回收
- JVM 参数调优
- Java 对象模型
- HotSpot
- 类加载机制
- 编译和反编译
- 反编译工具
- JIT
- 虚拟机性能监控和故障处理工具(jps、jstack、jmap、jstat、jconsole、javap)
2)性能优化
- 使用单例
- 使用线程池
- 减少上下文切换
- 减小锁粒度
- 数据压缩
- Stream 并行流
- GC 调优
- JVM 内存分配调优
- btrace
3)设计模式
- 设计模式的六大原则
- 创建型设计模式(单例、抽象工厂、建造者、工厂、原型)
- 结构型设计模式(适配器、桥接、装饰、组合、外观、享元、代理)
- 行为型设计模式(模板方法、命令、迭代器、观察者、中介者、备忘录、解释器、状态、策略、责任链、访问者)
- 单例的七种写法
4)数据结构和算法
- 简单的数据结构(栈、队列、链表、数组、哈希表)
- 树(二叉树、字典树、平衡树、排序树、B 树、B+ 树、R 树、红黑树、多路树)
- 堆
- 图(拓扑、有向图、无向图)
- 稳定的排序算法(冒泡排序、插入排序、鸡尾酒排序、桶排序、计数排序、归并排序、原地归并排序、二叉排序树排序、鸽巢排序、基数排序、侏儒排序、图书馆排序、块排序)
- 不稳定的排序算法(选择排序、希尔排序、梳排序、堆排序、平滑排序、快速排序、内省排序、耐心排序、Clover 排序)
- 时间复杂度
- 空间复杂度
- 贪心算法
- KMP 算法
5)操作系统
- Linux 常用命令(find、top、tar、move、grep、tail、netstat、curl、wget、ping、ssh)
- 服务器性能指标(qps、CPU 利用率)
- 进程同步
- 分段和分页
- 虚拟内存和主存
6)网络安全
- CSRF
- XSS
- SQL 注入
- 加密和解密(对称加密、非对称加密)
- MD5、SHA1、DES、RSA
- DDOS 攻击
- HTTP 和 HTTPS
- SSL
- TLS
- TCP 和 UDP
- Cookie、Session
- CDN
- DNS
7)数据库
8)大数据
- 搜索(Elasticsearch 、Solr)
- 流式计算(Storm、Spark、Flink)
- Hadoop
9)服务器
- Tomcat
- jetty
- Nginx
10)框架
- Spring
- MyBatis
- Spring MVC
- Spring Boot
- Spring Security
- Spring Cloud
- Netty
- Dubbo
11)消息队列
- RabbitMQ
- Kafka
12)容器
- Docker
- K8s
需要 Java 书单的话,我在 GitHub 上发现了一个宝藏项目,光看了一下目录,就有点吸引我。需要的小伙伴可以按需自取,地址如下所示:
05、第五个阶段,活着最重要
技术是没有终点的,也是学不完的,最重要的是活着、不秃。
零基础入门的时候看书还是看视频,我觉得成年人,何必做选择题呢,两个都要。喜欢看书就看书,喜欢看视频就看视频。
最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。
开源的项目我推荐 GitHub 上的 mall 和 vhr,前者是电商系统,后者是微人事,都用的最前言的技术,并且文档很全面,不怕晕头转向。
自学最怕的就是缺乏自驱力,一定要自律,杜绝“三天打鱼两天晒网”,到最后白忙活一场。
高度自律的同时,要保持耐心,不抛弃不放弃,切勿自怨自艾,每天给自己一点点鼓励,学习的劲头就会很足,不容易犯困。
技术学到手后,找工作的时候一定要好好准备一份简历,不要无头苍蝇一样去海投简历,容易“竹篮打水一场空”。可以参考下面的链接,好好的准备一下简历,毕竟是找工作的敲门砖。
拿到面试邀请后,在面试的过程中一定要大大方方,尽力把自己学到的知识舒适地表达出来,不要因为是自学就不够自信,给面试官一个好的印象,面试成功的几率就会大很多,加油吧,骚年!
拜托,别再问我怎么自学 Java 了!和盘托出的更多相关文章
- Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章
原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...
- 拜托!面试请不要再问我Spring Cloud底层原理[z]
[z]https://juejin.im/post/5be13b83f265da6116393fc7 拜托!面试请不要再问我Spring Cloud底层原理 欢迎关注微信公众号:石杉的架构笔记(id: ...
- 求你了,再问你Java内存模型的时候别再给我讲堆栈方法区了…
GitHub 4.1k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.1k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 4.1k Star 的 ...
- 面试官,不要再问我“Java GC垃圾回收机制”了
Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解> ...
- 面试官,不要再问我“Java 垃圾收集器”了
如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在面试过程中这个深度的问题涉及的比较 ...
- 面试官,不要再问我“Java虚拟机类加载机制”了
关于Java虚拟机类加载机制往往有两方面的面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断程 ...
- 面试官,不要再问我“Java虚拟机类加载机制”了(转载)
关于Java虚拟机类加载机制往往有两方面的 面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断 ...
- 面试官,不要再问我“Java 垃圾收集器”了(转载)
如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在 面试过程中这个深度的问题涉及的比 ...
- 别再问什么是Java内存模型了,看这里!
网上有很多关于Java内存模型的文章,在<深入理解Java虚拟机>和<Java并发编程的艺术>等书中也都有关于这个知识点的介绍.但是,很多人读完之后还是搞不清楚,甚至有的人说自 ...
随机推荐
- TonWeb6.1Linux安装文档
东方通部署文档 东方通安装部署文档 准备文件:开始安装:警告:在安装之前先安装JDK,JDK要求JDK5以上Linux安装:运行安装包sh Install_TW6.1.5.15_Standard_ ...
- MVC里面调用webservice
调用WebService报错404问题 (转载) 我想在MVC4的项目添加一个webservice文件,访问没问题,但是最后调用方法就报404错误.但是如果我全新ASP.NET 空Web应用程序 ...
- 文件操作和OS模块的简单操作
文件的作用 大家应该听说过一句话:“好记性不如烂笔头”. 不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电 ...
- TS数据类型:类型别名/联合类型/字面量类型/类型推论等纲要
在学C/C++ Java等强类型语言时,变量类型是唯一的,需要先指定.PHP JavaScript等弱类型语言时,无需指定变量类型 但是,TypeScript里面的联合类型 (Union Type) ...
- Anaconda简介及特点
摘要 Python是一种面向对象的解释型计算机程序设计语言,其使用,具有跨平台的特点,可以在Linux.macOS以及Windows系统中搭建环境并使用,其编写的代码在不同平台上运行时,几乎不需要做较 ...
- defer 延迟调用
1. 延迟调用 defer 的用法很简单,只要在后面跟一个函数的调用,就能实现将这个 xxx 函数的调用延迟到当前函数执行完后再执行. defer xxx() 这是一个很简单的例子,可以很快帮助 ...
- Java锁?分布式锁?乐观锁?行锁?
转载自:公众号来源:码农翻身 作者:刘欣 Tomcat的锁 Tomcat是这个系统的核心组成部分, 每当有用户请求过来,Tomcat就会从线程池里找个线程来处理,有的执行登录,有的查看购物车,有的下订 ...
- jsp(java server pages):java服务器端的页面
jsp(java server pages):java服务器端的页面 JSP的执行过程1.浏览器输入一个jsp页面2.tomcat会接受*.jsp请求,将该请求发送到org.apache.jasper ...
- C语言入门经典书目推荐--转
国内良莠不齐的C语言教程数不胜数,同名如"C程序设计""C语言程序设计""C语言程序设计教程"的都多如牛毛,这些不知名的就不予考虑了,要看就 ...
- brew清华镜像
https://mirror.tuna.tsinghua.edu.cn/help/homebrew/