教材链接:https://book.douban.com/subject/11534743/
示例代码:https://pan.baidu.com/s/1EQW8Ijyqvak0vxscaMfjtg | 提取码:k3q4
第一章 初识Java
Java特点:
跨平台 | 面向对象 | 分布性 | 解释性(编译为二进制文件)
安全性 | 多线程 | 高性能
- 1.Java语言概述
- 1.1 历史:James Gosling 基于C++编写了新的语言Oak,后改名为Java
- 1.2 现状:应用广泛
- 1.3 面向对象:Java中最外部的数据类型是对象,所有元素都通过类和对象访问
- 2.JDK的下载和安装
- 3.第一个Java程序
- 编写文本源代码、编译源代码:javac filename.java
- 运行:java classname。
第二章 熟悉Eclipse开发工具
- 略,具体在 Eclipse 实操。Eclipse 对新手不太友好,汉化了
- 在 eclipse 创建了第一个项目HelloJava,工作路径默认为C:\Java\java_workspace
- 给 eclipse 安装了color theme插件
第三章 Java语言基础
1.Java程序基本结构
结构包括:包、类、main主方法、标识符、关键字、语句、注释,等;示例:
1
2
3
4
5
6
7
8
9
package Mr; //定义包
public class Example{ //创建类
static int ONE = 1; //定义类的成员变量
public static void main(String[] args){ //定义主方法
String var = "Hello"; //定义局部变量
System.out.println(ONE); //输出成员变量
System.out.println(avr); //输出局部变量
}
}
- Mr、Example、ONE、var等为标识符,由程序员自定义,也就是命名;
- package为定义包的关键字;
- public为Java程序的关键字,这里用于修饰类;class为定义类的关键字;
- static为Java程序的关键字,这里用于修饰成员变量;int为数据类型关键字;
- main是类的主方法,是Java程序的入口,main这个名称不可修改;
- String是一个类,用于创建字符串对象,这里修饰main的形参,加上[]表明是字符串数组;
- args是一个标识符,是主方法的形参数组;
- System是一个系统类,out是该类提供的一个标准输出流,println是out提供的方法;
2.标识符和关键字
- 2.1 标识符的命名规则
- 由字母、数字、下划线和
$
符号组成,第一个字符不能为数字; - Java语言使用Unicode标准字符集,最多可识别65535个字符。上述的字母可以是Unicode字符集中的任意字母,如拉丁字母,汉字,日文等;
- 由字母、数字、下划线和
- 2.2 关键字:
- int, public, this, finally, boolean, abstract, continue, float,long, short, throw, throws …
- 共四十多个
3.基本数据类型
6种数值型(byte、short、long、int、float、double),和字符型、布尔型
- 3.1 整数类型
- byte, short, int, long分别占1、2、4、8个字节的内存空间;
- 定义byte型:取值在[-128, 127]之间,否则溢出;如:
byte x = 127
- int型应用最广泛,空间不多不少;
- 示例:创建Number类,在主方法中创建不同整数类型,并输出相加结果。
- 3.2 浮点类型
- 单精度float和双精度double浮点型分别占内存空间32位和64位;
- 示例:创建SumFloatNumber类。
- 3.3 字符类型
- 使用char关键字进行声明,注意是储存单个字符,多个是字符串类型;
- 字符使用单引号,字符串使用双引号;
- 示例:创建Export类。
- 3.4 布尔类型
- 只有true和false两个取值,如:
boolean b1 = true, b2 = false
。
- 只有true和false两个取值,如:
4.变量和常量
- 4.1 声明变量
- 使用数据类型关键字声明变量,变量名尽可能有意义,尽量不使用中文;
- 4.2 声明常量
- 常量也成为final变量,使用关键字final声明;常量只能赋值一次;
- 示例:创建类VarNConstant。
- 4.3 变量的有效范围
- 类似命名空间的概念,分为成员变量和局部变量;
- 在类中定义的变量称为成员变量,在整个类中有效;成员变量又分为实例变量和静态变量(类变量);
- 静态变量需要使用关键字static声明,静态变量可以跨类使用,引用方式为:
class_name.static_var
; - 局部变量在方法中定义,只在该方法代码块中有效;方法调用结束后销毁;
- 局部变量的声明周期取决于方法(何时调用何时结束);
- 示例:创建类Val。
5.运算符
- 5.1 赋值运算符
=
,可以连着赋值:x = y = 1
,但是不建议使用;
- 5.2 算术运算符
+-*/
,求余:%
,+-
还可以当作正负号使用;
- 5.3 自增、自减运算符
- 使用变量a之前,将a加1或减1:
++a
/--a
; - 使用变量a之后,将a加1或减1:
a++
/a--
;
- 使用变量a之前,将a加1或减1:
- 5.4 比较运算符
>
<
==
>=
<=
!=
;- 示例:创建Compare类。
- 5.5 逻辑运算符
- 与或非:
&
|
!
;与、或的短路形式:&&
、||
; - 示例:创建Calculation类。
- 与或非:
- 5.6 位运算符
- 位运算符处理整型或字符型的操作数(转换成二进制数再进行位操作)
- 按位取反
~
、按位与&
、按位或|
、按位异或^
、左移<<
、右移>>
、无符号右移>>>
; - ·示例:创建BitOperation类。
- 5.7 三元运算符
- 示例:
boolean b = 20 < 45 ? true : false;
结果b=true;
- 示例:
- 5.8 运算符优先级
- 大致顺序:括号、正负号、一元运算符、乘除、加减、移位、比较大小、比较是否相等、位运算、三元、赋值;
- 示例:创建VarExchange类。
- 示例:创建ParityCheck类。
6.类型转换
Java对数据类型转换有严格的规定。数据从占用内存空间小的类型转换到大的类型时,做自动类型转换(隐式);反之做强制类型转换(显式)。
- 6.1 自动类型转换
- Java中8种基本类型可以混合运算,运算前首先自动转换类型,遵循小内存转为大内存的规则。
- 示例:创建Conver类。
- 6.2 强制类型转换
- 如果把占用内存大的类型转换为小内存类型,必须显式转换:
int a = (int)45.0
- 需要注意不能超过该类型的取值范围,否则数据溢出(不会报错,但会丢失数据)。
- 示例:创建TypeConvertion类。
- 如果把占用内存大的类型转换为小内存类型,必须显式转换:
7.代码注释和编码规范
- 7.1 代码注释
- 单行注释:
//...
;多行注释:/*...*/
;文档注释:/**...*/
;
- 单行注释:
- 7.2 编码规范
- 每条语句单独一行;
- 声明变量单独一行(即使是同类型变量);
- Java中多个空格看作一个;
第四章 流程控制
1.复合语句
- 同C语言类似,Java的复合语句是以整个区块为单位的语句,又称块语句。由大括号作为开始和结束的标记。
- 使用复合语句时,为局部变量创建了一个作用域,内部的变量只能在内部使用。
2.条件语句
- 2.1 if 条件语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//基本结构
/* 简单 if 条件语句 */
if(布尔表达式){
语句序列
}
//如果语句序列只有一条语句,可以省略大括号;
/* if-else 语句 */
if(布尔表达式){
语句序列
}else{
语句序列
}
/* if-else if 多分支语句 */
if(布尔表达式 1){
语句序列
}else if(布尔表达式 2){
语句序列
}else if ...
//当省略任意一组语句序列时,可以保留对应的大括号,也可以将大括号替换为‘;’;
//·示例:创建GetTerm类。
- 2.2 switch 多分支语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* if 语句检查多个条件的时候显得臃肿,可以使用switch多分支语句 */
//基本结构:
switch(表达式){
case 取值1: //注意必须是常量表达式,
语句块1
[break;] //可以不加break,那么会一直检查完n个分支再退出
case 取值2:
语句块2
[break;]
...
defult: // 如果找不到匹配的case,采用default语句块
语句块n+1 // 如果没有default,也没有匹配,那么switch语句什么都不做
[break;] // 如果前面的case不加break,default必然被执行
}
// 注意:case后的值可以不能是浮点数,不可以是字符串(可以是字符)。
// 示例:创建GetSwitch类。
- 2.3 示例:创建CheckLogin类。
- 2.4 示例:创建Example类。
3.循环语句
- 3.1 while循环语句
1
2
3
4
5
6
/* 基本结构 */
while(条件表达式){
语句块
}
// 注意不能用分号代替大括号,否则进入无限循环
// 示例:创建GetSum类。
- 3.2 do - while循环
1
2
3
4
5
6
7
8
9
/* while循环先判断条件再执行 */
/* do - while循环先无条件执行一次,再进行类似while循环的过程 */
do
{
语句块
}
while(条件表达式); //里面是结束循环的条件
// ·示例:创建Cycle类。
- 3.3 for 循环
1
2
3
4
5
6
7
8
9
/* for循环用来重复执行某语句块,直到某个条件满足为止 */
for(表达式1; 表达式2; 表达式3){
语句块
}
//表达式1:初始化表达式,负责完成变量的初始化
//表达式2:循环条件表达式,为布尔型表达式,指定继续循环的条件
//表达式3:循环后的操作,负责再循环中改变变量
// 示例:创建Circulate类。
- 3.4 foreach 循环
1
2
3
4
5
6
7
8
/* Java5新增了foreach语句,用法类似python的for循环,对对象进行循环 */
/* 基本结构 */
for(元素变量x : 遍历对象obj){
引用了x的语句块
}
// 注意还是用for关键字
// ·示例:创建Repetition类。
- 3.5 示例:九九乘法表,创建MultiplicationTable类。
4.跳转语句
- 4.1 break 语句:强行跳出循环;
- 4.2 continue 语句:终止当前语句块,进入下一次循环;
- 4.3 return 语句:从一个方法返回对象,并将控制权交给调用它的语句。
- 4.4 示例:略。
5.经典范例
- 使用for循环输出杨辉三角,创建YanghuiTriangle类。
第五章 数组
数组是最常用的一种数据结构,是将一系列相同类型的数据,用同一个标识符封装到一起。实质上数组是一个线性序列,因此数组访问起来很快。
1.数组概述
- 就是Numpy里面的ndarray的低配版
2.一维数组
- 2.1 创建一维数组
- 两种形式:以声明整型数组为例:
int arr[];
int[] arr; //arr为该数组的标识符
- 给数组分配内存空间(使用new关键字)
arr = new int[10]; //长度为10的整型数组
- 在声明的同时分配内存空间
int arr[] = new int[10];
- 两种形式:以声明整型数组为例:
- 2.2 初始化一维数组
- 两种形式:
int arr[] = new int[5]{1,2,3,4,5};
int arr[] = {1,2,3,4,5}; //即,可以省略new运算符和长度
- 两种形式:
- 2.3 示例:遍历数组,略。(见上一章循环语句)
3.多维数组
- 3.1 二维数组
- 创建二维数组:
float arr[][];
float[][] arr;
- 分配内存:
arr = new float[3][3];
arr = new float[3][]; //只给一个维度分配内存
- 二维数组初始化:
int arr[][] = {{1,2,3}, {4,5,6}, {7,8,9}};
arr[0][0] = 100; //索引从0开始,初始化之后可以直接赋值
- 创建二维数组:
- 3.2 三维数组
- 示例:创建三维数组并打印,创建Ransack类。
- 3.3 示例:对数组进行转置运算,创建ArraySwap类。
4.数组的基本操作
java.util包的Arrays类包含用于操作数组的各种方法
- 4.1 遍历数组
- 遍历一维数组;示例:GetDay;
- 遍历二维数组;示例:Trap、Tautog;
- 4.2 填充替换数组元素
- 通过Arrays类的静态方法fill来进行填充;
fill(int[] a, int value) //将value赋值给a的每个元素;
fill(int[] a, fromidx, toidx, int value) //赋值给一定范围的每个元素,从fromidx到toidx(不包含);
//如果fromidx == toidx,则填充范围为空;
- 示例:5_4_2.java
- 4.3 对数组进行排序
- 通过Arrays类的静态方法sort对数组进行排序;
- 示例:5_4_3.java
- 4.4 复制数组
- 通过Arrays类的copyOf方法和copyOfRange方法进行复制数组
copyOf(arr, int newlength);
- 其中newlength指新数组的长度,如果新数组的长度大于arr的长度,则用0填充(如果是char型数组则用null填充);;反之则截取原数组的一部分,从左往右截取;
copyOfRange(arr, int fromidx, int toidx);
- 其中toidx不包含在内,fromidx只能取值 0 - arr.length ;
- 示例:5_4_4.java
- 4.5 范例5:对比一维、二维数组所占内存;
- 4.6 范例6:使用直接插入排序法进行排序;
5.经典范例
- 冒泡排序法,创建BubbleSort类。
第六章 字符串
字符串不是Java的一个基本类型,但是可以像基本类型一样使用。
6.1 创建字符串
- 使用String方法新建字符串对象;
String s = new String();
- 使用char数组创建字符串:
char a[] = {'g', 'o', 'o', 'd'}; String s = new String(a);
- 等价于:
String s = new String("good");
- 使用offset表示开始截取字符串的位置,length表示截取的长度:
String(char a[], int offset, int length);
- 示例:
char a[] = {'a', 'b', 'c', 'g', 'o', 'o', 'd', 'x', 'y', 'z'};
String s = new String(s, 3, 4);
6.2 字符串操作
- 6.2.1 字符串连接
- 直接相加就可以连接;
- 与其他数值型连接时,返回的是字符串;
- 6.2.2 获取字符串信息
- 获取长度:str.length();
- 获取指定字符索引位置:
str.IndexOf('char'); //返回首次检索到的字符索引,如不存在返回-1;
- 返回最后出现的位置:
str.lastIndexOf('char');
- 获取指定位置的字符:
str.charAt(int index);
- 6.2.3 去除字符串的空格
- 去除前后空格:
str.trim();
- 去除所有空格:
StringTokenizer(str, delim); //其中delim为要去掉的字符串;
str.replaceAll(String regex, String replacement); //其中regex为要替换的字符串的正则表达式,replacement为替换的字符串
- 去除前后空格:
- 6.2.4 字符串替换
- replace方法:
str.replace(String regex, String replacement); //好像跟replaceAll没有区别
- replaceFirst方法:
str.replaceFirst(regx, replacement);
- replace方法:
- 6.2.5 判断字符串
- 判断字符串是否相等:
str.equals(other_str);
- 忽略大小写判断:
str.equalsIgnoreCase(other_str);
- 判断字符串的开头:
str.startsWith(prefix); //其中prefix为前缀
- 判断字符串的结尾:
str.endsWith(suffix);
- 上述判断均返回true或false;
- 判断字符串是否相等:
- 6.2.6 大小写替换
str.toLowerCase(); str.toUpperCase(); //返回修改后的字符串
- 6.2.7 字符串分割
str.split(String sign); //其中sign为分隔符,可以为正则表达式
str.split(sign, int limit); //limit为指定分割的份数
- 6.2.8 范例1,Division类;
- 6.2.9 范例2,CheckNumber类;
6.3 格式化字符串
- 6.3.1 格式化方法
str.format(String format, Objetc...args);
str.format(Local I, String format, Object...args); //加入本地化
- 6.3.2 日期格式化。详见示例:创建Example类;
- 6.3.3 时间格式化。详见示例:创建GetTime类。
- 6.3.4 日期时间组合格式化。详见示例:创建DateAndTime类。
- 6.3.5 常规类型格式化。详见示例:创建General类。
- 6.3.7 范例;将数字格式化为货币格式。创建FormatNumber类。
6.4 正则表达式
- 6.4.1 判断是否符合正则表达式
boolean matches(String regex); //regex:正则表达式;boolean:返回布尔型;
- 6.4.2 正则表达式的元字符
- 元字符:
.
表示任意一个字符;\d
表示0-9的任意一个数字;\D
任意非数字字符;\s
空白字符,如\t
,\n
;\S
任意非空白字符;\w
可用作标识符的字符,但不包括$
;\W
前者取反;\p{type}
格式:type
取值如下:- Lower:小写字母 | Upper:大写字母 | Alpha:字母字符;
- Digit:十进制数字 | Alnum:数字或字母;
- ASCII:ASCII字符集 | Print:可打印字符 | Graph:可见字符;
- Punct:标点符号 | Blank:空格或制表符 | Cntrl:控制字符;
- 示例:创建Decision类。
- 元字符:
- 6.4.3 正则表达式的限定符
- 限定符用于指定某种元字符的重复次数:
?
0次或1次;*
0次或多次;+
1次或多次;{n}
正好n次;{n,}
至少n次;{n, m}
n~m次;
- 示例:创建Judge类。
- 限定符用于指定某种元字符的重复次数:
- 6.4.4 中括号中元字符的含义
- 元字符:
[abc]
a或b或c;[^abc]
除了abc的所有字符;[a-zA-Z]
a-z或A-Z;[a-d[m-p]]
a-b或m-p;[a-z&&[^abc]]
a-z之间除了abc的所有字符;[a-z$$[^m-p]]
a-z之间加上除了m-p的所有字符;
- 示例创建CheckHandSetNum类。
- 元字符:
- 6.4.5 范例:创建CheckIPAddress类。
- 6.4.6 范例:创建ChineseAmount类。
6.5 字符串生成器
- 6.5.1 StringBuilder类
- 新创建的StringBuilder对象初始容量是16字符,可以自定义初始长度。创建后可以动态地执行添加、删除和插入等字符串操作,提高频繁操作字符串的效率。
- 示例:创建Jerque类。
- 6.5.2 StringBuilder类常用方法
StringBuilder builder = new StringBuilder("");
builder.append(String str); //追加到字符串生成器
builder.append(StringBuffer sb); //其中sb为缓存中的值
builder.insert(int offset, String str); //插值
- builder.delete(int start, int end); //删除某段字符串
- builder.toString(); //StringBuilder转换为字符串
- 示例:创建allMethod类。
- 6.5.3 范例:将汉字和字母转换为Unicode编码,创建CharacterUnicode类。
- 6.5.4 范例:去除字符串中的重复字符,创建SBDelete类。
6.6 经典范例
- 实现字符串加密,创建EncryptUncrypt类。