第一章 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