第一章 Java概述

相关概念

1.Java规范:规定了Java的语法和功能

2.JCP(Java Community process):掌管Java规范

3.JDK(Java Development Kit):实现Java规范

- Sun JDK

- OpenJDK

- IBM JDK

- JRockit

三大分支:

1.Java SE 面向PC级应用开发

2.Java EE 面向企业级应用开发

3.Java ME 面向嵌入式应用开发

第二章 Java环境搭建和程序初体验

JDK安装

下载源-安装-配置环境变量(path、JAVA_HOME)-测试

Eclipse安装

下载安装包-解压-配置workplace-HelloWorld

Eclipse配置和调试

HelloWorld程序编写、编译和运行

1.编写:用记事本/IDE等完成代码文件(.java)编写

- 类名首字母大写,之后驼峰

- 方法名和变量名首字母小写,之后驼峰

2.编译:用JDK中javac.exe将代码(.java)编译成字节码文件(.class)

3.运行:用JRE中java.exe读入并解释字节码文件(.class),最终在JVM上运行

第三章 Java类基础知识

第一节 Java类结构和main函数

class1:

Java程序唯一入口:main——PSVM

class2:

1.Java文件必须以.java作为拓展名

2.一个Java文件可以有多个class,但只能有一个public class,且名字与文件名完全一致

class3:

1.类是Java中最基础的逻辑单位:Java项目由类组成,内容不允许游离于类以外

2.构成:成员变量/属性+成员方法/函数

第二节 基本类型和运算符

基本类型(8种)

1.boolean 布尔

2.byte 字节

3.short/int/long 短整数/整数/长整数

4.float/double 浮点数

5.char 字符

boolean:true/false

byte:

1.1 byte = 8 bits (8位)

2.存储有符号的,以二进制补码表示的整数

3.-128127(-2^72^7-1),默认:0

4.byte在大型数组中可以代替小整数,因为占用空间只有int的四分之一

5.在二进制文件读写中使用较多

6.越界左右延申

整数类型(-2(n-1)~2(n-1)-1)

1.short 16位

2.int 32位

3.long = xxxL 64位 (不加L发生隐式转换,存在int越界问题)

浮点数类型

1.float = xxxf 单精度 32位

2.double = xxx(d)双精度 64位

3.都不能用来表示很精确的数字

字符类型char:单一的16位Unicode字符

1.‘a’

2.97(ascii:‘a’)

3.‘我’

4.‘\u4e00’(‘一’,\u4e00~\u9fa5:两万多汉字)

运算符

1.+,-,*,/,%

2.&&,||,!

3.!>,>,>=,==

4.>>(右移,除以n个2),<

第三节 选择与循环结构

选择结构

1.if……case……

2.if……else……

3.if……else if……else……

4.switch……case……:满足某分支后break,最后一个分支为default

循环结构

1.while

2.do……while

3.for

第四节 自定义函数

重载:同名不同参(不能用返回值界定是否重载);重写:与父类同名同参

第四章 面向对象和类

第一节 面向对象思想

第二节 Java类和对象

对象赋值是Reference复制,而基本类型是直接值拷贝

函数内的局部变量编译时不会给默认值,需要初始化;类的成员变量编译器会给默认值,可以直接使用

第三节 构造函数

名称与类名一致,且没有返回值

无析构函数:JVM垃圾回收机制(GC)

无显式构造函数则自动创建空参构造函数

第四节 信息隐藏和this

this负责指向本类中的成员变量

第五章 继承、接口和抽象类

第一节 继承extends

单根继承:每个类只能继承自一个类

默认继承Object

super:每个子类构造函数的第一句话,都默认调用父类无参数构造函数super(),除非子类构造函数第一句是super,指定调用父类的某一个构造函数。

第二节 抽象类和接口 abstract/interface

健康类:所有方法都有实现

抽象类:成员变量+具体方法+抽象方法(有方法没实现,则一定为抽象类,子类必须全部实现,否则还是抽象类,无法实例化)

接口:所有方法都没有实现

1.类之只能extends一个类,可以implements多个接口,继承与实现可以同时

2.接口可以继承多个接口,没有实现的方法将会叠加

3.类继承接口必须全部实现,否则只能成为一个抽象类

抽象类与接口相同点:都不能被实例化,不能进行new操作

抽象类与接口不同点:

1.抽象类abstract,接口interface

2.抽象类可以有部分方法实现,接口不能有实现

3.一个类只能继承自一个类,实现多个接口

4.接口可继承多个接口

5.抽象类有构造函数,接口没有构造函数

6.抽象类可以有main,可运行,接口没有main

7.抽象类方法可以有private/protected,接口都是public

第三节 转型、多态和契约设计

转型

1.变量支持互相转化

2.类型可以转型,但只有子类转换成父类(从大变小)除非这个父类本身就是从子类转化过来的

多态

1.overload重载,类内部的多态性,同名不同参

2.override重写,子类与父类的多态性,同名同参,子类的方法替换掉父类的方法

3.多态的作用:1、以统一的接口来操纵某一类中不同的对象的动态行为;2、对象之间的解耦

契约设计

1.接口定义了方法的名称、参数和返回值,规范了派生类的行为

2.基于接口,利用转型和多态,不影响真正方法的调用,成功将调用类和被调用类解耦

第六章 static、final和常量设计

第一节 static

可作用于:变量/方法/类/匿名方法快

静态变量:依靠类存在,在内存中只有一个,会随着实例的赋值而改变,多次对实例赋值只能保留最后一个

静态方法:只能调用静态变量,通过实例访问静态方法汇报warning

静态代码块:static{……}类加载时执行一次(第二次实例该类是静态代码块不执行):static代码块>匿名代码块>构造函数

第二节 单例模式

限定某一个类在程序运行中只能有一个实例对象存在

实现

1.采用static来共享对象实例

2.采用private构造函数,防止外界new操作

构建:在类内用private static创建类实例,private修饰构造函数

第三节 final

可用于:类/方法/变量

final类:不能被继承

final方法:子类不能改写此方法

final变量:不能被再次赋值:

1.基本变量不能修改其值

2.对象实例不能修改其指针,但可以修改其值

第四节 常量设计和常量池

public static final

1.不能修改 final

2.不会修改/只读/只要一份 static

3.方便访问 public

接口定义的变量默认为常量

常量池:相同的值只存储一份,节省内存

1.Float,Double没有缓存;Boolean:true,false;Character:0127;其他:-128127

2.常量字符串遵循常量池缓存机制,字符串常量拼接在编译期间优化,.class文件中指向常量池中拼接后的常量

3.基本类型的包装类和字符串的创建方式

- 字面量赋值创建,放在栈内存,会被常量化(栈内存读取快容量小)

- new对象进行创建,放在堆内存,不会被常量化(堆内存读取慢容量大)

Integer包装类型执行运算以及和基本类型比较会自动拆箱,则基本类型与基本类型表达式的比较两边都会拆箱

String常量的表达式编译器会优化,可在常量池中找到,含变量和new的表达式不会优化

第五节 不可变对象和字符串

不可变对象,也是传指针,有String,8大包装类,BigInteger,BigDecimal

由于不可变,临时变量指向新内存,外部实参的指针不改动

创建不可变对象:

1.所有属性都是final和private的

2.不提供setter方法

3.类或者所有方法都是final

4.如类中含mutable(可变)对象,返回拷贝需要深度clone

优点:

1.只读,线程安全

2.并发读,提高性能

3.可以重复使用

缺点:制造垃圾,浪费空间。修改需要开辟新的空间,旧的被搁置

String

1.内容比较:equals;指向比较:==

2.不可修改,创建新对象会搁置原字符串,效率差

3.StringBuffer(同步,线程安全,修改快速)和StringBuilder(不同步,线程不安全,修改更快)对象是可变对象,效率极高

第七章 package、import和classpath

第一节package和import

package:第一行

import:同名报错

第二节 jar文件导出和导入

jar文件:一组class文件的压缩包

优势:

1.可包含多个class,比多层目录更简洁

2.压缩后只有一个文件,下载传播方便

3.只包含class,无java文件,保护源文件(反编译、混淆器)

4.可规定版本号,方便版本控制

第三节 package和 import—命令行

命令行进行编译和运行 javac、Java -classpath “……子路径(文件夹路径/jar)” 类全名

第四节 Java访问权限

访问权限种类:

1.private:私有的,只能本类访问

2.default(不用写):同一个包内访问

3.protected:同一个包,子类均可访问

4.public:公开,所有类可访问

访问权限.png

通常:成员变量private修饰,成员方法public修饰,通过方法访问变量,满足基本的信息隐藏。

第八章 Java常用类

第一节 Java类库概述

java 核心包

javax 扩展包

第二节 数字相关类

整数:Short,Int,Long

浮点数:Float,Double

大数类:尽量用字符串对BigDecimal赋值

随机数类:Random

1.nextInt()返回随机int

2.nextInt(int a)返回0~a间的随机int

3.nextDouble()返回一个0.0~1.0的double

4.ints批量返回随机数数组

5.Math.random()

工具类:Math

第三节 字符串相关类

String

1.不可变对象,加减操作性能较差

2.String类的方法:charAt,concat(连接一个字符串并返回,但a值不变),contains,endsWith,equals,equalsIgnoreCase(忽略大小写的情况下判断相等),hashCode,indexOf,length,matches,replace,replaceAll,split,startsWith,subString(截取),trim(去除前后空格,中间空格不去,a的值不变),valueOf

StringBuilder(同步)/StringBuffer(不同步)

1.性能好,方法一样,区别在是否同步

2.方法:append(末尾添加),insert,delete,replace,substring,length(字符串实际大小),capacity(字符串占用空间大小,不够时,+1*2,加了还不够,重新定义空间大小),trimToSize(去除空隙,将字符串存储压缩到实际大小)

第四节 时间相关类

java.util.Date

java.sql.Date:和数据库对应的事件类

Calendar

1.getInstance()返回GregorianCalendar()实例

2.方法:get(Field),获取时间中某个属性的值,注意,月份0-11;getTime(),返回相应的Date对象;getTimeInMillis(返回自1970.1.1以来的毫秒数);set(Field)设置时间字段;add、roll(field,amount),根据指定字段增加减少时间(roll不影响上一级的时间段,不进位)

Java 8 java.time包

1.LocalDate:日期类

2.LocalTime:时间类

3.LocalDateTime:LocalDate+LocalTime

4.instant:时间戳

第五节 格式化相关类

NumberFormat:数字格式化,抽象类

MessageFormat:字符串格式化

DateFormat:日期/时间格式化,抽象类

第九章 Java异常和异常处理

第一节 Java异常分类

异常:程序不正常的行为或状态

1.除数为0

2.数组越界

3.读取不存在文件等

异常处理:

1.程序返回到安全状态

2.允许用户保存结果,并以适当方式关闭程序

异常类

1.Throwable:所有错误的祖先

2.Error(Unchecked):系统内部错误或资源耗尽。不管

3.Exception:程序相关的异常

- RuntimeException(Unchecked):程序自身错误,除数为零、空指针、数据越界等

- 非RuntimeException(IOException为主)(checked):外界相关错误,打开不存在的文件、加载不存在的类等

异常类.png

第二节 Java异常处理

允许用户及时保存结果;抓住异常,分析异常内容;控制程序返回到安全状态

try-catch-finally:一种保护代码正常运行的机制

1.try必须有,catch和finally至少有一个

2.try:正常业务逻辑代码;catch:try发生异常时执行,可以有多个且有不同的入口形参;finally:try或catch执行结束后执行

3.catch发生异常会先执行finally,再报告catch的异常

4.try的异常会从上到下匹配catch形参,因此catch异常类型要从小到大排列,只会进入一个catch,之后不会返回try也不会进入其他catch

5.可包含不可嵌套

throws:无法处理的异常可以throws声明异常,调用带有throws异常的方法,要么处理异常,要么继续向外声明throws,直到main。示例如下:

throws异常.png

方法被覆盖,覆盖他的方法必须抛出相同的异常或异常的子类,若父类方法抛出多个异常,子类必须抛异常的子集,即不能抛出新的异常

第三节 自定义异常

需继承exception类或其子类

1.继承自Exception,则Checked

2.继承自RuntimeException,则Unchecked

构造函数

1.调用父类Exception的message构造函数

2.自定义成员变量

在程序中采用throws主动抛出异常

第十章 Java数据结构

第一节 数组

数组是一个可存放多个数据的容器

1.数据是同一种类型

2.所有数据是现行规则排列

3.可通过位置索引来快速定位访问数据

4.需明确容器的长度

定义和初始化

1.int a[ ]

2.int[ ] b

3.int[ ] c = new int[2]

4.注意声明变量时没有分配内存,不需要指定大小,如int e[5];int[5] f;

数组索引:0~length-1

数组遍历

1.for(;;)

1.for(element :d)

第二节 JCF、

容器框架:为表示和操作容器而规定的一种标准体系结构

1.对外的接口:容器所能存放的抽象数据类型

2.接口的实现:可复用的数据结构

3.算法:对数据的查找和排序

接口

1.JCF的集合接口:Collection:add,contains,remove,size,iterator

2.JCF的迭代器接口:Iterator:hasNext,next,remove

实现类

1.列表:List

2.集合:Set

3.映射:Map

算法类

1.Arrays:对数组进行查找和排序

2.Collections:对Collection及其子类进行排序和查找

第三节 列表List

List:有序的Collection,允许重复元素,可嵌套。主要实现:ArrayList(非同步),LinkedList(非同步),Vector(同步)

ArrayList

1.以数组实现的列表,不支持同步

2.利用索引位置可以快速定位访问

3.不适合指定位置插入、删除操作

4.适合变动不大,主要用于查询的数据

5.与数组相比,容量是可动态调整的

6.容器填满时自动扩充50%

7.遍历方法:迭代器(最慢)、位置索引、for-each

LinkedList

1.以双向链表实现的列表,不支持同步

2.可以被当作堆栈、队列和双端队列进行操作

3.顺序访问高效,随机访问较差,中间插入和删除高效

4.适用于经常变化的数据

5.遍历方法:迭代器、位置索引(最慢)、for-each

Vector

1.和ArrayList类似以数组实现

2.Vector同步,适合在多线程下使用

3.遍历方法:迭代器(慢),位置索引,for-each,Enumeration(慢)

第四节 集合Set

特点

1.确定性:对任意对象都能判定其是否属于某一个集合

2.互异性:集合内每个元素都是不相同的,注意是内容互异(与内存地址无关)

3.无序性:集合内的顺序无关

HashSet(基于散列函数的集合,无序,不同步)

1.基于HashMap实现,可容纳null,不支持同步,同步使用synchronizedSet方法

2.方法:add:添加一个元素;clear:清除整个HashSet;contains:判定是否包含一个元素;remove:删除一个元素;size:大小;retainAll:计算两个集合交集

3.遍历方法:iterator,for-each(荐)

LinkedHashSet(基于散列函数和双向链表得集合,可排序的(插入顺序),不支持同步)

1.继承自HashSet,基于HashMap实现,容纳null元素

2.不支持同步,Collections.synchronizedSet

3.方法与HashSet基本一致

4.通过双向链表维护插入顺序,遍历与插入顺序一致

TreeSet(基于树结构的集合,可排序(大小顺序),不同步)

1.基于TreeMap实现,不容纳null元素,不同步

2.方法与HashSet一致

3.根据compareTo方法或指定Comparator排序

HashSet(基于HashMap实现,可容纳null,不同步)

1.建议用foreach循环遍历

LinkedHashSet(继承HashSet,通过双向链表保留了插入顺序)

xxxSet元素只能是对象,Integer而不是int

HashSet和LinkedHashSet判断元素重复:首先判断hashcode返回值是否相同,若相同再判断equals方法(不判断compareTo方法)

TreeSet判断元素重复:需要元素继承自Comparable,并比较compareTo方法

equals()、hashCode()、toString()三位一体,返回结果应该相同即同时改写

运用TreeSet的条件:其元素必须实现Comparable接口,必要时改写compareTo方法判断重复

第五节 映射Map

数学定义:两个集合之间的元素对应关系

实现类:Hashtable、HashMap、Properties

Hashtable方法.png

Map类遍历方法.png

Map遍历顺序.png

Hashtable:

1.K-V对,kv都不允许为null

2.同步,多线程安全

3.无序

4.适合小数据量

HashMap

1.K-V对,允许为null

2.不同步,线程不安全

3.无序

4.key没有Enumeration方法

LinkedHashMap

基于双向链表的维持插入顺序的HashMap

TreeMap

基于红黑树的Map,可以根据key的自然排序或者compareT方法进行排序输出

Properties

1.继承自Hashtable

2.可以将K-V对保存在文件中

3.适用于数据量少的配置文件

4.从文件加载的load方法,写入到文件中的store方法

5.获取属性getProperty,设置属性setProperty

Properties方法.png

第六节 工具类

JCF工具类:不存储数据,而是在数据容器上实现高效操作:排序搜索

Arrays:处理数组

1.排序:sort

2.查找:binarySearch(二分查找)

3.批量拷贝:copyOf

4.批量赋值:fill

5.等价性比较:equals

包装器类Collections:处理对象是Collection及其子类

1.排序(对象要实现Comparable接口/新建Comparator作为比较器和比较对象一起传给sort方法):sort

2.搜索:binarySearch

3.批量赋值:fill

4.最大、最小:max,min

5.反序:reverse

第十一章 Java文件读写

第一节 文件系统及Java文件基本操作

文件系统和Java进程是平行的,是两套系统;文件包括文件内容和文件基本属性

Java文件类File(java.io.File),会受到OS的权限限制

注意:File类不涉及具体文件内容,只涉及属性

File类方法.png

NIO包:Path,Files,DirectoryStream,FileVisitor,FileSystem。是java.io.File的有益补充

第二节 java io包概述

java读写文件,只能以数据流的形式读写

java.io

1.节点类:直接对文件进行读写

2.包装类:辅助工作

- 转化类:字节/字符/数据类型的转化类

- 装饰类:装饰节点类

文件是以字节保存,因此程序将变量保存到文件需要转化

节点类:直接操作文件类

1.InputStream,OutputStream(字节):java文件

2.Reader,Writer(字符)

转换类:字符到字节之前的转化

1.InputStreamReader:文件读取字节时,转化为java能理解的字符

2.OutputStreamWriter:java将字符转化为字节输入到文件中

装饰类:装饰节点类

1.DataInputStream,DataOutputStream:封装数据流

2.BufferedInputStream:缓存字节流

3.BufferedReader:缓存字符流

第三节 文本文件读写

文件类型:

1.一般文本文件 .txt

2.一般二进制文件 .dat

3.带特殊格式的文本文件 .xml

4.带特殊格式的二进制文件

写文件

1.创建,写入,关闭

2.FileOutputStream,OutputStreamWriter,BufferedWriter(write,newLine)

3.try-resource 自动关闭资源

4.关闭最外层的数据流,将会把其上所有的数据流关闭

写文本文件.png

写文本文件代码.png

写文本文件2.png

读文件

1.打开,逐行读入数据,关闭

2.FileInputStream,InputStreamReader,BufferedReader(readLine)

3.try-resource 自动关闭资源

4.关闭最外层的数据流,将会把其上所有的数据流关闭

第四节 二进制文件读写

二进制文件:采用字节编码,非字符编码;广义上一切文件都是二进制文件;记事本无法打开/读取

写文件

1.创建,写入,关闭

2.FileOutputStream,BufferedOutputStream,DataOutputStream(flush,write/writeBoolean/writeInt/writeChars...)

3.try-resource 自动关闭资源

4.关闭最外层的数据流,将会把其上所有的数据流关闭

写二进制文件.png

写二进制文件代码.png

读文件

1.打开,读入数据,关闭

2.FileInputStream,BufferedInputStream,DataInputStream(read/readBoolean/readChar/readInt/...)

3.try-resource 自动关闭资源

4.关闭最外层的数据流,将会把其上所有的数据流关闭

读二进制文件代码2.png

第五节 Zip文件读写

Java zip支持包支持Zip和Gzip包的压缩和解压

zip文件操作类:java.util.zip包

1.java.io.InputStream,java.io.OutputStream的子类

2.ZipInputStream,ZipOutputStream压缩文件输入/输出流

3.ZipEntry压缩项

压缩

1.打开输入的zip文件

2.添加一个ZipEntry

3.打开一个输入文件,读数据,向ZipEntry写数据,关闭输入文件

4.重复23,写入多个文件到zip文件中

5.关闭zip文件

压缩单个文件代码.png

压缩多个文件代码(上).png

压缩多个文件代码(下).png

解压

1.打开输入的zip文件

2.获取下一个ZipEntry

3.新建目标文件,从ZipEntry读数据,向目标文件写数据,关闭目标文件

4.重复23,从zip包中读取数据到多个目标文件

5.关闭zip文件

解压单个文件代码.png

解压多个文件代码(上).png

解压多个文件代码(中).png

解压多个文件代码(下).png