
课程总览、特色说明:虽然这是一款免费、初阶课程,但其内容相当扎实,胜过不少同类收费课程。
有人声称Java已死,事实果真如此吗?我们摆事实,但我们不讲道理。因为人生苦短,空谈无益。作为实战派,我们学Java,我们把Java学好。Java作为编程语言热度或有下降,但Java生态系统依然健壮。有Java作为基础和开始,了解其他JVM系列编程语言比如Kotlin,会是一件相当轻松的事情。
我们简要介绍Java的发展历史,并特别说明本课程所要使用的Java版本。
终于,我们开始安装JDK(12.0.1)、编写Hello World。在JDK12中,我们优先通过JShell运行Hello World,当然,我们也介绍古典Hello World的编写、编译、运行三部曲。
我们继续Hello World:我们介绍手工编译运行时需要注意的细节、自JDK 11之后引入的直接运行Single Source、在其他操作系统上运行Hello World、用JVM系编程语言之一的Kotlin来Hello World、用Eclipse编译器来Hello World。一沙一世界,我们后面还要三番四次Hello World,因为它绝不如大家看到、想象的那般简单。
“一次编写,到处运行”,还是“一次编写,到处调试”?我们通过一个具体案例,来演示说明如何可以真正“一次编写,到处运行”——并且,是正确、一致地运行。
为了方便您达到最好的学习效果,我们希望和您交流一下学习方法论。首先,我们不认为学习有捷径,7天学会Java通常只是营销噱头或有其特定的受众对象(有经验的程序员),您始终需要投入一定的时间才能保障基本的学习效果。其次,在不同的阶段,您也需要调整对应的学习方式。当然,买我的课肯定需要,这样您就会心疼,心疼就会珍惜,珍惜就会学完啦:)
基础中的基础,我们了解如何定义一个变量以及八种基本数据类型。
定义变量之后,我们可以对其进行各种运算。五花八门的运算符以及优先级高低,我们无需死记硬背,通过JShell进行快速测试得到反馈,进而自然而然了解和记忆。
分支跳转、循环控制,有了这两种流程控制,并加以自由组合,我们已经可以编写相当复杂、强大的代码。
最简单、也经常用到的Java数据结构:数组。我们介绍如何初始化数组、如何访问数组元素、如何遍历等等常规操作。与此同时,我们也介绍多维数组。特别地,我们再次回到Hello World,重温那被遗忘的String[] args——一个字符串数组。
重温Java关键词、三种注释。演示通过javadoc注释生成API文档,并说明编写简明扼要注释的必要性。
了解了Java基本语法之后,接下来我们要做的就是:编写程序,编写程序,编写更多的程序。大量练习的同时,浑然不觉之中,我们就会对这些基本语法使用耳熟能详。MOOC是一款在欧美非常流行的Java编程练习题库,累计有159个练习,从易到难,支持在线提交、打分。与之配套的Test My Code插件,支持Intellij IDEA和NetBeans两种IDE,从实际经验来看,Part I适合使用NetBeans,Part II适合使用Intellij IDEA。
TMC NetBeans下载地址:http://update.testmycode.net/installers/tmc-netbeans_org_mooc/tmc-netbeans_org_mooc_tmcbeans-windows.exe
演示如何通过IDEA提交MOOC练习,并说明为何Part I使用NetBeans更佳,Part II使用IDEA更好。需要注意的是,TMC Plugin在IDEA 2019.1.3上面可能无法正常运行,建议使用2018.3.5或2018.1.8这个经测试可以比较稳定运行TMC插件的版本:https://download.jetbrains.com/idea/ideaIU-2018.3.5.exe、https://download.jetbrains.com/idea/ideaIU-2018.1.8.exe
USACO是一个面向编程竞赛的训练网站,但其中部分练习也非常适合Java初学者,比如“Friday the Thirteenth”。如果您希望尝试在线提交评测,那么请您通过https://train.usaco.org/usacogate注册一个账号先。
文件读写您可以暂时直接复制如下代码:
Scanner scanner = new Scanner(new File("friday.in"));
int n = scanner.nextInt();
PrintWriter writer = new PrintWriter(new File("friday.out"));
writer.print(counts[6]);
在介绍面向对象编程思想之前,为了避免您一下子被诸多名词概念弄得云里雾里,我们首先要演示、观察一个小游戏:坦克大战,进而引入面向对象的基本概念。
您可以免费下载此项目源代码:https://github.com/ny83427/tankwar/tree/cowlist。如果您没有使用过git,那么建议您直接下载打包文件,然后解压使用。
以坦克大战中的坦克为例,我们介绍面向对象编程中的四个基本概念:对象、类、状态与行为。
我们通过代码编写来了解在Java中,对象、类、状态与行为上述概念的实现。
打印、比较基本数据类型变量非常简单,但是如果是一个对象,该如何处理呢?我们介绍toString方法,可用于打印、显示一个对象,我们介绍equals/hashCode两个方法,用于比较两个对象是否等同。
为何equals与hashCode需要成双成对出现?调用equals方法有需要特别注意的地方吗?IDEA生成的代码里面又凝聚了哪些最佳实践经验总结?我们再谈equals与hashCode这两个方法。
我们介绍基本数据类型的对应包装类型,并通过Byte、Short、Integer、Long、Float以及Double这六个类的继承关系,来初步了解继承父类和实现接口的概念。
我们结合坦克大战游戏中出现的各类物体,深入说明继承相关细节。
“少用继承,多用组合”是一个经验总结,通过接口,我们可以规避单向继承的问题,同时也通过组合方式,让代码可维护性更好。
访问控制的引入,让代码可以更好地内部封装。我们也一并介绍static、final两个关键词,并对构造方法进行再次跟进。
现在,是时候把这些概念通过代码整合在一起了。我们要编写一个简单的文字版本足球游戏,这个游戏可以与用户进行交互,对用户的输入进行不同阶段处理。
我们来思考这么一个问题:狄更斯的双城记中累计有多少个单词?不重复的单词有多少个?每个单词出现多少次?出现次数最多的12个单词又是哪一些?如果这些单词是意义不大的介词、代词、冠词等,我们如何快速过滤掉?
我们先通过最简单的数据结构——数组——来解决单词数量统计及排序问题。由于数组长度固定,我们需要自行处理扩容或是压缩的问题。
我们引入ArrayList,并介绍其内部实现机制。我们也同时了解List接口的另外一种实现:LinkedList。我们能够用更少的代码,做到同样的事情。
不重复的单词统计,我们通过HashSet来搞定。当我们对排序有要求时,我们不妨使用TreeSet。
单词与出现次数,Key与Value,我们介绍键值对数据结构中最常用的HashMap,以及可以保持键排序的TreeMap。
仅仅为了取出出现频率最高的12个单词,我们就一定要对一万多个词频信息进行全盘排序吗?最小堆的出现,让我们可以有更好的解决方案。
如法炮制,我们通过最大堆来定位出现频率最低的12个单词。
我们通过最大堆来解决一道较为简单的LeetCode算法练习题:https://leetcode.com/problems/last-stone-weight。LeetCode是目前最流行的数据结构与算法训练在线题库之一,也是您搞定面试的必备工具之一。
我们讨论一种“后进先出”的数据结构:Stack。并应用于表达式的校验、括号开始下标的定位。我们也挑战大家去解决一个中等难度的LeetCode练习题:https://leetcode.com/problems/decode-string/
我们要挑战一个LeetCode中等难度的编程练习,我们也会介绍在面试中遇到此类练习的处理思路。放码过来的时候,我们采用递归与迭代两种思路搞定。在这一讲中,我们优先介绍思考难度更简单、实现更容易的递归处理。
我们使用迭代的处理方式,通过两个栈维护重复次数和要重复的字符串内容来解决这一问题。
我们通过JDK 12的部分集合包代码生成类图,一览几个重要接口的主要方法,也对集合的读写操作注意事项作出说明,比如ArrayList和LinkedList,同样调用get(int index)方法,耗时可能会有相当差异。
我们从USACO上面“礼尚往来”的问题开始,切入要讲解的输入输出内容。您不妨先自行思考如何处理这个问题:https://train.usaco.org/usacoprob2?a=l9EEmuGaQT8&S=gift1
我们介绍三种初阶、简单的文件读取方法:将整个文件读取为字符串、字符串集合以及通过Scanner API去逐行读取。我们也介绍一个巨大文件的读取处理场景,来引入后面要讲解的流化处理机制。
通过”礼尚往来“问题的处理,我们介绍三种初阶、简单的文件写入方法。除了Files,我们也介绍PrintWriter这个常用类。
不及时、正确关闭资源的后果在特定场合下会特别严重,不过JDK7开始引入的try-with-resources让我们的生活变得相对容易。同时,我们也思考一个新的问题:一个巨大的文本文件,其中存在一些不符合预期格式的行内容,我们需要剔除他们,将符合格式的所有行,写入一个新的文本文件。又或者我们尝试从中定位一些特征行,再写入新的文件。如何处理会比较合适呢?
基于流的处理方式,代码编写虽然相对繁琐,却提供了更加灵活、高效的处理方法。现在,我们有一个54.3GB的JSON文件,我们尝试从中提取符合要求的行记录,并写入另外一个文件。
有了面向对象的概念之后,我们再一次——第三次来审视一下Hello World,看看其中还有哪些有待发现的秘密。
将一个字符串重复若干次,看似非常简单,然而当我们阅读JDK的实现时,却不能不感叹:标准的编程范式,理应如此!JDK的源码是一块极为丰富的宝藏,劝君多采撷,此物高价值!
当我们了解了JAVA面向对象中注入toString、equals、hashCode等等方法之后,却发现编写这些代码费时费力。Lombok的出现,让手工编写这些代码成为往事。
介绍Lombok的使用方法之后,我们要对其实现机制一探究竟,我们发现,有时Bug也挺好,JSR269的规范中存在的少许漏洞,反而成了Lombok的机会。我们演示定义注解、编写Processor 、编写语法树Visitor以及注册Processor四个步骤,并对Lombok项目源码做一个简单的概述。
JSR269与JSR199一并在JDK6(代号Mustang,野马)中野马奔驰,我们介绍一下Java Compiler API及其应用场景。
深度、广度胜过N多付费课程的免费Java初阶课程!
基于最新版本Java 12系统讲解,涵盖Java发展历史、基本语法、面向对象、数据结构和输入输出等初阶内容
强调实战的务实风格。拒绝空谈,放码过来!对USACO、LeetCode经典习题进行详尽讲解分析
以问题解决为导向的讲解方式,将分散的知识点有机连接整合,方便您知其然并知其所以然
高强度的编程练习,帮助您最有效地密集训练,尽可能以最快速度提高您的编码水平