• 写过一个Java工程师学习指南,我把它分为了四个部分,第一步是打好Java基础,掌握Java核心技术,第二步是掌握Java Web技术栈,能够做一些项目,第三步是掌握Java方面的进阶技术,包括网络编程、并发编程、JVM等,第...

     

    写过一个Java工程师学习指南,我把它分为了四个部分,第一步是打好Java基础,掌握Java核心技术,第二步是掌握Java Web技术栈,能够做一些项目,第三步是掌握Java方面的进阶技术,包括网络编程、并发编程、JVM等,第四步是掌握后端进阶技术,比如分布式、缓存、消息队列等技术。

    按照这样的一个脉络,我觉得能够掌握这里面的绝大部分内容,并且有过相应的一些实践,那么可以算是学好了Java。当然,学好Java只是一个开始,要真的干好活,做好项目,以及其他各方面的技术工作,则是在学好Java的基础去延伸和展开的。

     

    接下来就是具体的四篇文章,建议大家按顺序阅读,有点长,收藏的时候记得点赞或者评论哈。笔芯!另外建议大家关注公众号【Java技术江湖】阅读更多的Java技术文章吧。

    Java工程师学习指南

    入门篇

     

    最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好。原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都是站在Java后端的全局上进行思考和总结的,忽略了很多小白们的感受,而很多朋友都需要更加基础,更加详细的学习路线。

    所以,今天我们重新开一个新的专题,分别按照四篇文章讲述Java的学习路线(分别是入门篇,初级篇,中级篇,高级篇),笔者也打算趁此机会,回忆一下自己的Java学习历程。今天我们要讲的是,小白同学如何入门Java。

    先声明一点,文章内容不会详细到每一步怎么操作,只会提供大致的思路和方向,给大家以启发,如果真的要一步一步指导操作的话,那至少需要一本书的厚度啦。

    本文所述的方法不一定适合所有人,如有错误敬请谅解。

     

     

    01 前期准备工作

     

     

     

    开发环境搭建

    这一步我们往往会直接跳过,但既然是面向小白的教程,这里就提一下吧。首先你需要一台电脑,然后安装好JDK和JRE,JDK提供的是Java开发工具,也就是一些必备的jar包,JRE则是Java的运行环境组件,我们熟悉的JVM就在这里面。

    安装好这两个东东之后,一般还要配置一下环境变量,否则有一些目录可能无法被正确找到。

    IDE选择和安装

    IDE指的就是本地开发编辑器,没有了它,你就只能直接在记事本这类工具里敲代码了。IDE最大的好处就是整合了大量的工具和功能模块,让你非常轻松地完成开发。

    以前大家都用eclipse,不过eclipse已经不流行了,现在我推荐你直接用intellij idea作为你的第一个代码编辑器。如果是用过eclipse的同学,基本上也可以无痛切换。

    intellij idea可以直接在官网上下载,试用版30天,如果想要永久使用,网上也有一些办法滴。

    关于jar包

    jar包是什么,其实就是将一堆class格式文件打包,Java中把它称为jar包,这些jar包在编译器中能被直接识别,让开发者使用。

    对于新手来说,可能只需要用到JDK自带的一些API,但是如果你要引用外部jar包,可能就会遇到一些困难了。对于idea来说,导入外部jar包有两种办法,一种是手动导入jar包,一种是使用maven。后者会在Java Web相关的文章中讲起。

    手动导入jar包其实也不难,你需要先下载好jar包,然后在对应的项目下选择导入jar包即可,具体的方法这里就不展开说了,因为在网上都找得到。

     

     

     

    02

     

     

     

     

     

     

     

    学习Java基础的几种方法

     

     

     

    了解基础语法

    学习一门语言,最开始要做的事情就是学习它的语法。我最早学习Java语法是在Runoob,这个网站可以让你对任意一门语言完成最快速的语法入门,当然,这只是相当于你浏览了一遍基础语法。

    想要真正掌握Java语言基础,光看基础语法还远远不够,我在大三第一次接触Java课程,听老师讲面向对象三大特征听得一头雾水,连数组的初始化方式都理不清楚,但这些内容都是我们需要掌握的。所以,为了学好Java基础,我们还需要看视频或者看书进行学习。

    看视频

    视频的话,可以到极客学院或者慕课网听Java基础课程,当然也可以看我分享的Java视频课程。大家也都知道,现在Java的培训班非常多,基本上学的东西也都大同小异,不过它们的有些课程还不错,大家有渠道的话也可以去看一看。

    看视频的好处是你可以更好地接收知识,同时也会耗费你更多实践,所以,有时候你也可以选择看书。

    看书

    看书的话,对于小白来说不推荐太复杂的书,比如《Java编程思想》这种书,新手千万不要看。我个人建议,你只需要先看看《Java入门到精通》这种类型的书就足够了,因为这个部分的学习只是为你后面的学习开个头,你以后可能还要回过头来重新研究这些内容。

    现在市面上介绍Java基础的书籍实在太多了,质量参差不齐,内容同质化严重,笔者看过的其实也不多。给大家一个建议,你只需要挑一两本书来看即可,这里推荐两本最简单的吧,《head first java》和《Java从入门到精通》。

    看博客

    这里再推荐另一种学习方式,就是看博客,博客比起书籍来说,更适合对于某个技术点的学习,你可以很容易地在网上找到这个知识点相关的原理,实现方法,以及代码范例。

    我的博客里没有讲解特别基础的东西,如果你看一些比较基础的文章,可以到Runoob等网站上查看。如果你有一个很明确的知识点想要学习,相信搜搜引擎会给你更好的答案。

    代码实践

    除此之外,一般的Java书籍或者视频课程都会要求你相应完成一些练习题,这部分内容你需要自己在电脑里使用IDE完成。

    在IDE里,你可以很好地熟悉Java语言的使用,基本代码的实现,同时可以尝试各种各样的API,并且测试一些语言特性,比如继承,封装,多态等等。

    另外,这也是你熟悉IDE的一个好机会,因为在公司里做开发可能要用到IDE各种各样的功能,提前熟悉好IDE绝对是有益无害的。

     

     

     

    03 Java入门必备知识点梳理

     

     

     

     

    在Java入门阶段,你可能需要接触到以下这部分知识,不管你是从通过哪种方式学习,这些内容都是你学习Java基础时绕不过的重点。

    Java基础知识

    这部分内容是你必须要掌握的内容,在入门阶段你需要把这些基础打扎实,以便于在学习后面的内容时可以更上一层楼。

    如何把基础打扎实呢,最好的办法就是在IDE上把书上或者视频上的每个例子都实现一遍,当然有的时候你也可以自己写一些有意思的例子。

    1 基本数据类型

    比如int,double,char,以及其包装类。

    熟悉基本数据类型的使用,了解每种类型所占的字节数,以及它们和包装类之间的相互转换。

    2 流程控制

    比如for循环,if else,while循环等等

    如果是学过c语言的同学,这部分可以跳过了。

    3 字符串类型String的使用

    字符串类型是Java中很重要的类型,它不是基本数据类型,但却很常用,熟悉和实践String相关的api,开始你对字符串的学习吧。

    4 数组

    数组的初始化方式有哪些,二维数组应该怎么写,把数组当成方法参数又该怎么处理?

    5 类和对象

    Java中最重要的两个概念:类和对象,它们有什么用呢,有什么区别和联系呢,请在代码中实践它们吧。

    Java核心技术

    对于这部分内容,我相信很多小白只能了解它们的基本使用方法,但是并不明白其背后的一些原理:比如为什么接口和抽象类有这些区别,多态的意义是什么,为什么要有反射。

    新手在学习这部分内容时,只需要知道怎么用就可以了。当然,你最好把这些特性都实现一遍,以加深印象。

    至于为什么有这些特性,这些特性背后的原理是什么,不是我们现在讨论的内容,这些内容我们将在初级和中级篇中讲述。因为,要了解这些原理,你得了解JVM,了解并发技术的基础,了解网络基础,甚至更多。显然,这不是你现在能做到的。

    1 接口和抽象类

    写一些接口,同时写一些实现类去实现这些接口,并且了解一下为什么我们需要接口,为什么子类需要实现接口里的方法。

    同理,去实现一些抽象类吧。然后,看看它和接口有什么不同。

    2 继承,封装和多态

    如何理解继承,子类和父类之间有什么联系呢。

    封装是一种保护代码的方式,有哪些方式可以实现封装呢。

    多态一般分为重载和重写,它们分别怎么使用?

    3 异常处理

    Java中的异常处理主要用于捕获和处理错误,请你写一些try catch代码块去捕获错误吧。

    4 集合类

    集合类是我们经常需要打交道的东西,List,Map,Set等等,赶快去熟悉API,然后写一些测试例子吧。

    5 IO输入流和输出流

    IO输入流和输出流可以操作文件,网络数据等内容,如何在Java代码中完成这么复杂的操作呢,其实只需要简单的几个api就可以了。

    6 多线程

    为了让系统资源最合理地分配和调度,我们需要多线程,多线程会让程序变得有趣,也会带来很多问题,使用Thread和相关API,去尝试这些有趣的事情吧。

    可选内容:

    1 反射(了解即可,不是入门必须)

    2 枚举类型和泛型(了解即可,不是入门必须)

    3 网络通信(了解基本的socket使用即可,需要网络基础)

    4 数据库操作(了解基本的JDBC即可,需要数据库基础)

     

     

    04 总结

     

     

     

    总而言之,对于一个Java小白来说,入门Java可以分为这几步:

    1 首先搭建好Java开发环境

    2 通过Runoob等一些网站熟悉Java的基本语法

    3 通过看书看视频等方式熟悉Java基础知识,通过代码实践加深理解

    4 通过看书看视频等方式初步了解Java核心技术,通过代码实践加深理解。

    本文主要是为大家提供一个学习的思路,以及推荐一些学习方法,如果你能够按照这样的步骤去学习,并且配合上一些适合你自己的学习方法来完成学习计划,相信你可以很好地完成对Java的入门。

     

     

     

     

     

     

     

    Java工程师学习指南

     

     

    初级篇

     

     

     

     

    最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好。原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都是站在Java后端的全局上进行思考和总结的,忽略了很多小白们的感受,而很多朋友都需要更加基础,更加详细的学习路线。

    所以,今天我们重新开一个新的专题,分别按照四篇文章讲述Java的学习路线(分别是入门篇,初级篇,中级篇,高级篇),笔者也打算趁此机会,回忆一下自己的Java学习历程。今天我们要讲的是,小白同学如何入门Java。

    先声明一点,文章内容不会详细到每一步怎么操作,只会提供大致的思路和方向,给大家以启发,如果真的要一步一步指导操作的话,那至少需要一本书的厚度啦。

    本文所述的方法不一定适合所有人,如有错误敬请谅解。

     

     

    01

     

     

     

     

     

     

     

    Java Web项目指南

     

     

     

    jav在上一篇文章中,我们讲到了入门Java的几个步骤,先搭建好环境,然后熟悉基本语法,接着熟悉Java的一些核心技术,并且在代码中进行实现。

    如果你已经完成了这部分内容的学习,应该会感觉自己对Java已经有一定了解了,可以轻松地写出一些Java代码,比如实现多线程输出数字,再如操作IO流等等。

    当然,这些代码通常只是一些demo,我们在实际的项目中可能并不会这么简单地使用这些技术,我们可能会同时使用集合类,多线程,以及操作数据库的API。

    所以,在今天的初级篇中,我们就来谈谈怎么做项目吧。

    Java Web项目

    对于大部分Java新手来说,最适合他们入门的项目就是Java Web了。因为Java天然适合做Web应用,并且生态完善,更有很多开源的工具和框架去支撑这些应用,比如Spring,Hibernate,SpringMVC等等。

    那么,如何开始着手做一个Java Web项目呢。个人认为最好的方式就是看视频了。因为,看书的话,很多内容比较过时,并且一般不会提供源代码。也有一些大佬喜欢推荐开源的项目(在GitHub上面的项目),但是对于小白来说,如果没有很完整的文档去指导他们,那也是毫无意义的。

    曾几何时,Java Web的项目还在使用JSP + Servlet进行开发,后来出现了Struts2,再后来,出现了我们现在也一直在用的SpringMVC,说实话,不论使用哪种开发框架,你都需要先花一些时间去学习相关的技术,否则你会发现,即使是看视频,你也不知道里面在讲什么。

    要想做好一个JavaWeb项目,你不仅需要一个好的项目课程,还需要足够的知识储备,下面就让我们来理一理这些内容把。

    知识储备

    Java基础部分的内容咱们上次说过了,这里就不再重复啦~下面我们分别来说说其他几方面的知识储备把

     

     

     

    02

     

     

     

     

     

     

     

    前端知识

     

     

     

    推荐资源:在w3cschool学习html,css和js,支持在线测试代码。

    既然是做Web,就难免要涉及到前端技术,不过,现在前后端分离已经是一种趋势,所以,如果你对前端不感兴趣,也没必要花太多时间去学习。

    对于大部分同学来说,你最好要了解html的基本标签和格式,自己能够写一些简单页面,CSS的话,也可以稍微接触一些。相对于前面两个服务于样式的技术,我们倒是更应该去学习一下JavaScript,了解它的一些基本语法,以及ajax的使用,因为在前后端交互时,ajax是非常重要的。

    所以,做一个Java Web项目,你不需要花太多时间在写前端页面上,如果有源代码可以直接使用,当然,对于一些需要修改的前端页面,你得怎么去做修改它,因为有时候你需要使用JSP,JSP既包括前端代码也包括Java代码,如果你完全看不懂前端代码的话,那就很尴尬了。

     

     

    03

     

     

     

     

     

     

     

    Java Web常用技术

     

     

     

     

    JavaWeb的技术栈其实比较庞大,所以我们不要求面面俱到,只是希望你能够熟悉一下项目中可能用到的技术。下面列举一些常见的技术,大家最好要了解一下。

    1 JSP和Servlet

    推荐资源:《JavaWeb入门到精通》,慕课网、极客学院等网站上的JavaWeb基础课程

    这是Java Web开发最原始的形态,现在很少直接使用了,但是后来的各种框架其实也是建立在servlet之上来做的。你们需要了解这两个技术分别是用来干什么的,最好能写一些demo来实践。

    对于JSP,有时候你可能还要学习jstl等标签语言,因为这些标签可以让你更方便地往JSP中插入Java代码。

    2 Spring和SpringMVC

    推荐资源:《Spring实战》,慕课网、极客学院等网站上的SpringMVC基础课程。

    事实上,除了上述资源之外,你也可以直接到官网上查看快速开始文档。

    Struts2早已被时代抛弃,Spring则是当今的霸主,你需要了解Spring如何使用,以及SpringMVC如何使用,并且学会在项目中使用它。

    由于SpringBoot最近很火,并且搭建方式比SpringMVC更简单,你也可以先学习SpringBoot,以便更快速地搭建起你的第一个Java Web项目。

    3 MySQL

    推荐资源:《Sql必知必会》,Runoob上的MySQL基础教程,慕课网、极客学院等网站上的视频课程

    一个JavaWeb应用一定要有数据啊,所以我们需要用到数据库,其实搭一个mysql数据库是非常简单的,但是对于初学者来说最麻烦的就是写sql了,所以,先学会建表,熟悉sql,对你以后做项目也是大有裨益的。

    4 Hibernate和Mybatis

    推荐资源:Runoob上的Hibernate和Mybatis基础教程,慕课网、极客学院等网站上的视频课程

    当你学会了使用sql去查询数据,可能还不足以让你在项目中很方便地处理数据,因为我们还需要一个步骤,就是把数据库的数据转化成Java里的对象。orm框架就是为了解决这一问题而出现的,它可以让一张表和Java类一一对应,让数据查询变得非常方便。Hibernate和Mybatis都是orm框架,只不过现在mybatis越来越火了。

    所以,你需要了解这一技术,因为它会广泛地运用到大部分Java Web项目中。

    5 Maven

    推荐资源:《maven实战》,易百教程里的maven教程,慕课网、极客学院等网站上的视频课程

    刚才咱们已经说过了Spring,orm框架,以及MySQL等方面的技术了。实际上,一个简单的Java Web项目也只需要这些东西了。

    但是,有一个问题,就是:一个项目里用到这么多技术,所需要的jar包也会很多,我们如何管理这些jar包呢。如果直接导入所需jar包,那当jar包更新或者需要替换时,每次都要手动操作,非常麻烦。另外,当jar包很多时,项目打包后的war格式文件也会很大,不利于传输。

    为了解决上述问题,maven应运而生了。maven通过pom.xml文件来指定所需的jar包,并且自带了很多构建相关的功能,比如编译,打包,运行单元测试等等,因为它本身就是一个构建工具。

    当然,新手可能还难以理解这些概念,你必须要知道的是,大部分Java Web项目需要用maven来管理,你需要学会maven的基本用法,最基本的用法就是:学会修改pom.xml文件。

    6 Tomcat

    推荐资源:慕课网、极客学院等网站上的视频课程。

    对于小白来说,Tomcat相关的技术是非常复杂的,毕竟它是一个应用服务器啊,事实上这个时候,你只需要学会如何安装Tomcat即可。毕竟,它在项目中的作用就是提供一个运行环境而已。

    正常来说,你只要下载解压Tomcat的压缩包即可。由于现在的IDE都支持集成Tomcat,所以一般情况下你都可以在IDE中配置好你的Tomcat路径,然后设置好你的项目路径,IDE会自动把你的工程代码部署到Tomcat服务器上。

    如果你使用想跳过IDE直接部署工程到Tomcat上,也可以直接编译工程并且打包得到war格式的文件(这个步骤可以使用maven来完成),然后拷贝war文件到Tomcat下的特定目录即可。

    上述两种部署方式的详细步骤请到搜索引擎寻找答案。

    7 Git和GitHub

    推荐资源:廖雪峰的Git教程,GitHub官网,慕课网、极客学院等网站上的视频课程。

    既然要做项目,为什么不把它发布在GitHub上。当你熟悉了Git指令之后,你可以很方便地发布你项目中的每一次更新,并且同步到GitHub上,这样既可以让你更好地管理项目版本,又可以让你GitHub更加活跃,为你未来的面试加分。

    所以,赶紧学好Git指令,然后开启你的项目之旅吧。

     

     

    04

     

     

     

     

     

     

     

    其他常用组件

     

     

     

     

    除了上面几种必备的技术之外,有时候我们在项目中还会用到其他东西,在这里我们把它们叫做组件。这里只做简单的介绍,至于具体怎么使用,在网上都可以很容易地找到相关文章。

    1 日志系统

    当项目代码比较多的时候,容易发生错误,日志可以很好地记录代码运行时的错误,常用的日志系统有log4j,logging等等,另外你还需要了解一下slf4j。

    2 单元测试

    日志系统可以记录代码问题,单元测试则是为了避免代码出错,常用的单元测试组件主要是JUnit,建议你找个文档看一看,然后下载下来玩一下。

    3 JSON

    JSON逐渐成为前后端数据交互的标准格式,为了在项目中使用JSON的API,你也需要导入它的jar包,一般我们都会使用阿里提供的fastjson,赶快下载来玩一玩吧。

    当然,常用的Java Web组件还有很多,比如HTTPClient,再比如一些加密工具,一些压缩工具等等,这里就不再一一列举了。

     

    05

     

     

     

     

     

     

     

    推荐项目课程

     

     

     

     

    现在网上的项目课程那么多,哪一款更适合你呢?

    其实我看过的视频课程也不是很多,早先在慕课网和极客学院看过一些项目课程,觉得比较一般,对新手来说不太友好。

    我的一些同学看过一些培训机构的课程,专业讲师录的项目课程可能会稍微好一点。在我公众号后台回复“Java”可以领取某机构的视频课程,不过我不是打广告的,这个机构也没有给我钱啦。

    当然,我最推荐的还是牛客网的视频课程,分别是Java中级项目课和Java高级项目课。主要有几点原因吧:

    1 叶神讲课,比较了解同学们的情况,而且技术功底摆在那里没的说。

    2 所做的项目比较接地气,用的技术栈也比较新,比较全。

    3 我自己全程跟着牛客网的项目课做了一遍,感觉确实有收获,而且每个章节的安排也比较合理。

    4 配套有PPT,项目代码以及部分安装包,可以让你省去很多繁琐的环节。

    看来我真是牛客网的真爱粉,居然帮牛客网免费推广~

    当然,你也可以自己去找一些你感兴趣的项目课程,后续我也会收集更多的视频课程来分享给大家。

    PS:如果找不到我说的这些资源,也可以微信私我。老规矩,公众号后台回复“少侠”可以勾搭作者。

     

    06

     

     

     

     

     

     

     

    总结

     

     

     

    今天的内容就到这里了,与其说是初级篇,反而更像是“项目篇”呢。因为学完基础内容之后,做项目是最好的复习和实践方式了。所以这篇文章围绕着做项目来展开,也就不足为奇了。

    今天我们主要讲的是,做好一个JavaWeb项目,需要哪些知识储备,需要了解哪些技术,并且我也推荐一些比较精品的视频课程。

    后面我还会写一篇文章,专门讲一讲怎么做项目,会更加详细,更加侧重怎么去做,敬请期待吧。

    总结以下今天说的几个要点吧:

    1 Java基础知识储备

    2 前端知识储备

    3 了解和使用JavaWeb常用技术

    4 JavaWeb常用组件介绍

    5 视频课程推荐

    俗话说的好,磨刀不误砍柴工,相信你看了本文之后,可以更好地做好知识储备,然后开始Java Web的项目实践,希望你能够顺利地完成你的第一个项目。

     

    ▼更多精彩内容

     

    想了解Java后端学习路线?你只需要这一张图!

    Java工程师修炼之路(校招总结)

    你不可错过的Java学习资源清单

    Java基础知识点总结

    Java秋招面经大合集

     

     

     

    笔者在今年秋招中成功拿到BAT头条网易等大厂的研发offer,期间总结了很多经验和技巧,我把它们写成文字,做成专题,发表在公众号上,希望让更多有需要的朋友看到。

     

     

     

     

     

    Java工程师学习指南

     

     

    中级篇

     

     

     

     

    最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好。原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站在Java后端的全局上进行思考和总结的,忽略了很多小白们的感受,而很多朋友都需要更加基础,更加详细的学习路线。

    所以,今天我们重新开一个新的专题,分别按照四个部分讲述Java的学习路线,笔者也打算趁此机会,回忆一下自己的Java学习历程。今天我们要讲的是第三部分,Java工程师学习指南(中级篇)。

    先声明一点,文章里面不会详细到每一步怎么操作,只会提供大致的思路和方向,给大家以启发,如果真的要一步一步指导操作的话,那至少需要一本书的厚度啦。

    当然,本文提到的大部分内容都能在我的博客中找到对应的一些文章。所以也欢迎大家去我博客找到你们需要的资源。

    本文中的方法不一定适合所有人,如有错误还请谅解。

    上期回顾

    在上一篇文章中,我们主要讨论的是如何做一个Java Web项目,以及前期需要哪些方面的基础。最后,我还推荐了几个比较不错的视频课程,以便给大家参考。

    当然,跟着视频课程做完一个项目,你只是照葫芦画瓢又练习了一遍,可能其中有很多东西你并不太理解,比如你可能不知道为什么代码要分层,为什么要用maven进行线上编译,为什么Tomcat启动时会输出那么多的日志。

    有疑问很正常,因为一个Java Web项目涉及的技术还是很多的,如果要理解这些技术的原理,光靠一个项目课程是远远不够的。所以,在你体验了Java Web项目的开发流程以后,你应该花些时间去了解相关技术原理了,今天我们要讲的也是这部分内容。

    对于即将参加校招的同学来说,最重要的也是这部分内容,你需要了解JVM虚拟机原理,Java并发原理,并且熟悉JDK的部分源码,了解这些API的底层实现。除此之外,还有很多,下面我们分别来谈一谈。

     

    PS:文中多次提到我的博客,是因为我的博客里整理了多个技术专栏,基本上包含了下面所说的内容。关注公众号后,在公众号后台回复“练级”即可获得我的技术博客地址,以及其他相关的资源。

     

     

    01 计算机基础知识

     

     

     

    计算机基础课程(非科班)

    如果你不是计算机专业的同学,那你可能要注意一下了。在学习下面这些内容之前,你最好要学习一下计算机基础课程。

    这里我们说的计算机课程是:数据结构,操作系统,计算机网络。

    数据结构:这门课应该算是三门课程比较简单的一门了,推荐《数据结构与算法(Java语言描述)》,看书结合代码实践,把基本的数据结构算法写一写就可以了。

    操作系统:关于操作系统我看了很多本书,但是没有感觉特别好的,所以如果有时间的话可以先看另外一本书《深入理解计算机系统》,这本书讲了很多计算机的基本概念,不局限于操作系统。

    然后可以看一看汤小丹写的《操作系统》,或者你们学校的教材。

    计算机网络:网络方面的书也非常多,推荐看一下《计算机网络:自顶向下方法》,另外还有一本《TCP/IP 详解:卷一》也是备受推崇的书。

    除此之外,我还要推荐一下刘欣老师的书《码农翻身》,书中用一些有趣的故事来讲解操作系统和计算网络的一些复杂概念,有助于大家理解这部分内容。

     

     

    02 JVM虚拟机

     

     

     

    JVM虚拟机

    为什么把JVM放在第一位,因为它是最基础也最重要的一块内容。所有的Java代码都运行在JVM上,事实上,JVM在操作系统中只是一个进程。为了了解Java代码的运行方式,底层引擎的执行原理,以及内存的分配情况,我们必须要学习JVM虚拟机。

    推荐资源:《深入理解JVM虚拟机》

    很高兴地告诉你们,学习JVM你只需要把这本书吃透即可,当然,看一遍可不够,笔者前后至少看了三遍,有条件的话最好把书中的实例都跑一跑。

    另外,JVM也是面试必考的内容,所以,相应地去准备一些面试题也是很有必要的,如果你基本掌握了这本书的内容,相信你不会惧怕任何JVM面试题。

     

     

    03 设计模式与源码阅读

     

     

     

     

    设计模式

    为什么在这里提到设计模式呢,因为设计模式是Java编程规范的经典总结,并且在JDK源码中经常使用,由于我们后面会讲到JDK源码方面的学习,所以对于设计模式,建议大家先学习一下,最好的学习方式就是看书结合实践,把一些常用的设计模式自己实现一下。

    推荐资源:《head first 设计模式》

    JDK源码(主要指集合类源码)

    接下来下场的选手是:JDK源码。不过对于大部分人来说,只要能够掌握集合类,字符串这些源码就可以了,其他部分的源码主要集中在JUC并发包里,而这些内容我们会放在Java并发技术里来讲。

    为什么我们需要掌握集合类源码呢,其一是因为面试喜欢考,其二是因为集合类的源码实现都比较经典,难度也不算太大,并且运用了很多优化方法,所以了解它对于学习Java的同学来说大有裨益。

    推荐资源

    市面上并没有哪本书专门来讲JDK源码的,所以这部分内容的学习资源主要是两个部分,一是JDK源码本身,而是一些技术博客。

    1 对于JDK源码,直接看可能比较有难度,不推荐新手这么做。 2 讲解源码的文章质量参差不齐,所以我只推荐几个我自己比较熟悉的,一个是importnew。一个是我的博客。另外,我之前分享的一篇文章《你不可错过的Java学习资源》中也推荐了很多大牛和博客,大家也可以去看看。

    Spring源码

    说实话,Spring源码的复杂度远高于集合类的源码,这也是因为Spring运用了很多的设计模式,并且有着非常繁杂的类关系。所以,我不建议大家直接去读Spring源码,因为即使是看Spring源码解析的书籍,你也会感到很吃力。

    所以,我推荐的方式是,看书+看一些比较好的源码解析文章。另外要告诉大家的是,Spring的源码很多,并不是所有内容都需要你掌握的,大家都知道Spring最常用的特性就是IOC和AOP,所以看源码解析时,最重要的也是这两个部分了。

    另外,看完Spring的源码解析以后,别忘了看SpringMVC的源码解析,学习方法也是一样的,找重点内容看即可。

    推荐资源:《Spring源码深度》,我的博客专栏

     

     

    04 Java并发技术

     

     

     

     

    Java并发技术

    相信你为了搞定集合类源码和Spring源码花了不少功夫了,接下来轮到Java并发技术出场了。我们在入门篇其实已经谈到了多线程,但是也仅仅停留在使用Thread或者Runnable实现简单的多线程demo。

    实际上,为了理解Java并发技术的底层实现,我们还需要知道JMM模型,了解synchronized和volatile的底层实现,同时还要明白Java中的多线程和操作系统的多线程和什么联系和区别。除此之外,我们经常谈到的线程安全,有哪些实现方法,也是这部分内容的要点。

    学习并发技术,我建议分为三个步骤

    1 首先熟悉Java的多线程基础知识,比如Thread的使用,线程的状态转换,以及一些api的使用方式。

    2 了解一些理论基础,比如JMM,操作系统的多线程实现。这部分内容推荐通过看书和看博客来学习。

    3 了解并使用JUC的一些API,然后开始看JUC的一些源代码。这个阶段是最重要也是最困难的。

    推荐资源: 书籍:《Java并发编程艺术》,《Java并发编程实战》 网站:我的博客专栏,并发编程网,importnew,《你不可错过的Java学习资源》

     

    05 Java网络编程

     

     

     

    Java网络编程

    在搞懂Java并发编程技术之后,相信这部分内容也难不倒你。当然,前提是你对计算机网络有一定了解,因为网络编程涉及到TCP和HTTP相关的知识点。

    在学习这部分内容的时候,你首先要了解socket的使用以及原理,然后再去了解NIO的相关API,多写一些客户端和服务端通讯的demo,以便熟悉这些内容。为了更好地理解网络编程,你还要去了解UNIX网络编程模型。

    除此之外,如果你想要更好地理解Java网络编程,你还需要去了解Tomcat的实现原理。同时,Netty也是值得你去学习的一部分内容,最好有机会去用一用这一网络编程框架,学有余力的同学还可以考虑看看它的源码(笔者没有看)。

    推荐资源:我的技术博客,《Java网络编程》,《你不可错过的Java学习资源》

     

    05 Java8

    Java的版本一直在更新,但目前在用的主要还是Java8和Java7,等再过几年可能这部分的内容就过时了。但是目前看来,对Java8的学习和了解还是很重要的,毕竟面试也喜欢考。

    对这部分内容学习的最好方式就是:看文章+代码实践

    推荐资源:《Java8实战》

     

    06 总结

     

     

     

    今天的内容貌似有点多,大家会不会感觉有点吃不消呢。没关系,因为这部分内容确实需要花很多时间去学习。对于一个在校的Java学习者来说,可能没有机会接触到多么高大上的项目,所以对内功的修炼显得格外重要。

    看书,写demo,读源码,看似简单的事情实际上需要花费大量时间和精力,这个过程是需要你静下心来,慢慢沉淀的,在学习的过程中你也可以和笔者一样,写一些总结和博客,以便更好地回顾自己的学习历程。

    总结以下今天所讲的内容吧:

    1 计算机基础课程:数据结构,网络和操作系统 2 JVM基本原理 3 设计模式,JDK源码,Spring源码 4 Java并发技术,JUC源码 5 Java网络编程 6 Java8

    如果你对上述内容仍有疑问或者有一些建议,也可以和我交流。 关注公众号后在后台回复“少侠”可以获得我的联系方式。欢迎来撩。

     

     

     

    — END —

     

     

     

     

     

    ↙点击下方“阅读原文”查看更多内容

     

    — END —

     

    ▼更多精彩内容

     

    想了解Java后端学习路线?你只需要这一张图!

    Java工程师修炼之路(校招总结)

    你不可错过的Java学习资源清单

    Java基础知识点总结

    Java秋招面经大合集

     

     

    笔者在今年秋招中成功拿到BAT头条网易等大厂的研发offer,期间总结了很多经验和技巧,我把它们写成文字,做成专题,发表在公众号上,希望让更多有需要的朋友看到。

     

    关注公众号后,可以在后台回复“Java”即可领取精品Java学习资源(不断更新中),学习资源包括基础,实战以及求职等内容。

     

    1、后台回复“少侠”,可以获取我的微信,有什么问题都能聊。
    2、如果你想要加入微信交流群,那么可以在后台回复“江湖”。
    3、如果你想要到我的技术博客看更多的Java后端技术文章,请回复“练级”。

     

     

     

     

     

    Java工程师学习指南

     

     

    完结篇

     

     

     

     

    先声明一点,文章里面不会详细到每一步怎么操作,只会提供大致的思路和方向,给大家以启发,如果真的要一步一步指导操作的话,那至少需要一本书的厚度啦。

    因为笔者还只是一名在校生,所以写的内容主要还是针对Java初学者或者接触Java后端不久的朋友,不适用于已经工作多年的Java大佬们。所以本文中的方法不一定适合所有人,如有错误还请谅解。

    本期的内容是系列文章的最后一部分内容了。这个系列可能还有很多东西没有说清楚,也有很多内容被忽略了。但是这些内容也确实是笔者结合自己经验总结而成的,希望能对大家有用 ~ 当然如果有什么建议也可以随时和笔者交流。

    上期回顾

    上期我们重点介绍了Java工程师进阶所需要掌握的一些技术内容。特别对于即将参加校招的同学来说,最重要的也是这部分内容,你需要了解JVM虚拟机原理,Java并发原理,并且熟悉JDK的部分源码,了解这些API的底层实现。

    之所以把这部分放在Java Web项目之后来讲,是因为我觉得,一开始做项目的时候你不可能已经掌握好上述内容了,所以你完全可以带着问题去做项目,再花时间去学习底层原理,这样你可以很好地结合你之前实践过的代码去理解那些底层技术了。

    本期主题

    本期主要介绍的是Java后端技术比较“高端”的一些内容,也就是我们经常聊的分布式,架构,缓存,消息队列等内容,另外我们也会介绍一些大后端相关的技术,比如云计算(OpenStack和docker),大数据(hadoop生态),以及一些常用的后端技术。

    这些内容其实离我们并不远,只不过在平时的项目中可能用的比较少,所以作为学生党一般也只能通过一些文章或者书本去学习理论知识。那么基于这么一个情况,我们来谈谈怎么学习这部分的内容吧。

     

     

    01 Web后端架构

     

     

     

    Web后端架构

    后端进阶第一步,先把Web架构相关的技术学好吧,因为之前大家都做过Java Web项目,想必对这块内容还是比较熟悉的吧。我们需要了解Web架构演化的历史,了解为什么要做服务器集群,为什么要用缓存,为什么要做拆分,做主从,以及为什么要有分布式。

    推荐资源:《深入分析Java Web技术内幕》,《大型网站技术架构》

    两本都是阿里大佬出的书,两位都是淘宝系的技术大牛。前一本书主要讲述的Java Web的一些技术基础,关于Web架构的内容比较少。

    后一本则是李智慧大佬写的架构科普书籍,用非常简单易懂的语言写出了大型Web项目架构之美,分别着眼于高可用,高性能,高扩展等方面讲解了很多设计结构的原则和方法。这本书应该是Web架构小白最好的入门书籍了。

     

     

    02 分布式理论基础

     

     

     

    由于下面的内容或多或少都会涉及到分布式相关的知识,所以这一部分我们主要介绍一下有关分布式的基础知识。笔者对分布式的学习主要也停留在理论上,所以这里讲的也是一些理论的东西。

    推荐资源:《从Paxos到zookeeper分布式一致性原理与实践》,我的技术博客专栏“分布式系统理论与实践”

    这本书比较好地科普了分布式基础知识,也介绍了zookeeper的原理和使用。了解zookeeper是了解分布式技术很重要的一个环节。

    1 CAP 和 BASE

    谈分布式就要谈CAP,一致性,高可用,网络分区容忍性为何只能三选二,为什么网络分区容忍性必须要被考虑。CAP在实际应用中真的可靠么?

    BASE出现的原因,为什么BASE更容易实现,更适合实际应用,BASE可以通过哪些技术去实现呢?

    2 一致性协议和算法

    一致性协议也是分布式理论的一个重点,2PC,3PC,分别指的是什么,其中分别有什么问题。3PC解决了2PC的一个问题,却仍然不完美。

    Paxos和Raft两种一致性算法,显然前者比后者复杂得多,但是Raft可能更加实用。为什么我们需要一致性算法,它们又有什么用呢。

    3 分布式事务和最终一致性

    分布式事务是一个复杂的概念,主要指分布式系统中需要强一致场景时所用到的事务。理解和实现它都不是简单的事情。

    如果我们退而求其次,不要求强一致性,而选择最终一致性,则可以用更加灵活的方案,比如事务消息。

     

     

    03 常见分布式技术

     

     

     

     

    推荐资源:《从Paxos到zookeeper分布式一致性原理与实践》,我的技术博客专栏“分布式系统理论与实践”,《深入理解Spring Cloud与微服务构建》,《分布式服务框架原理与实践》。

    1 zookeeper

    上文说到zookeeper是分布式技术很重要的一块内容,这是因为zookeeper用于管理和协调分布式组件,虽然它出自hadoop生态,却用于很多应用当中,基本上有分布式的地方就有zk的存在。

    简单说来,zk可以提供全局统一的节点树结构,通过节点来管理资源,同时zk自身是使用集群方式部署的,所以保证自己是高可用的。根据这一特点,它可以作为服务注册中心,还可以实现分布式锁等功能。

    2 分布式服务

    分布式服务是一个挺有意思的东西,也很常用,简单来说,就是把服务组件部署在不同节点上,通过rpc的方式访问,为了实现这一功能,我们需要考虑通信协议,序列化方式,进一步来说,我们还要了解如何做服务注册和发现,以及如何做限流,做服务熔断和降级,等等等等。

    常见的分布式服务框架有dubbo,以及Spring Cloud这类产品,学会使用他们,然后了解它们的底层实现原理,相信会是一个很有趣的过程。

    3 负载均衡

    关于负载均衡,说起来其实很简单,就是把一组请求分成多组,按照某种规则分发到多台服务器上。

    但是负载均衡也涉及很多内容,包括负载均衡的算法,负载均衡的实现方式,我们需要了解它到底是在哪一层实现的。

    一般来说,常用的负载均衡方式有nginx和lvs两种,分别是7层和4层的负载均衡,一个基于域名进行负载均衡,一个基于端口号做负载均衡。了解它们的实现原理,会让你更好地理解这部分内容。

    4 分布式session和分布式锁

    这两个组件也是分布式项目中经常要用到的,了解它们的使用和实现原理,有助于以后在项目中的实践。

    分布式session一般有多种实现方式,可以存数据库或者缓存,也可以单独部署成一个服务,总之最重要的一点就是,性能要好,并且要高可用。

    分布式锁则用于一些需要一致性的场景中,比如订单生成这种全局唯一的功能,分布式锁通常可以用缓存或者数据库来实现,但为了保证高性能,并且避免死锁,我们一般采用Redis或者zookeeper来实现。

     

     

    04 缓存

     

     

     

     

    讲到缓存,我们说的最多的就是Redis,所以我们要讲的也是Redis。学习Redis,除了学会使用简单的api之外,最好还要了解它的实现原理。

    推荐资源:我的技术博客专栏“重新学习MySQL和Redis”,《Redis设计与实现》

    这里我们主要介绍三部分内容,也是我个人认为比较重要的三块内容。

    1 数据结构和底层实现

    Redis的数据结构比较丰富,但更有意思的是这些数据结构背后的底层实现,也就是作者如何用c语言来实现这些结构的。其中会有你熟悉的数组,链表,还有一些有意思的结构比如跳表,哈希表。

    2 持久化方式

    持久化方式主要分两种,aof和rdb,前者基于追加日志的方式来实现日志持久化,后者则是使用备份数据的方式来实现持久化。

    3 分布式方案

    这是Redis最有趣也最复杂的部分。 首先,Redis可以使用主从的方式部署,其中“哨兵”这一组件用于故障切换。

    基于哨兵的主从部署后来发展为Redis cluster的部署方式,也就是Redis集群,通过分片的方式来部署Redis集群,并且集群中任一节点都可以用来对外提供服务。

    当然,除了Redis集群之外,还有codis的分布式方案,codis基于代理的方式来实现,表面上还是使用原来的Redis API,但实际上访问的却是一个Redis集群。

     

    05 消息队列

     

     

     

    消息队列的作用一般来说就是削峰,控流,解耦合,目前业界也有很多的消息队列产品,在很多公司都会使用,当然,它们各有各的优缺点,我们也不必全都了解,这里我们大概介绍3种消息队列,它们各自的特点都比较鲜明,值得大家去了解一番。

    1 RabbitMQ

    笔者刚开始接触的消息队列是rabbitmq,它的使用方法比较简单。 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现,主要有以下特点:

     
    1. 安装部署简单,上手门槛低,功能丰富,符合AMQP标准;

    2.  

    3. 企业级消息队列,经过大量实践考验的高可靠;

    4.  

    5. 集群易扩展,可以轻松的增减集群节点;

    6.  

    7. 有强大的WEB管理页面。

    2 Kafka

    与其他MQ相比较,Kafka有一些优缺点,主要如下

    优点:

     
    1. 可扩展。Kafka集群可以透明的扩展,增加新的服务器进集群。

    2.  

    3. 高性能。Kafka性能远超过传统的ActiveMQ、RabbitMQ等,Kafka支持Batch操作。

    4.  

    5. 容错性。Kafka每个Partition数据会复制到几台服务器,当某个Broker失效时,Zookeeper将通知生产者和消费者从而使用其他的Broker。

    缺点:

     
    1. 重复消息。Kafka保证每条消息至少送达一次,虽然几率很小,但一条消息可能被送达多次。

    2.  

    3. 消息乱序。Kafka某一个固定的Partition内部的消息是保证有序的,如果一个Topic有多个Partition,partition之间的消息送达不保证有序。

    4.  

    5. 复杂性。Kafka需要Zookeeper的支持,Topic一般需要人工创建,部署和维护比一般MQ成本更高。

    RocketMQ

    RocketMQ是一个纯java、分布式、队列模型的开源消息中间件,前身是Metaq,当 Metaq 3.0发布时,产品名称改为 RocketMQ。

    具有以下特点:

     
    1. 1、能够保证严格的消息顺序

    2. 2、提供丰富的消息拉取模式

    3. 3、高效的订阅者水平扩展能力

    4. 4、实时的消息订阅机制

    5. 5、亿级消息堆积能力

    除此之外,它还有一个优点,就是支持事务消息,让分布式事务的实现变得简单

     

     

    05 分布式数据库

     

     

     

     

    这里说的分布式”数据库“,其实指的是数据库的分布式方案,更具体来说,主要指的是数据库的主从部署,以及分库,分表。

    1 主从复制和读写分离

    这是数据库高可用的基础。MySQL数据库会使用日志来完成主从复制,先写主库,然后再同步到从库。读写分离则一般是指的是:从库负责读,主库负责写。

    2 分库分表方案

    分库分表是解决大表性能瓶颈的一种方法,当然也分为横向拆分和纵向拆分,横向拆分指的就是减少单表的数据量,放到其他表或者其他库中。纵向拆分则一般指按照业务来拆分,把不必要的字段放到其他表中。

    分库分表可以在应用层做,通过对id或者其他字段进行hash以便映射到对应的表中。当然也可以通过数据库中间件来完成,例如mycat这种中间件,通过代理的方式实现分库分表,非常方便。

     

    06 大后端相关技术

     

     

     

     

     

    这部分的内容笔者也只是略知一二,所以这里只是抛砖引玉,做一个简单的科普罢了。毕竟咱们学技术的人都是先讲深度再来谈广度。当你对之前的内容掌握得比较好的时候,再去看看大后端的一些其他技术,也会感觉挺有意思的。

    下面这些技术主要是我自己学习路上接触过的一些内容,所以比较熟悉,才拿出来分享,至于适不适合大家的口味,可能就见仁见智了。

    Hadoop生态

    笔者之前参与过数据仓库相关的项目,所以稍微了解了这方面的内容,感觉hadoop生态还是挺有意思的。

    大家不妨去了解一下其中的基本组件,然后打一个集群自己玩玩看。 常见的组件有:hdfs,hbase,hive,zookeeper,flume,sqoop,yarn。

    推荐资源:我的技术博客-个人分类-hadoop,《大数据技术原理与应用》

    对于入门hadoop生态来说,这本书完全足够了,如果你要做大数据平台开发或者是数据研发工程师,可能需要非常全面地了解这些组件的底层原理。

    云计算初探

    笔者之前参与过私有云相关的项目,所以稍微了解了这方面的内容,感觉这方面的内容也蛮有趣的。

    我在项目中主要接触到的是OpenStack,docker以及kubenetes,OpenStack是一个私有云生态,内部结构对于我们来说还是比较复杂的,不过最根本的虚拟化技术还是基于kvm虚拟化来实现的。

    docker则是现在非常流行的一种容器,用于快速部署应用。

    kubenetes也借着docker的东风火了起来,可以理解为是基于容器的分布式调度系统。

    这些技术在企业中也是比较常用的,只不过对于研发同学来说,更多时候扮演的是工具的角色。

    推荐资源:《Docker技术入门与实战》,《kubenetes权威指南》

    其他常见后端技术

    除此之外,想必大家还了解过很多其他的技术,只不过不同的业务用到的组件往往不一样,所以并不是每个东西你都需要去了解。

    比如搜索引擎技术Lucene,基于它的两款产品solr和elasticsearch,通常出现在需要搜索功能的项目中。

    再比如流式计算技术,如storm和spark streaming等等,通常都用于大数据部门,用作实时数据采集。

    又如ELK实现的分布式日志系统,多用于分析和定位系统问题,经常会出现在一些比较重要的应用当中。

    当然,也有现在大火的人工智能,还有太多的技术我们没机会去了解和使用,我们能做的也就是在自己能力范围内把需要做的东西做到最好了。

    所以,这些内容并不是每一样你都需要知道,但是如果有时间去了解一下的话,还是建议多了解一点的。

     

    07 总结

     

     

     

     

    总结

    今天码的字有点多,所以难免有些写的不太好的地方,希望大家见谅。纵观全文,我们主要讲了这些内容:

    1 Web架构

    2 分布式基础理论

    3 常见分布式技术

    4 缓存

    5 消息队列

    6 数据的分布式方案

    7 大后端相关技术

    至此本系列文章就已经结束了,不知道大家有什么问题或者建议想和笔者交流吗~赶紧加我的微信来聊聊吧。

    写本系列文章也是因为有很多朋友想要了解更加清晰的Java后端学习路线,所以我总结了之前自己的学习历程,才创作出这四篇文章,希望能够对大家有所帮助~

     

     

     

     

     

     

    笔者在今年秋招中成功拿到BAT头条网易等大厂的研发offer,期间总结了很多经验和技巧,我把它们写成文字,做成专题,发表在公众号上,希望让更多有需要的朋友看到。

     

    微信公众号【黄小斜】大厂程序员,互联网行业新知,终身学习践行者。关注后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字可以获取对应的免费学习资料。 

     

     

                         

    展开全文
  • 很多零基础学习Java的小伙伴,只清楚Java薪资高,就准备去学习,但是学习的过程中困难重重,不知道怎么学习,也不知道从何学习Java入门学习基础是什么也不知道,今天小编介绍一下:零基础学习Java需要掌握哪些基础...

    很多零基础学习Java的小伙伴,只清楚Java薪资高,就准备去学习,但是学习的过程中困难重重,不知道怎么学习,也不知道从何学习,Java入门学习基础是什么也不知道,今天小编介绍一下:零基础学习Java需要掌握哪些基础技能?希望对于Java入门基础学习的小伙伴有所帮助

    一、零基础学习Java需要掌握哪些基础技能?先了解什么是Java的四个方面

    初学者先弄清这些Java的基本概念也是必不可少的,死记硬背肯定是不行的,重在理解,理解它们之间的区别与联系,分别有哪些应用。想想这些代码中用到了哪些知识点。不要一味地照着书本敲代码。而不去理解。

    1.Java编程语言,即语法。

    2.Java文件格式,即各种文件夹、文件的后缀。

    3.Java虚拟机(JVM),即处理*.class文件的解释器。

    4.Java应用程序接口(Java API)。

    二、零基础学习Java需要掌握哪些基础技能?掌握静态方法和属性

    静态方法和属性用于描述某一类对象群体的特征,而不是单个对象的特征。Java中大量应用了静态方法和属性,这是一个通常的技巧。但是这种技巧在很多语言中不被频繁地使用。

    理解静态方法和属性对于理解类与对象的关系是十分有帮助的,在大量的Java规范中,静态方法和属性被频繁使用。因此学习者应该理解静态方法和属性。Java在方法和属性的调用上是一致的,区别只表现在声明的时候,这和c++是不同的。

    无论是想转行还是大学生,怎么学java很重要,不然浪费金钱和时间这对你来说都是你非常宝贵的,尤其是时间,看看行业大牛的建议吧,少走弯路本身你就已经赢了一半了,这是Java交流口口qun:七三二、三零八、一七四,如果大家对于学习Java的学习方法,如何学习有效率以及就业的问题可以添加群跟大家交流(大神还是非常多的)

    三、零基础学习Java需要掌握哪些基础技能?JAVA的三个技术平台的关系

    Java分为三个体系,分别为Java SE(J2SE,Java2 Platform Standard Edition,标准版)。JavaEE(J2EE,Java 2 Platform, Enterprise Edition,企业版)。Java ME(J2ME,Java 2 Platform Micro Edition,微型版)。

    要知道java是分两部分的:一个是编译,一个是运行。

    javac:负责的是编译的部分,当执行javac时,会启动java的编译器程序。对指定扩展名的.java文件进行编译。 生成了jvm可以识别的字节码文件。也就是class文件,也就是java的运行程序。

    java:负责运行的部分.会启动jvm.加载运行时所需的类库,并对class文件进行执行.一个文件要被执行,必须要有一个执行的起始点,这个起始点就是main函数。

    四、零基础学习Java需要掌握哪些基础技能?掌握JAVA代码的基本格式

    1、Java注释尽可能全面

    对于方法的注释应该包含详细的入参和结果说明,有异常抛出的情况也要详细叙述:类的注释应该包含类的功能说明、作者和修改者。

    2、多次使用的相同变量最好归纳成常量

    多处使用的相同值的变量应该尽量归纳为一个常量,方便日后的维护。

    3、尽量少的在循环中执行方法调用

    尽量在循环中少做一些可避免的方法调用,这样可以节省方法栈的创建。例如:

    for(int i=0;i<list.size();i++){

    System.out.println(i);

    }

    可以修改为:

    for(int i=0,size=list.size();i<size;i++){

    System.out.println(i);

    }

    4、常量的定义可以放到接口中

    在Java中,接口里只允许存在常量,因此把常量放到接口中声明就可以省去public static final这几个关键词。

    5、ArrayList和LinkedList的选择

    这个问题比较常见。通常程序员最好能够对list的使用场景做出评估,然后根据特性作出选择。ArrayList底层是使用数组实现的,因此随机读取数据会比LinkedList快很多,而LinkedList是使用链表实现的,新增和删除数据的速度比ArrayList快不少。

    6、String,StringBuffer和StringBuilder

    这个问题也比较常见。在进行字符串拼接处理的时候,String通常会产生多个对象,而且将多个值缓存到常量池中。例如:

    String a=“a”;

    String b=“b”;

    a=a+b;

    这种情况下jvm会产生“a”,“b”,“ab”三个对象。而且字符串拼接的性能也很低。因此通常需要做字符串处理的时候尽量采用StringBuffer和StringBuilder来。

    7、包装类和基本类型的选择

    在代码中,如果可以使用基本数据类型来做局部变量类型的话尽量使用基本数据类型,因为基本类型的变量是存放在栈中的,包装类的变量是在堆中,栈的操作速度比堆快很多。

    8、尽早的将不再使用的变量引用赋给null

    这样做可以帮助jvm更快的进行内存回收。当然很多人其实对这种做法并不感冒。

    9、在finally块中对资源进行释放

    典型的场景是使用io流的时候,不论是否出现异常最后都应该在finally中对流进行关闭。

    10、在HashMap中使用一个Object作为key时要注意如何区分Object是否相同

    在jdk的HashMap实现中,判断两个Object类型的key是否相同的标准是hashcode是否相同和equals方法的返回值。如果业务上需要对两个数据相同的内存对象当作不同的key存储到hashmap中就要对hashcode和equals方法进行覆盖。

    Java描述复杂数据结构的主要方式是集合框架。Java没有指针,而是通过强大的集合框架描述数组、对象数组等复杂的数据结构。

    学好这些数据结构的描述方法对于应用程序编写,特别是涉及到服务器方、3层结构编程至关重要。程序员在这个时候不能再用诸如数据库结果集之类的结构描述数据了。

    由于很多语言没有这么强大的集合框架体系,很多零基础学习Java的小伙伴不知道需要掌握哪些基础技能?更不知道拿来做什么用,因此应该引起足够的重视。

    展开全文
  • JAVA学习历程

    2019-04-10 16:56:34
    JAVA 数组 概念: 数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。 数组既可以存储基本数据类型,也可以存储引用数据类型。 数组定义格式 格式1: 数据类型[] 数组名; 格式2: 数据类型 数组名[];...

    JAVA

    数组

    概念:
    数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
    数组既可以存储基本数据类型,也可以存储引用数据类型。

    数组定义格式
    格式1: 数据类型[] 数组名;
    格式2: 数据类型 数组名[];

    数组的初始化:JAVA中的数组必须初始化才能使用。
    动态初始化: 只指定长度,由系统给出初始化值。
    数据类型[] 数组名 = new 数据类型[数组长度]
    int[] arr = new int3; 定义了一个int类型的数组arr,这个数组可以存放3个int类型的值

    Java中的内存分配以及栈和堆的区别
    栈: 存放的是局部变量
    局部变量:在方法定义中或者方法声明上的变量都是局部变量。
    堆: 存放的是所有new出来的东西
    特点:
    a: 每一个new出来的东西都会为其分配一个地制值。
    b: 每一个变量都有一个默认的值
    byte,short,int,long – 0
    float,double – 0.0
    char – ‘\u0000’
    boolean – false
    引用数据类型 – null
    c: 使用完毕就变成了垃圾,等待垃圾回收器对其回收
    方法区:(面向对象部分讲解)
    本地方法区:(和系统相关)
    寄存器:(cpu使用)
    动态初始化数组的内存图:
    在这里插入图片描述
    数组的操作:反转
    例:int[] arr = {11,22,33,44,55};
    打印的结果为: [55,44,33,22,11]

    public class zuoye5 {
        public static void main(String[] args) {
            int []arr = {11,22,33,44,55};
            for (int i = arr.length-1; i>=0; i--) {
                System.out.println(arr[i]);
            }
        }
    
    

    二维数组

    概念:
    二维数组其实就是每一个元素为一维数组的数组

    二维数组的定义格式:
    数据类型[][] 变量名 = new 数据类型[m][n];
    m表示这个二维数组有多少个一维数组 必须写上
    n表示每一个一维数组的元素个数 可选

    	int[][] arr = new int[3][2];
    	定义了一个二维数组arr
    	这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]
    	每个一维数组有2个元素
    

    二维数组内存图:
    在这里插入图片描述
    二维数组的遍历:
    可以使用for循环,两层嵌套;外层循环控制二维数组的长度,即一维数组的个数,内层循环控制一维数组的长度
    二维数组的求和:
    案例:打印杨辉三角如下:
    1
    1 1
    1 2 1
    1 3 3 1
    1 4 6 4 1
    1 5 10 10 5 1
    代码:

    public class erweiDemo2 {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入行数");
            int a = sc.nextInt();
            int [][]arry = new int[a][a];
            for (int i = 0; i < arry.length; i++) {
                for (int j = 0; j < arry[i].length; j++) {
    
                    arry[i][0] = 1;
                    arry[i][i] = 1;
    
                }
            }
            for (int i = 2; i < arry.length; i++) {
                for (int j = 1; j < arry[i].length; j++) {
                    arry[i][j] = arry[i - 1][j - 1] + arry[i - 1][j];
    
    
                }
            }
                        for (int i = 0; i < arry.length; i++) {
                            for (int j = 0; j <= i; j++) {
    
                                System.out.print(arry[i][j]+"\t");
    
                            }
                            System.out.println();
    
                    }
    
        }
    }
    

    递归

    递归的思想:
    拆分 合并

    注意事项:
    要有出口,否则就是死递归
    次数不能太多,否则就内存溢出

    求一个数的阶乘:
    在这里插入图片描述

    public class DiguiDemo1{
            public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入一个数");
                int a = sc.nextInt();
                int r=jiecheng(a);
                System.out.println("这个数的阶乘是:"+"\n"+r);
            }
    
            private static int jiecheng(int one ) {
                if (one==1){
                    return 1;
                }else {
                    return one*jiecheng(one-1);
                }
    
            }
        }
    
    

    面向对象的思想

    概述:
    当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。
    可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了。这时就开始思索,
    能不能把这些步骤和功能在进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装 在一起。
    这样结构就清晰了很多。用的时候,找到对应的类就可以了。这就是面向对象的思想

    简单的说,就是当我们想要去完成一件事的时候,我们去找一个人,让他来做这件事,而我们只用指挥他去干这件事就行了

    面向对象思想的特征:
    封装(encapsulation)
    继承(inheritance)
    多态(polymorphism)

    类和对象的概述

    我们如何描述现实世界事物
    举例: 描述学生事物
    姓名 , 年龄 , 性别 …
    学习 , 吃饭 , 睡觉 …
    属性: 就是该事物的描述信息
    行为: 就是该事物能够做什么
    我们学习编程语言,就是为了模拟现实中的事物,我们学习的Java语言最基本单位是类,所以,我们就应该把事物用一个类来体现。
    由此我们就得到了现实中的事物和类的对应关系
    事物 ---------------- 类
    属性 ----------------- 成员变量
    行为 ----------------- 成员方法

    定义类其实就是定义类的成员(成员变量和成员方法)
    a:成员变量 和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
    b:成员方法 和以前定义方法是一样的,只不过把static去掉

    概念:
    a:类:是一组相关的属性和行为的集合
    b:对象:是该类事物的具体体现
    c:举例:
    类 学生
    对象 班长就是一个对象

    定义一个电脑类,并且使用
    包括 属性, 行为

    public class Computer {
        String name ;
        String Servicelife ;
        public void playgame(){
            System.out.println("启动英雄联盟");
        }
        public void onlineShopping(){
            System.out.println("打开淘宝网页,进行选购");
        }
    
    }
    
    public class Mytest {
        public static void main(String[] args) {
            Computer computer = new Computer();
            computer.name="戴尔";
            computer.Servicelife="3年";
            System.out.println(computer.name);
            System.out.println(computer.Servicelife);
            computer.playgame();
            computer.onlineShopping();
        }
    }
    
    

    面向对象的内存图(三个引用两个对象)
    在这里插入图片描述

    成员变量和局部变量的区别

    A:在类中的位置不同
    成员变量:在类中方法外
    局部变量:在方法定义中或者方法声明上(形参)
    B:在内存中的位置不同
    成员变量:在堆内存
    局部变量:在栈内存
    C:生命周期不同
    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
    D:初始化值不同
    成员变量:有默认初始化值
    局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。

    匿名对象

    就是没有名字的对象
    匿名对象应用场景
    a:调用方法,仅仅只调用一次的时候。
    b:匿名对象可以作为实际参数传递

    封装

    是指隐藏对象的属性和实现细节,仅对外提供公共访问方式

    好处:
    隐藏实现细节,提供公共的访问方式
    提高了代码的复用性
    提高安全性。

    private关键字的引入:
    a:是一个权限修饰符
    b:可以修饰成员变量和成员方法
    c:被其修饰的成员只能在本类中被访问
    最常见的应用:
    将成员变量隐藏,然后提供对应的getxxx()和setxxx()方法

    案例演示:利用封装来定义一个类

    public class Person {
     
        private int age;
    
        public void setAge(int nianling){
            if(nianling>=0&&nianling<=100){
                age = nianling;
            }else{
                System.out.println("设置的年龄不合理");
            }
    
        }
        public int getAge(){
            return age;
        }
        public void show() {
           
            System.out.println(age);
        }
    }
    

    this关键字

    当我们的局部变量和成员变量相同的时候,如果我们不使用this关键字,那么会导致一个问题:就是局部变量隐藏了成员变量的问题

    特点:
    是当前类的对象引用。
    简单的记,它就代表当前类的一个对象。谁调用这个方法,那么该方法的内部的this就代表谁

    public class Phone {
        private String name;
        private double price;
    
       
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public double getPrice() {
            return price;
        }
    
        public void setPrice(double price) {
            this.price = price;
        }
    
        public void call() {
            System.out.println("打电话");
        }
    }
    

    构造方法

    构造方法概述和作用:
    创建对象,给对象中的成员进行初始化

    格式特点:
    a:方法名与类名相同
    b:没有返回值类型,连void都没有
    c:没有具体的返回值
    注意事项:
    a:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
    b:如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
    注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法

    给成员变量赋值的两种方式
    a:setXxx()方法
    b:构造方法

    定义标准手机类并进行测试

    2、	public class MobilePhone {
         private String name ;
         private int price;
         private String serviceLife;
        public MobilePhone(){
    
        }
        public MobilePhone(String name,int price,String serviceLife){
             this.name = name;
             this.price = price;
             this.serviceLife = serviceLife;
    
    
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getPrice() {
            return price;
        }
    
        public void setPrice(int price) {
            this.price = price;
        }
    
        public String getServiceLife() {
            return serviceLife;
        }
    
        public void setServiceLife(String serviceLife) {
            this.serviceLife = serviceLife;
        }
    }
    
    
    public class Mytest2 {
        public static void main(String[] args) {
            MobilePhone mobilePhone = new MobilePhone();
            mobilePhone.setName("苹果");
            mobilePhone.setPrice(5000);
            mobilePhone.setServiceLife("三年");
            mobilePhone.getName();
            mobilePhone.getPrice();
            mobilePhone.getServiceLife();
            System.out.println(mobilePhone.getName());
            System.out.println(mobilePhone.getPrice());
            System.out.println(mobilePhone.getServiceLife());
            System.out.println("-----------------------");
            MobilePhone mobilePhone1 = new MobilePhone("苹果",5000,"三年");
            mobilePhone1.getName();
            mobilePhone1.getPrice();
            mobilePhone1.getServiceLife();
            System.out.println(mobilePhone1.getName());
            System.out.println(mobilePhone1.getPrice());
            System.out.println(mobilePhone1.getServiceLife());
    
    
        }
    
    

    static关键字的引入

    特点:
    a:随着类的加载而加载
    b:优先于对象存在
    c:被类的所有对象共享
    如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的
    d:可以通过类名调用
    其实它本身也可以通过对象名调用。
    推荐使用类名调用。

    注意事项:
    a:在静态方法中是没有this关键字的
    静态是随着类的加载而加载,this是随着对象的创建而存在。
    静态比对象先存在
    b:静态方法只能访问静态的成员变量和静态的成员方法

    static关键字的内存图:
    在这里插入图片描述

    静态变量和成员变量的区别

    A:所属不同
    静态变量属于类,所以也称为类变量
    成员变量属于对象,所以也称为实例变量(对象变量)
    B:内存中位置不同
    静态变量存储于方法区的静态区
    成员变量存储于堆内存
    C:内存出现时间不同
    静态变量随着类的加载而加载,随着类的消失而消失
    成员变量随着对象的创建而存在,随着对象的消失而消失
    D:调用不同
    静态变量可以通过类名调用,也可以通过对象调用
    成员变量只能通过对象名调用

    如何使用JDK提供的帮助文档

    A:找到文档,打开文档
    B:点击显示,找到索引,出现输入框
    C:你应该知道你找谁?举例:Scanner
    D:看这个类的结构(需不需要导包)
    java.lang包下的内容不需要我们手动导入
    其它包下的内容需要我们手动导入
    类 API文档
    成员变量 字段摘要
    构造方法 构造方法摘要
    成员方法 方法摘要
    E:看这个类的说明(简单的了解一下)
    F:看开始版本
    G:看构造方法
    H:看成员方法
    看左边:
    是否是static的,如果是我们就不需要创建对象,直接可以使用类名调用该方法;看返回值,返回值是什么我就使用什么接收
    看右边:
    看参数列表: 参数的个数 , 参数的类型 ; 要什么参数我是用的时候,就传递什么参数
    I:然后使用

    Math类的随机数功能

    打开JDK提供的帮助文档学习
    A:Math类概述
    类包含用于执行基本数学运算的方法
    B:Math类特点
    由于Math类在java.lang包下,所以不需要导包。
    没有构造方法,因为它的成员全部是静态的。
    C:获取随机数的方法
    public static double random():返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
    D:我要获取一个1-100之间的随机数,肿么办?
    int number = (int)(Math.random()*100)+1;

    案例:
    随机数小游戏:此游戏是一个猜数的游戏,电脑随机出1—100的一个整数,用户在控制台输入一个数,如果 输入的数和随机出来的数相同,则代表答对了,否则代表答错,继续猜,但是只能有10次
    会,十次用完,程序结束,而且每次失败都会提醒剩下的次数
    代码:

    import java.util.Scanner;
    
    public class Guessnumber {
        public static void main(String[] args) {
            int num = (int)(Math.random()*100+1);
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入一个1---100的整数");
            int count=10;
             while (true){
                int usernum = scanner.nextInt();
                if(usernum>num){
                    System.out.println("输入的数大了");
                    count--;
                }else if (usernum<num){
                    System.out.println("输入的数小了");
                    count--;
                }else {
                    System.out.println("恭喜你!猜对了");
                    break;
                }
             if(count>=1){
                 System.out.println("还有"+count+"机会");
    
             }else {
                 break ;
             }
    
    
            }
          }
     }       
    
    

    总结

    主要学习了面向对象的思想,构造方法,以及一些关键字。随着学习的东西增多,已经入门JAVA,相较于之前学习的东西,难度有所加大,需要大量练习才能掌握。但是随着学习的深入,对JAVA这门语言的兴趣相较以前有很大提升,我会努力保持多练习敲代码,同时会借助书本去挖掘更深层次的东西。

    欢迎使用Markdown编辑器

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    居中的图片: Alt

    居中并且带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block
    var foo = 'bar';
    

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目 Value
    电脑 $1600
    手机 $12
    导管 $1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列 第二列 第三列
    第一列文本居中 第二列文本居右 第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPE ASCII HTML
    Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
    Quotes "Isn't this fun?" “Isn’t this fun?”
    Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to-HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

    Γ(z)=0tz1etdt&ThinSpace;. \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    Created with Raphaël 2.2.0开始我的操作确认?结束yesno
    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • 前言:技术书阅读方法论 一.速读一遍(最好在1~2天内完成) 人的大脑记忆力有限,在一天内快速看完一本书会在大脑里留下深刻印象,对于之后复习以及总结都会有特别好的作用。 对于每一章的知识,先阅读标题,弄懂...

    前言:技术书阅读方法论

    一.速读一遍(最好在1~2天内完成)

    人的大脑记忆力有限,在一天内快速看完一本书会在大脑里留下深刻印象,对于之后复习以及总结都会有特别好的作用。

    对于每一章的知识,先阅读标题,弄懂大概讲的是什么主题,再去快速看一遍,不懂也没有关系,但是一定要在不懂的地方做个记号,什么记号无所谓,但是要让自己后面再看的时候有个提醒的作用,看看第二次看有没有懂了些。

    二.精读一遍(在2周内看完)

    有了前面速读的感觉,第二次看会有慢慢深刻了思想和意识的作用,具体为什么不要问我,去问30年后的神经大脑专家,现在人类可能还没有总结出为什么大脑对记忆的完全方法论,但是,就像我们专业程序员,打代码都是先实践,然后就渐渐懂了过程,慢慢懂了原理,所以第二遍读的时候稍微慢下来,2周内搞定。记住一句话:没看完一个章节后,总结一下这个章节讲了啥。很关键。

    三.实践(在整个过程中都要)

    实践的时候,要注意不用都去实践,最好看着书,敲下代码,把重点的内容敲一遍有个肌肉记忆就很不错了。

    以及到自己做过的项目中去把每个有涉及的原理的代码,研究一遍,就可以了。

    下面介绍一些大整理的读物,希望对初学者有所帮助:

    以下所有书籍,进群:606940296,免费打包下载,为防止水军,进群必须按要求回答审核问题,否则不予进群。
    在这里插入图片描述

    一.计算机网络系列

    1.《TCP/IP卷一》

    这本其实我刚开始没看太懂,可能是当时太水的原因,但是一般是大牛力荐的书。

    2.《计算机网络:自顶向下》

    这本从应用层讲到物理层,感觉这种方式学起来更轻松,我比较推荐小白看这本。

    3.《图解HTTP和图解TCP/IP》

    相较于前两本大厚书,这两本书更加亲民,小白可以买来看看,还是很适合入门的。

    4.《计算机网络》

    没错,就是这本教材,作为非科班选手自己看这本书,那叫一个欲仙欲死啊,看完就忘记了。

    二.操作系统系列

    1.《深入理解计算机系统》

    这本书不是严格意义上的操作系统书籍,而是对计算机基础和操作系统做了一个串联,可以解决你很多对于计算机的疑惑,并且对操作系统有一定理解。

    其实这本书还是很厚的,有一定难度,建议有一些基础后再看。

    1. 《现代操作系统》

    这本书其实我没怎么看,比较详细地讲解了操作系,但是也是大家都比较推崇的书,还是那句话,很厚,慎看。

    3.《Linux内核设计与实现》

    当你对操作系统有一定理解以后,这本书将为你打开学习Linux内核的大门,当然在此之前你得有一定的c语言开发能力,以及对Linux的了解。反正,我现在还没开始准备好看这本书。

    4.《Unix网络编程》

    这两本书的厚度绝对让你感到绝望,其实就是讲解了Unix内核是如何实现网络通信的,其中涉及到很多网络,操作系统的知识,并且你要熟悉c语言。总之,这是一本奉为网络编程神书的存在,不过我等新手还是拿他压压泡面就好了。网上有很多博客会参照该书的内容,可以去看看它们。

    三.数据结构与算法系列

    不瞒你说,由于我非科班,所以算法基础比较差,数据结构是考研时跟着天勤考研指南学的,学习算法也是一路坎坷,举步维艰。还是分享几本比较靠谱的书吧。

    1.《算法导论》

    你问我是不是认真的,我就是说说而已,这本书我买来没看过。

    2.《数据结构与算法(Java版)》

    这本书对于初学者来说还是比较友好的,当然学Java的看这本。

    3.《算法图解》《啊哈算法》

    这两部书籍非常适合学习算法的入门,前者主要用图解的形式覆盖了大部分常用算法,包括dp,贪心等等,可以作为入门书,后者则把很多常用算法都进行了实现,包括搜索,图,树等一些比较高级的常用算法。

    4 .《剑指offer》

    这本书还是要强烈推荐的,毕竟是面试题经常参考的书籍,当然最好有前面基本的铺垫再看,可能收获更大,这本书在面试之前一般都要嚼烂。

    5.LeetCode教科书式刷题网站

    这不是一本书,是一个题库,算法么,终究还是要靠刷题来提升熟练度的。

    四.Java基础系列

    1.《Java编程思想》

    这本书也是被誉为Java神书的存在了,但是对新手不友好,适合有些基础再看,当然要选择性地看。我当时大概只看了1/3

    2.《Java核心技术卷一》

    这本书还是比较适合入门的,当然,这种厚皮书要看完还是很有难度的,不过比起上面那本要简单一些

    五.Java进阶系列

    1.《深入理解JVM虚拟机》

    这本书是Java开发者必须看的书,很多jvm的文章都是提取这本书的内容。JVM是Java虚拟机,赋予了Java程序生命,所以好好看看把,我自己就已经看了三遍了。

    2.《Java并发编程实战》

    这本书是Java 并发包作者写的书,所以非常权威,但是比较晦涩难懂,我看的云里雾里的,大家可以按需选择。

    3.《Java并发编程艺术》

    这本书是国内作者写的Java并发书籍,比上面那一本更简单易懂,适合作为并发编程的入门书籍,当然,学习并发原理之前,还是先把Java的多线程搞懂吧。

    4.《Effective Java》

    这本书和Java编程思想一样被称为神书,主要讲的是Java的一些优化技巧和规范,没有一定开发经验的人看这本书会觉得索然无味,不知所云,所以,先搁着吧。

    5.《Java性能调优指南》

    说到JVM调优,可能会有很多的面试题浮现在你的脑海里,这本书比较权威地讲解了Java的性能调优方法,不过我还没怎么看,有空好好看看。

    6.《 Netty权威指南》

    Netty是基于NIO开发的网络编程框架,使用Java代码编程,其实这本书也可以放在网络或者Java Web部分。不过NIO属于JDK自带的一部分,是必须要掌握的,而对于Netty,大家如果学有余力的话也可以看看。

    六.JavaWeb系列

    1.《深入JavaWeb技术内幕》

    这本书是Java Web的集大成之作,涵盖了大部分Java Web开发的知识点,不过一本书显然无法把所有细节都讲完,但是作为Java Web的入门或者进阶书籍来看的话还是很不错的。

    2.《How Tomcat Works》

    Java Web很重要的一部分内容就是Tomcat,作为应用服务器,Tomcat使用Java开发,其源代码和架构设计都是经典之作。

    这是一本讲解Tomcat基本原理的书籍,很好地通过剖析源码来讲解Tomcat的内部结构和运行机制,但是需要一定的基础才能够看懂,我还没看这本书,日后再拜读。

    2.《Tomcat架构解析》

    和上面这本书类似,主要讲解Tomcat原理和架构,,要看懂这本书的话,前提是你要对Java基础,NIO以及设计模式有所了解。这本书我也还没看。

    3.《Spring实战》

    这本书适合作为Spring的入门书籍,把Spring的概念,使用方式等内容都讲的比较清楚。并且也介绍了Spring MVC的部分内容,Spring框架还是更注重实践的,所以跟着书上的内容去做吧。

    4.《Spring源码深度解析》

    学会Spring基础后,可以花点时间看看这本讲源码的书了,这本书对于新手来说不太友好,主要也是因为Spring的代码结构比较复杂,大家也可以看一些博客来完成对源码的学习。

    5.《Spring MVC学习指南》

    本书是一本Spring MVC的教程,内容细致、讲解清晰,非常适合Web开发者和想要使用Spring MVC开发基于Java的Web应用的读者阅读。但是由于出的比较早,所以不太适合现在版本。

    6.《Maven实战》

    Maven是Java Web开发中不可缺少的一部分,如果想要全面了解其实现原理的话,可以看看这本书。

    七.数据库系列

    1.《数据库原理》

    数据库原理应该是教材吧,这本书作为数据库入门来说还是可以的,毕竟不是专门做DB的,看大厚书用处不大,这本书把数据库的基本概念都讲完了。

    2.《SQL必知必会》

    这本书主要是讲解sql语句怎么写,毕竟数据库最重要的一点就是要熟练地使用sql语句,当然这本书也可以当做工具书来使用。

    3.《深入浅出MySQL》

    这本书适合作为MySQL的学习书籍,当你有了一定的MySQL使用经验后,可以看看它,该书从数据库的基础、开发、优化、管理维护和架构5个方面对MySQL进行了详细的介绍,讲的不算特别深,但是足够我们使用了。这本书我也只看了一部分。

    4.《MySQL技术内幕:innodb存储引擎》

    看完上面那本书以后,对MySQL算是比较熟悉了,不过对于面试中常考的innodb引擎,还是推荐一下这本书把,专门讲解了innodb存储引擎的相关内容。我还没有细看,但是内容足够你学好innodb了。

    5.《高性能Mysql》

    这本书可以说是很厚了,更适合DBA拜读,讲的太详细了,打扰了。

    6.《Redis实战》

    和MySQL一样,学习Redis的第一步最好也是先实战一下,通过这本书就可以较好地掌握Redis的使用方法,以及相关数据结构了。

    7.《Redis设计与实现》

    该书全面而完整地讲解了 Redis 的内部运行机制,对 Redis 的大多数单机功能以及所有多机功能的实现原理进行了介绍。这本书把Redis的基本原理讲的一清二楚,包括数据结构,持久化,集群等内容,有空应该看看。

    八.分布式系列

    1.《分布式Java应用》

    这本书是淘宝大牛写的书,主要讲的就是使用rpc来构建分布式的Java应用,讲了很多基础的东西,可以作为入门书籍,不过这本书我之前没有遇到,所以没看过。

    2.《大型网站技术架构》

    这本淘宝系技术指南还是非常值得推崇的,可以说是把大型网站的现代架构进行了一次简单的总结,内容涵盖了各方面,主要讲的是概念,很适合没接触过架构的同学入门。看完以后你会觉得后端技术原来这么博大精深。

    3.《大型分布式网站架构设计与实践》

    这本书与上面一书相比更倾向于实践,主要讲的是分布式架构的一些解决方案,但是如果你没有接触过相关的场景,可能会看的云里雾里。

    4 .《布式服务框架原理与实践》

    上面那本书讲的是分布式架构的实践,而这本书更专注于分布式服务的原理讲解和对应实践,很好地讲述了分布式服务的基本概念,相关技术,以及解决方案等,对于想要学习分布式服务框架的同学来说是本好书。

    5.《大型网站系统与Java中间件开发实践》

    话说这些书的名字真实够长的。这本书也是阿里系出品,主要讲的是大型网站系统以及使用的相关中间件,毕竟阿里是中间件大户,所以很多中间件对应用再网站系统中,对于想学习这方面技术的同学来说可以一看。

    6.《从Paxos到Zookeeper分布式一致性原理与实践》

    说起分布式系统,我们需要了解它的原理,相关理论及技术,这本书也是从这个角度出发,讲解了分布式系统的一些常用概念,并且带出了分布式一哥zookeeper,可以说是想学分布式技术的同学必看的书籍。

    7.《大规模分布式存储系统》

    这本书是阿里巴巴oceanbase核心开发大佬写的书,讲的是分布式存储相关的原理和解决方案,该书不是很厚,如果想做存储方向的同学可以看看。

    九.云计算系列

    云计算方面的内容主要是我在实习阶段接触的,如果只是应用开发方向的话这块不懂也罢。主要还是看个人兴趣。

    1.《OpenStack设计与实现》

    OpenStack是基于KVM技术的一套私有云生态。这本书很好地讲解了OpenStack的一些基本原理,包括各个组件的设计与实现,比起另一本《OpenStack王者归来》简单易懂的多。当然,前提最好是你对Linux内核和网络有所了解。

    2.《docker入门与实践》

    docker是现在应用部署的主流方案了,所以了解一下还是挺有必要的,这本书作为入门书籍足够让你会使用docker了。

    3.《Kubenetes权威指南》

    kubenetes是docker的集群解决方案,也是一个微服务的解决方案,所以这本书涉及的内容非常多,需要有网络,操作系统以及docker相关的基础。我看这本书的时候可以说是非常晕的。

    十.大数据系列

    和云计算一样,大数据方面的内容也不算是Java后端技术栈所需要的,但是这也能为你加分,并且让你跟大数据开发的岗位沾点边,何乐而不为。

    1.《大数据技术原理与应用》

    作为大数据方面的一本教材,厦大教授写的这本书还是非常赞的,从最基础的原理方面讲解了Hadoop的生态系统,并且把每个组件的原理都讲得比较清楚,另外也加入了spark,storm等内容,可以说是大数据入门非常好的一本书了。

    2.《Hadoop实战》

    这本书很厚,我买的时候大概看了一遍,一头雾水。所以建议先看上面那本书,再来看更加进阶的书籍,否则可能就是浪费时间了。

    3.《Hadoop权威指南》

    这本书主要对Hadoop生态中组件进行详细讲解,有点太详细了,如果不是做大数据方向的话,可以不看。

    十一.其他系列

    1.《Git权威指南》

    Git是现在大公司主流的代码协同工具,如果你想要了解其底层原理,可以看看这本书。

    2.《重构——改善既有代码的设计》

    这本书主要介绍的是代码重构的一些指导思想和最佳实践。有重构需求的同学可以看看。

    3.其他的其他

    其他方面的书籍就太多了,比如软件工程方面的,测试方面,Linux方面,以及讲一些程序员自我提升的书籍,就不一一列举了,因为这部分的内容可以不归入Java后端的技术栈。

    十二.颈椎康复系列

    1.《做自己的颈椎医生》

    身体是革命的本钱。懂得人不用解释了。

    以上所有书籍,进群:606940296,免费打包下载,为防止水军,进群必须按要求回答审核问题,否则不予进群。

    展开全文
  • Java 不仅仅是一门编程语言,它还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器和大型机等各种场合...

    来自:http://wiki.jikexueyuan.com/project/java-vm/overwise.html

    概述

    Java 不仅仅是一门编程语言,它还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器和大型机等各种场合。时至今日,Java 技术体系已经吸引了近千万软件开发者,这是全球最大的软件开发团队。使用 Java 的设备多达几十亿台,其中包括 8 亿多台个人计算机、21 亿部移动电话及其他手持设备、35 亿个智能卡,以及大量机顶盒、导航系统和其他设备。

    Java 能获得如此广泛的认可,除了因为它拥有一门结构严谨、面向对象的编程语言之外,还有许多不可忽视的优点:它摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;它提供了一种相对安全的内存管理和访问机制,避免了绝大部分的内存泄漏和指针越界问题;它实现了热点代码检测和运行时编译及优化,这使得 Java 应用能随着运行时间的增加而获得更高的性能;它有一套完善的应用程序接口,还有无数的来自商业机构和开源社区的第三方类库来帮助实现各种各样的功能。Java 所带来的这些好处让程序的开发效率得到了很大的提升。作为一名Java 程序员,在编写程序时除了尽情发挥 Java 的各种优势外,还应该去了解和思考一下 Java 技术体系中这些技术是如何实现的。认清这些技术的运作本质,是自己思考“程序这样写好不好”的基础和前提。当我们在使用一门技术时,如果不再依赖书本和他人就能得到这个问题的答案,那才算升华到了“不惑”的境界。

    Java 技术体系

    站在 Java 平台的逻辑结构上来说,我们可以从下图来了解 JVM:


    以上是根据各个组成部分的功能来进行划分的,如果按照技术所服务的领域来划分,或者说按照Java技术关注的重点业务领域来划分,Java技术体系可以分为四个平台,分别为:

    • Java Card:支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。
    • Java ME(Micro Edition):支持Java程序运行在移动终端(手机、PDA)上的平台,对 Java API 有所精简,并加入了针对移动终端的支持,这个版本以前称为J2ME。
    • Java SE(Standard Edition):支持面向桌面级应用(如 Windows 下的应用程序)的 Java 平台,提供了完整的 Java 核心 API,这个版本以前称为 J2SE。
    • Java EE(Enterprise Edition):支持使用多层架构的企业应用(如 ERP、CRM 应用)的 Java 平台,除了提供 Java SE API 外,还对其做了大量的扩充并提供了相关的部署支持,这个版本以前称为 J2EE。
    对于 JVM 自身的物理结构,我们可以从下图了解:


    什么是 JVM

    JVM 是 Java 的核心和基础,在 Java 编译器和 os 平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行 Java 的字节码程序。

    Java 编译器只需面向 JVM,生成 JVM 能理解的代码或字节码文件。Java 源文件经编译器,编译成字节码程序,通过 JVM 将每一条指令翻译成不同平台机器码,通过特定平台运行。

    简单的说,JVM 就相当于一台柴油机,它只能用 Java (柴油)运行,JVM 就是 Java 的虚拟机,有了 JVM 才能运行 Java 程序


    展开全文
  • 很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识。下面就说说Java零基础学习Java编程语言基础知识的几个要点。希望能够对Java编程基础入门学习的新手有帮助。 一、先明白了解...
  • java学习过程的见解

    2020-01-20 13:34:08
    学习java以来,见过做过各种各样的项目,在和一位老师交流java学习时,有了更深层的java编码感触对于java编程我们大概会经过以下几个阶段: 面向对象 面向切面 面向抽象 面向接口 面向对象 ####面向...
  • 课程介绍 大数据环境下,数据分析已由业务驱动转变为数据驱动,网络数据...作为网络爬虫的入门教程,本达人课采用 Java 开发语言,内容涵盖了网络爬虫的原理以及开发逻辑,Java 网络爬虫基础知识,网络抓包介绍,...
  • java和C++学习路线

    2012-06-09 08:05:02
    java和c++学习路线 . 分类: C++拾遗 2011-06-29 14:49 70人阅读 评论(0) 收藏 举报 Java 专业人士必备的书籍(developerworks) 有经验的老手们用 Web 站点来跟踪行业的走势。书籍、文章和论文有助于跟上...
  • Java学习之路 一直有这么个想法,列一下我个人认为在学习和使用Java过程中可以推荐一读的书籍,给初学者或者想深入的朋友一些建议,帮助成长。推荐的的都是我自己读过,也会推荐一些朋友读过并且口碑不错的...
  • Java开发工程师一般负责后端开发,当然也有专门做Java Web的工程师,但是随着前后端的分离,越来越多的Java工程师需要往大后端方向发展。 今天我们就来介绍一下Java后端开发者的书单。 首先要感谢一下江南白衣大大...
  • C++ Java学习路线

    2017-06-22 21:12:56
    不过我个人一直认为此书带着过于强烈的C语言的痕迹,对于C++的学习未必是好事。 《The C++ Programming Language》/《C++程序设计语言》 最新版本:第三版特别版 简称TC++PL,有其他语言的丰富经验的。(也有人简称...
  • 转眼毕业多年,已经换了... 大二开始学习Java,当时不是很喜欢这个课程,一方面是接触C/C++更早,所以对更为陌生的Java本身没有多少兴趣,另外一方面是没学懂,真不是没有学所以学不懂,而是几乎手抄了一边辣么厚的...
  • 学习java重在实践

    2011-09-10 00:58:23
    首先,很高兴你能喜欢java,开始学习javajava作为现在非常流行的一门计算机语言,学好了的话,肯定会有很大的用处。  言归正传,要想学好计算机语言最重要的就是使劲上机写代码,不管是不是书上的,还是自己写的...
  • 行时需要的基本条件和许多 Java 基础类,例如,IO 类、GUI 控件类、网络类等。JRE 是提供给 普通用户使用的,如果你只想运行别人开发好的 Java 程序,那么,你的计算机上必须且只安装 JRE。 JDK(Java ...
  • Java基础 入门阶段,主要是培养Java语言的编程思想。了解Java语言的语法,书写规范等,掌握Eclipse、MyEclipse等开发工具,编写Java代码的能力。学完这个阶段你应该可进行小型应用程序开发并且可以对数据库进行基本...
  • 文章目录概述Java技术体系Java发展史Java虚拟机发展史展望Java技术的未来实战:自己编译JDK本章小结 本博客主要参考周志明老师的《深入理解Java虚拟机》第二版 读书是一种跟大神的交流。阅读《深入理解Java虚拟机...
  • 要想成为JAVA(高级)工程师肯定要学习JAVA。一般的程序员或许只知道一些JAVA的语法结构就可以应付了。但要成为JAVA(高级)工程师,您要对JAVA做比较深入的研究。您应该多研究一下JDBC、IO包、Util包、Text包、...
1 2 3 4 5 ... 20
收藏数 3,174
精华内容 1,269