Java基础学习经验分享
很多人学习Java,尤其是自学的人,在学习的过程中会遇到各种各样的问题以及难点,有时候卡在一个点上可能需要很长时间,因为你在自学的过程中不知道如何去掌握和灵活运用以及该注意的点。下面我整理了新手学习可能会出现的问题。
Java8在线API参考文档:https://docs.oracle.com/javase/8/docs/api/
从配置JDK开始
很多人在这块通过会遇到一些问题,照着视频配置了,但输入java和javac命令还是没有反应,没有打印java相关的信息。注意点有下:
- 配置环境变量 JAVA_HOME(JAVA_HOME配置的路径为你JDK安装的目录,例如 D:/java8)
- 配置JRE环境变量 JRE_HOME (JRE_HOME配置路径为你JDK安装目录下面的jre目录,例如:D:/java8/jre)
- 配置环境变量path,格式为 %JAVA_HOME%\bin;%JRE_HOME%\bin;
以上是需要注意点。如果你配置的和以上一致,应该是不会出问题的。
Java8的下载链接:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
从第一个Hello World开始
配置好环境变量后就开始了第一个HelloWorld,很多视频第一讲都是用记事本写的,用javac编译和java命令去运行,其实这样一来很在很大程度造成一定的错误,记事本会出现很多问题,没有代码语法提示,写错了也不知道,如果会用编辑器,建议去用编辑器。如果不会用,跟着视频一步一步来也没有关系,一步一个脚印,走向巅峰。学习到这块应该理解javac和java命令运行的原理。
- 程序的运行都是从main函数的
- main函数是程序的入口
- main函数只能在含有public修饰的class类中
- 一个类中只能包含一个public修饰的class类
从Java的语法变量开始
每个编程语言都有对应的语法要求,Java也不例外,相对于其他的,Java学习起来也不难。学习这块主要理解各种数据类型的最大值和最小值是多少,长度是多少,每种数据类型都有什么用处。我们来看一下Java里边对应的数据类型有那些。
- int(4字节) 包装类型 Integer
- byte(1字节) 包装类型 Byte
- short(2字节)包装类型 Short
- long(8字节) 包装类型 Long
- float(4字节) 包装类型 Float
- char(2字节) 包装类型 Character
- boolean(未定)包装类型 Boolean //boolean有些说法是1个字节,有些说法是2个字节
掌握好数据类型后学习如何定义类型变量,以及变量的使用。学习Java中的常量。
从一个注释开始
任何编程语言都有自己独有的注释风格,但是多多数注释格式都是通用的,Java里边常用的注释有如下几种:
/**
* 这种我们称为类注释
* 在类上面写
*/
public class Main(){
/**
* 这种注释我们称为字段注释
*/
private String username;
//这种我们成为单行注释
public String password;
/**
* 这里是方法注释,写在方法按上面
*
*/
public static void main(String[] args){
}
}
从一个运算符和表达式开始
运算符在很多编程语言里边都存在,而且大多数都是相通的,用的最多的有+、-、*、/、++、--等。
表达式这块也比较简单,,表达式是由变量或常量与符号的组合,比如 2+2 > 3 这就是一个表达式,如果成立是true,否则为false,与之对应的还有三元表达式。3 > 2 ?1 : 5 意思是3如果大于2,就返回1,否则就返回5。
运算符和表达式这块需要多练习,多做题,加深理解,熟能生巧。
位运算是什么?
位运算在很多编程语言里边都是存在的,这块也是计算机基础里边讲的比较多的。学习应该注意如下:
- 左移 代表 乘法
- 右移 代表 除法
- 位移的原理什么
- 补码和反码怎么运算
- 位移运算的一般用途
掌握好以上几点就可以了。
开发神器 Eclipse
Eclipse可以说Java开发的必备工具,当然还有MyEclipse和NetBeans,近几年又出来一个比较火的Idea,用的人也是很多的,占用市场份额非常大。但是我还是推荐用Eclipse,这个工具简洁简单,占用系统内存不大,很轻巧的一款工具。Eclipse使用也非常简单,这里建议大家下载最新的zip包,解压后直接就能用,如果下载安装版本,安装过程会比较长,而且还得你电脑网速好,这个是eclipse zip包的下载链接:http://mirror.kakao.com/eclipse/technology/epp/downloads/release/2019-03/R/eclipse-jee-2019-03-R-win32-x86_64.zip,eclipse的使用教程网上有很多,这里不在整理,如果你在看视频,相信视频里也会做一个详细的讲解。有些人在这块可能遇到各种各样的问题,从网上下载下来后打不开,双击会报一些错误,这种情况的原因有很多种:
- 版本不一致,系统是32位的,下载的是64位版本。上面的链接是32和64位都可以用
- JRE_HOME和JAVA_HOME没有配置,再次给大家强调,配置环境变量都是大写,并且两个都要配置,不然有些时候会出问题,具体见上面配置JDK
以上两点就是容易出问题的所在,大多数是因为环境变量没有配置正确或者配置少了而导致的。
大家在使用Eclipse创建项目的时候把项目编码一定要改成UTF-8,创建项目后第一步就是先修改项目编码,这点非常重要。
从条件语句开始
所谓的条件语句就是判断语句,java里边常用的判断语句有:
- if(表达式){}
- if(表达式){}else{}
- if(表达式){}else if(表达式){}else{}
- switch
以上就是Java里边比较常用的,这块需要多练习,多掌握,孰能生巧,特别需要注意的是if里边的表达式可以是多个,也可以是一个。这块需要加深理解。
从循环开始
循环可以干很多事,基本上只要是写程序,百分之八十都离不开循环,那么学习循环主要有应该学习那些呢,
- for 循环,for循环是用的比较多的,主要掌握的情况有for(;i<10;i++)、for(;;;){}、for(int i=0;i<10;i++)这三种情况
- while循环,while循环一般用作死循环,这块用的也是比较多的
- do while循环 这个是先执行,在判断,想对来说他的使用频率没有for和while循环用的多,这个只是个人感受
- continue 关键字的使用,他的意思是跳过本次循环
- break 关键字的使用,意思是跳出本轮循环
从命名开始
类、包、方法、字段的命名可谓是大有学问,命名一定要见名知意,这块也是比较重要,是属于门面的东西,具体可以看我这篇文章 https://blog.csdn.net/qq_24434671/article/details/88532596 里边有详细的对命名的一些规范。
从数组开始
数据可以说是任何编程语言都固有的一个结构类型,用途可谓是非常广。用的也比较多,学到这块应该学的内容有如下:
- 一维数组的创建和遍历
- 二维数组或多维数组的创建和理解以及遍历
- 数组排序问题
- 对数组的操作
- 防止数据越界,加深理解这块
面向对象 重点中的难点
面向对象是很多初学者很头疼的一个问题,里边的多态集成向上转型或者向下转型这些多有些人来说是非常难以理解的。
我们来看看什么是面向特性,面向对象的特性一共有四个:
- 抽象
- 封装
- 继承
- 多态
下面我们具体来说说
抽象
抽象可以分为过程抽象和数据抽象
- 数据抽象 --> 表示世界中一类事物的特征,就是对象的属性.比如鸟有翅膀,羽毛等(类的属性)
- 过程抽象 --> 表示世界中一类事物的行为,就是对象的行为.比如鸟会飞,会叫(类的方法)
封装
封装就是把过程和数据包围起来,对数据的访问只能通过特定的界面.如私有变量,用set,get方法获取
继承
一种联结类的层次模型,并且允许和鼓励类的重用,提供一种明确表达共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),原始类称为新类的基类(父类).派生类可以从它的父类哪里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要.因此可以说,继承为了重用父类代码,同时为实现多态性作准备.
多态
多态是指允许不同类的对象对同一消息做出响应.多态性包括参数化多态性和包含多态性.多态性语言具有灵活/抽象/行为共享/代码共享的优势,很好的解决了应用程序函数同名问题.总的来说,方法的重写,重载与动态链接构成多态性.java引入多态的概念原因之一就是弥补类的单继承带来的功能不足.
动态链接 -->对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将调用子类中的这个方法,这就是动态链接
Java是一门面向对象(OOP)的编程语言,但是与之对应的我们知道有的是面向过程(POP)的编程语言。那么这两种有什么不同之处呢。
面向对象(OOP)
面向对象pop(Process-oriented programming)的缩写,“面向过程”是一种是事件为中心的编程思想。就是分析出解决问题所需的步骤,然后用函数把这写步骤实现,并按顺序调用。
面向过程(POP)
面向过程oop(Object Oriented Programming)的缩写面向对象:用线性的思维。与面向过程相辅相成。在软件开发过程中,宏观上,用面向对象来把握事物间复杂的关系,分析系统。微观上,仍然使用面向过程。”面向对象“是以“对象”为中心的编程思想。
学习面向对象这块应该注意和需要学习的点有如下:
- Java中的成员变量与局部变量的作用域、使用、和定义
- Java中this的关键字
- 子父类方法的执行顺序
- 构造函数,子类能否重写否类的构造方法
- 静态方法和成员方法的区别
- 多态中的向上转型和向下转型
- 抽象类和接口的区别
- Java里边的单继承和多实现
- == 和 equls 的区别
- hashCode()和equals()
- 了解Java的23种设计模式
- 重载和重写的区别
- 如何调用父父类的方法,如何调用父类的构造函数
以上就是学习javase这块比较重要的又需要掌握的知识点。
理解什么是接口
接口单独拿出来说一下,因为他也是非常重要的,接口的关键字是interface,下面我们来看学习接口应该注意是什么?
- 接口里边能否写方法体?
- JDK8之前和JDK8版本的接口有什么变化?
- 接口能够被哪些类实现?
- 接口的方法被继承类能否不实现?
- 接口和抽象楼有什么区别没?
- 接口中默认省略了哪些关键字?
- 接口方法的作用范围
学习接口掌握好以上几点就行了。后面在慢慢的深入了解。
从内部类开始
说到内部类,很多人可能会觉得熟悉而又陌生,内部类平时用到的场景不多,用得最多的是在有事件监听的情况下。下面我们来看看什么是内部类,在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:
- 成员内部类
- 匿名内部类
- 静态内部类
- 局部内部类
下面我来看下对应的具体的代码实现:
//1、成员内部类
class Person {
private String username = "";
public static int pw = "12";
public Person(String username){
this.username = username;
}
}
class Stu {
public void getStuName(){
System.out.println(username); //外部类的private成员
System.out.println(pw); //外部类的静态成员
}
}
/*
类Stu像是类Person的一个成员,Person称为外部类。
成员内部类可以无条件访问外部类的所有成员属性和成
员方法(包括private成员和静态成员)。
不过要注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,
会发生隐藏现象,即默认情况下访问的是成员内部类的成员。
如果要访问外部类的同名成员,需要以下面的形式进行访问:
外部类.this.成员变量
外部类.this.成员方法
外部类如果要访问内部类的话就必须new内部类的对象来调用
*/
=================================================================================
//2、局部内部类
class Person{
public Person(){}
}
class Test{
public Test(){}
public People getP(){
class P extends Person{
String name = "xx";
}
return new P();
}
}
/*
注意,局部内部类就像是方法里面的一个局部变量一样,
是不能有public、protected、private以及static修饰符的。
局部内部类是定义在一个方法或者一个作用域里面的类,
它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内
*/
=================================================================================
//3.匿名内部类
bt.setOnClickListener(new OnClickListener(){
public void onClick(View v){}
})
/*
匿名内部类应该是平时我们编写代码时用得最多的,
在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。
匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,
所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。
匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,
匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,
只是对继承方法的实现或是重写
*/
=================================================================================
//4.静态内部类
class Person {
public Person(){}
static class Stu {
public Stu(){}
}
}
/*
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。
静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的
非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,
可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,
因为外部类的非static成员必须依附于具体的对象。
*/
学习内部类应该学习的问题有如下:
- 内部类使用场景
- 内部类有什么好处
- 内部类和普通类在使用上有什么不同之处
- 内部类之间的访问问题
从枚举开始
枚举这个概念在javase里边用的不多,但是在后面的学习中可以说是用的比较多的。枚举是在JDK1.5引入了新的类型,之前我们定义常量都是
public static final String CURR_USER = "username"
这种其实是不安全的,因为他是String类型的,开发者有可能传入错误的参数,这个时候就会造成一些问题。那么有了枚举,边可以很方便的解决这个问题了,而且枚举的值是可以反射得到的。这点也是最重要的。下面我们来看:
public enum Color {
RED, GREEN, BLANK, YELLOW
}
public enum Color2{
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
}
如果要用的话直接Color.RED 就可以了。枚举的写法是多样的。下面我们来看学习枚举主要应该掌握哪些:
- 如何创建一个枚举类
- 如何合理的定义里边的字段
- 掌握枚举常用的API
- 枚举类如何实现接口,实现接口有什么作用?应用在哪些场景?
- EnumSet和EnumMap 作为扩展学习
学习枚举掌握好以上的就差不多了,后面会进行更加深入的学习。
Java的常用类库(Date类)
不管是做什么,都需要获取系统的时间,那么Java也为我们提供了相应的类,就是Date类。学习Date类需要掌握:
- 首先先看看Date类有哪些构造函数,可以加深理解
- 接下来在学习Date类提供了那些API
- 如果获取年月日,如何封装一个常用的方法
Java的常用类库(Calendar类)
这个类是一个日历的类,表面意思理解,Calendar类也是比较常用的。主要用来计算日期,比如今天+180天后是什么日期。该类是个抽象类,不能直接new,得通过Calendar.getInstance();来获取他的对象。学习该类主要掌握以下点:
- 对日期的加减
- Calendar类的常用字段和方法
- 对比如期在某个日期之前还是之后
Java的常用类库(SimpleDateFormat类)
这个是java里边一个格式化日期的类,用的频率也是非常之高的。所以掌握这个也是很有必要:
- 如何把日期格式化成想要的日期类型
- 如何把字符串格式的日期转成日期类型
SimpleDateFormat其实主要的就是这两个方法,掌握好就行
Java的常用类库(StringBuilder类和StringBuffer类)
StringBuilder和StringBuffer在字符串拼接方面可以说是用的比较多的,还有个String类,既然说到这里了,我们来做个对比。
首先从执行速度来说的话:
- StringBuilder > StringBuffer > String
这里可能会有人问,String为什么是最慢的一个呢?String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
知道了以上的区别那应该掌握一下点:
- StringBuffer和StringBuilder的实现原理是什么?
- 两个中哪个是线程安全的?哪个是线程不安全的?
- 掌握两个对象常用的API
StringBuffer和StringBuilder类用法其实并不复杂,主要弄清楚两者的区别就行,这个在面试的时候有可能被问到。
Java的常用类库(Math类)
Math类里边提供了一些常用的数学函数,都是静态方法,用的也是很多的,主要掌握有:
- Math.sqrt() 计算平方根
- Math.cbrt() 计算立方根
- Math.pow(a,b) 计算a的b次方
- Math.max(a,b) 计算最大值
- Math.min(a,b) 计算最小值
- Math.abs() 计算绝对值
- Math.ceil() 向上进1
- Math.floor() 向下取1
- Math.random() 返回一个随机数
- Math.rint(10.1) 返回一个double值,四舍五入
- Math.round(10.1) 四舍五入,float时返回int值,double时返回long值
以上就是Math类比较常用的API,熟悉掌握就好。
从解析XML文档开始
很多人可能都不知道xml是什么,我们一起来看下:
xml常用于数据存储和传输,文件后缀为 .xml;是可扩展标记语言(Extensible Markup Language,简称XML),是一种标记语言。如何定义这些标记,既可以选择国际通用的标记语言如HTML,也可以使用像XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML设计用来传送及携带数据信息,不用来表现或展示数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。而HTML语言则用来表现数据。接下来我们看下xml的格式什么?
<?xml version="1.0" encoding="UTF-8" ?>
<school>
<major id="1">
<name>计算机</name>
<date>2019-12-12</date>
<code>1211</code>
</major>
<major id="2">
<name>机械</name>
<date>2019-11-12</date>
<code>2333</code>
</major>
</school>
以上就是一个标准的xml格式的文档,顶级标签是school,school里边有专业。
那么我们在java里边如何读取xml呢,通常用四种解析工具,分别是:
- DOM解析
- SAX解析
- JDOM解析
- DOM4J解析
上面四种就是经常用来解析DOM的工具。每个工具各有利弊,大家可以去看看。四种工具中任一选择一种进行学习。
学习完应该掌握:
- 掌握XML的基本语法
- 对XML进行增删查改
- 熟练使用对应的API
对XML学习会以上三点基本上就差不多了。
从集合开始
集合可以说是java里边用的最多的一个了。说起集合就要说Collection接口了,集合的顶级接口。学习这块应该掌握如下:
- Set
- List
- Queue
以上是三大接口,都继承自Collection接口。
- ArrayList
- LinkedList
- HashSet
- TreeSet
- HashMap
- HashTable
- LinkedHashMap
- TreeMap
- Vector
- Stack
以上就是比较常用的,用的最多的是ArrayList,HashMap、主要学习有下:
- 哪些集合是线程安全的,哪些是线程不安全的
- Hash类集合有什么区别
- 哪些集合是不能有重复的,哪些集合是可以重复的
- 哪些集合是键值对形式的,哪些不是
- 什么是队列?什么是栈
- 如何遍历集合?迭代器是什么?
- 对集合如何进行增删查改
- 每个集合的特性和优缺点
- 使用场景
以上就是学习集合需要掌握的点。
从IO流开始
说起IO流,很多同学都知道,但是IO流的具体操作可能就不太清楚了,不过么有关系,JAVA程序通过流来完成输入/输出。流是生产或消费信息的抽象,流通过JAVA的输入输出与物理设备链接,尽管与它们链接的物理设备不尽相同,所有流的行为具有相同的方式。这样就意味一个输入流能够抽象多种不同类型的输入:从磁盘文件、从键盘或从网络套接字;同样,一个输出流可以输出到控制台、磁盘文件或相连的网络。下面我们来看:
IO流分为:
- 字节流
- 字符流
字节流
Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流。InputStream类与OutputStream类均为抽象类,我们在实际使用中通常使用Java类库中提供的它们的一系列子类。
字符流
Java中的字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据。所谓Unicode码元,也就是一个Unicode代码单元,范围是0x0000~0xFFFF。在以上范围内的每个数字都与一个字符相对应,Java中的String类型默认就把字符以Unicode规则编码而后存储在内存中。然而与存储在内存中不同,存储在磁盘上的数据通常有着各种各样的编码方式。使用不同的编码方式,相同的字符会有不同的二进制表示。
另外还有一个缓冲流,缓冲流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装。当对文件或其他目标频繁读写或操作效率低,效能差。这时使用缓冲流能够更高效的读写信息。因为缓冲流先将数据缓存起来,然后一起写入或读取出来。所以说,缓冲流还是很重要的,在IO操作时记得加上缓冲流提升性能。
那么我们应该来学习的与InputStream相关的流有:
- InputStream 接口
- ByteArrayInputStream
- FileInputStream
- ObjectInputStream
- SequenceInputStream
- StringBufferInputStream
- DataInputStream
- BufferedInputStream
与OutputStream相关的有
- ByteArrayOutputStream
- FileOutputStream
- ObjectOutputStream
- SequenceOutputStream
- StringBufferOutputStream
- DataOutputStream
- BufferedOutputStream
其他流:
- PrintStream
- PrintWriter
- StringWriter
- StringReader
- InputStreamReader
- OutputStreamReader
- CharArrayReader
- CharArrayWriter
- BufferedReader
- BufferedWriter
想要加深学习的可以自己看看:
- Console
- FileDescriptor
- PipedReader
- PipedWriter
以上只是个人建议需要学习掌握的知识点,不是全部的。
从多线程开始
说到线程,很多人都会想到高并发。那么学习多线程该学习那些东西呢,我们来看:
- Runnable接口
- Callable接口
- 上面两个接口有什么不同
- Exectors 创建线程的各个API
- Thread类学习,线程的API学习
- 多线程通信问题
我们都知道线程有两种方式,一种是继承Thread类,一种是实现Runnable接口,一般来说继承Thread,不适合资源共享。实现Runnable接口的话,很容易实现资源共享。实现Runnable接口的主要优势有:
- 适合多个相同的程序代码的线程去处理同一个资源
- 可以避免java中的单继承限制
- 增加程序的健壮性,代码可以被多个线程共享,代码和数独独立
- 线程池只能放入实现Rnnnable或Callable类线程,不能直接放入继承Thread的类
程序的main方法其实也是一个线程。在java中所有的线程几乎是同时启动的,至于什么时候,哪个先执行。完全要看谁先得到CPU的资源,在java中,每次程序启动至少启动2个线程,一个是mian线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM实习在就是在操作系统中启动了一个进程。
线程的状态有如下几种:
- 新建状态(New):新创建一个线程对象
- 就绪状态(Runnable):创建线程后,其他线程调用了该对象的start()方法,该线程位于线程池中变得可运行,等待获取CPU资源
- 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码
- 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。(等待阻塞、同步阻塞、其他阻塞)
- 死亡状态(Dead):线程执行完了或者因为异常退出了run()方法,该线程的生命周期结束。
线程中常用的一些API有:
- sleep():强迫一个线程睡眠N毫秒
- isAlive():判断一个线程是否存活
- join():等待线程终止
- activeCount():程序中活跃的线程数
- enumerate():枚举程序中的线程
- cruuentThread():得到当前线程
- isDaemon():一个线程是否为守护线程
- setDaemon():设置一个线程为守护线程
- setName():为线程设置一个名称
- wait():强迫一个线程等待
- notify():通知一个线程继续执行
- setPriority():设置一个线程的优先级
学习多线程,还得注意以下几点:
- 死锁,造成死锁的原因有哪些?如何避免死锁
- 并发导致的错误,如何避免
- 线程泄漏,这个词可能听起来很陌生,也不好理解
- 如何合理的设置线程池的大小
- 资源竞争如何解决
以上就是学习多线程这块需要注意和必学的知识点了。
从线程池开始
看了上面的多线程,大家可能很疑惑,什么是线程池呢。线程池是一种多线程的处理机制,主要是为了减少线程的频繁创建和销毁,从而提升系统效率。学习线程池,我们应该掌握以下几点:
- 为什么要使用线程池
- 线程池的优缺点有哪些
- 线程池的使用场景
- 线程池的创建方式有几种?常用的是哪种?
- 线程池常用的有哪几种?(newFixedThreadPool、newSingleThreadExecutor等)
- 如何往线程池提交任务
- 如何关闭线程池
- 线程池的实现原理是什么?
- 线程池的状态有哪些?
- 线程池如何执行任务?
- 了解Worker类
- 异常状态如何处理?
以上就是学习线程池必须要掌握的点。
从泛型开始
泛型主要用在集合方面,例如 List<String> 、 Map<String,Object> 等,他的用途也是非常广泛的,在一定情况下保证了安全性。下面我们来看学习泛型应该学习哪些那些东西:
- 什么是泛型?
- 泛型有什么用?
- 泛型的特性有哪些?
- 什么是泛型接口?
- 什么是泛型通配符?
- 什么是泛型方法?
- 泛型方法与可变参数
- 静态方法与泛型
- 泛型的上下边界是什么?
泛型掌握好以上几点就可以了。
从正则表达式开始
正则表达式不管在哪个编程语言都有,一般大多数用来匹配电话号码或者邮箱密码强度等。学习这块应该主要掌握:
- Pattern类
- Matcher类
- PatternSyntaxException类
- 正则表达式的语法
- 正则中的原字符(这块特别重要)
- 正则的匹配规则
以上就是学习正则必须要学的。
从注解开始
注解在框架里边用的可以说是非常多,所以这块也比较重要,这块的学习曲线也非常的平缓,我们来看:
- @Target
- @Retention
- @Documented
- @Inherited
以上是4个元注解,我们应该学习掌握:
- 自定义注解
- 元注解的使用方法
- 注解实现
- 什么是类注解和方法注解以及字段注解?
- 通过反射获取注解信息
以上就是java基础阶段必学的。当然注解的学习并不止于此,但是学完上面的足够了。
从反射开始
反射这块如果不写框架基本上上是用不到的,但是对于研究框架,那反射这块是必学的,我们来看看应该学哪些:
- 理解Class类
- 理解Java的类加载机制
- 学会使用ClassLoader进行类加载
- 理解反射的机制
- 掌握Constructor、Method、Field 类的用法
- 理解并掌握动态代理
学习反射针对上面的内容应该有一个理解和编码实现。
从算法开始
Java是一门高级的编程语言,对很多算法的实现已经包装了起来,比如Arrays.sort()方法。这种就输入JDK底层给你实现了。
那么作为Java程序员到底应该不应该学习算法呢。对于程序员来说还是要学的,除非你不想进阶中高级程序员,不想当将军的士兵不是好将军。算法从另一个层面来标识了你的能力强弱,也是衡量一个程序员的标准之一。
一些常用的排序算法或者其他加密算法还是要会的,以下列举部分:
- MD5算法
- SHA加密
- 对称加密
- 非对称加密
- ......
排序算法有:
- 冒泡排序
- 堆排序
- 二分法排序
- 快速排序
- 希尔排序
- ......
以上的排序算法可以了解。
从Socket网络编程开始
很多同学学完javase,很纳闷socket是个什么鬼,其实像我们的qq,微信等都用了scoket技术。学习socket主要掌握的点如下:
- 网路基础的知识
- TCP/IP协议栈以及OSI参考模型(这个不是计算机专业的学生可能不知道,可以去网上找资料看看)
- TCP/IP五层模型
- IP地址
- 端口
- Socket套接字
- InetAddress类
- URL类
- ......
以上是学习这块必须要掌握的关键点。学习完以后理解:
- 什么是TCP?基于TCP的编程如何写?
- 什么是UDP?基于UDP的编程如何写?
- 掌握TCP和UDP编程相关的类
学习完这块内容应该具备:
- 基于TCP的客户端和服务端发送消息以及图片和文件
- 能独立完成一个基于控制台的聊天室系统
- 基于UDP的聊天室系统
学习这块应该注意:
- 多线程的优先级问题
- 是否关闭输入流和输出流
- 通过socket传输文件序列化的问题
- 端口占用问题
- 读取超时如何解决
- 判断Socket是否可用
- 异常处理
- 双向通信,发送消息以及处理消息
- 使用场景
以上就是socket通信方面该注意的点。
如果想深入学习Socket编程可以参考我这篇文章:https://blog.csdn.net/qq_24434671/article/details/89681472
从JSON开始
上面说了XML,这次说说JSON,JSON用的是非常多,主要用在HTTP RestFul接口中,大多数格式都是采用JSON格式传输的,所以掌握好这块是非常重要的。首先我们来看看JSON格式:
{
"username":"张鹏",
"password":"xxxx",
"childs":[
"小莉",
"小王"
]
}
以上就是一个标准的JSON格式,学习JSON我们需要掌握以下几点:
- JSON的格式和语法
- JSON里边数组的表示方法,对象和数组混合的表示方法
- JSON中的符号都是英文格式的
- 解析JSON的工具一般都有哪些?
- Java中和JS中如何去操作?
以上是需要注意的点,下面我来看看Java中常用的JSON解析工具都有哪些:
- org.json
- net.sf.json
- json.simple
- gjson
- jackson
- fastjson
- ......
还有其他的一些JSON库,这里不一一诺列了,每个JSON处理起来的效率和性能都不一样。具体根据项目选型
扩展库 Jsoup
Jsoup一般会用来写爬虫,如果你学过html和Jq的话,就应该对Jsoup的方法很熟悉了,可以说是一个Java版的Jq,Jsoup是用于解析HTML,首先学习Jsoup,我们应该了解如下:
- Jsoup能实现什么?
- Jsoup怎么用?
- Jsoup的主要应用类
- Jsoup的性能如何?
- Jsoup常用的API有哪些?
以上就是学习Jsoup应该掌握的内容。
从异常开始
异常贯穿着整个Java线,只要你是做Java开发的,那么你就离不开异常,下面我来看看学习异常应该掌握哪些东西:
- 什么是预定义异常?
- 什么是自定义异常?自定义异常如何定义?如何使用?
- 什么是运行时异常?
- 什么是编译时异常?
- 运行时异常和编译时异常有什么区别?
- 了解熟悉异常类的继承结构
- 什么时候该捕获异常,什么时候该抛出异常
- 异常的应用场景
以上就是学习异常该掌握的知识点。
文档未完......持续更新中
此文档为我多年工作经验的一个分享,希望对初学者有用。
有问题可以在下面评论,技术问题可以私聊我。