第一章 初识Java
- Java同时是编译型(编译器将Java源代码静态编译为Java字节码)和解释型(JVM将Java字节码动态解释为本地机器码)语言。
- Java程序的运行需要解释器(如JVM)。
因Java字节码本具有平台无关性,那么若要在一个新目标平台上运行一个Java程序,则仅需解释器做好目标平台的移植适配,即可在其上正常运行Java程序。做为Java程序的开发者,无需关心目标平台是什么,亦或在底层需要做什么。
- Java程序运行2步骤:
- 编译阶段:
- 编译阶段:
- 编译成功后,会在与源代码文件(后缀名为
.java
)的同级目录下生成后缀名为.class
的、二进制的Java字节码文件。- 当源码无改动时,若干次编译操作,实际只编译1次。
2. 运行阶段:
仅需1次编译,但需每次解释。
- 手动编译Java源代码的命令:
javac 包含main()方法入口的Java源代码文件.java
第二章 熟悉Eclipse开发工具
略。
第三章 Java语言基础
-
9数据类型:
-
命名规则:
- 类名与文件名一致。
在单个Java源代码文件中,只能定义1个与文件名同名的 public 类,其余类必须为非 public 的。
- 变量名:
- 可含字母、下划线、美元符号、数字。
- 开头不能为数字。
- 不能含Java关键字。
- 区分大小写。
- 类名与文件名一致。
-
运行程序时的内存加载情况:
系统内存组成:
- 程序开始执行时:
- 代码载入内存后,开始初始化变量、执行方法体时:
- 程序开始执行时:
-
Java中的变量:
-
Java的运算符:
- 7分类:
-
Java中允许将赋值运算符 = 连用。
例:
x = y = z = 5;
则x、y和z的值都为5。 -
++a 与 a++ 的区别:
++a
在使用a变量前,先使a的值自增1后,再参与运算。a++
在使用a变量参与运算结束后,再对a的值自增1。
-
& 与 && 的区别:
&
对整个表达式从左至右依次全部
判断后得出结果。又称非短路运算符。&&
从左至右依次有选择地
判断后得出结果。判断期间若有任一条件为假,则短路剩余条件,直接得出为假。又称短路运算符。
-
只有整型(byte、short、int、long、char)才可用移位运算符。
- 运算符优先级(由高到低排列):
- 自增/自减运算符。
- 算数运算符。
- 比较运算符。
- 逻辑运算符。
- 赋值运算符。
- 7分类:
-
数据类型的转换:
- 2方式:
- 2方式:
-
Java的注释:
- 在Java源代码中的任何地方都可以插入注释。
- 在多行注释中可嵌套单行注释。
- 多行注释中不能嵌套多行注释。
- 在生成JavaDoc文档时,会读取Java源代码中的注释,作为生成其文档的原始数据。
第四章 流程控制
- 关于复合语句
- 概述:
包含在一对花括号间的、以代码块为单位的代码。
又称块语句。 - 在复合语句内声明的变量的作用域,仅限于在此复合语句块内(包括嵌套的复合语句块内)。
不能在此复合语句块外使用,因为其超出了此变量作用域范围。
- 概述:
- 关于多分支语句(switch-case)
-
允许的表达式类型:
- 整型(short、int、long)。
- 字符型(char)。
- 字符串型(String)。
仅JDK 1.7及以后支持。
-
可省略 default 语句、break 语句。
-
- 关于循环语句
- do-while 与 while 的区别:
do……while……
无论执行循环体的条件是否满足,至少执行1次。while
当没有任何1次能满足循环体的执行条件时,永不执行。
- 基于for循环的死循环写法:
for(;;) {// 代码段 }
- foreach 不是Java关键字。
- do-while 与 while 的区别:
第五章 字符串
-
关于字符串
-
字符串对象的创建2方式:
将双引号引住的数值赋值给String型变量
此方法创建字符串对象时,会先去JVM堆内存上的字符串常量池中根据字符串内容查找是否存在此字符串对象。若有,则直接从池中返回这个对象的内存地址;否则,先在JVM堆内存上的字符串常量池中创建这个字符串对象,然后再返回这个对象的内存地址。
使用String类的构造方法
此方法创建字符串对象时,与前一种方式大体一致。不同的是,当未在字符串常量池中找到具有相同内容的字符串对象时,会先在JVM堆内存中创建这个字符串对象,然后再返回这个对象的内存地址。
关于String类的构造方法:
-
字符串拼接:
-
在
循环
中不要使用+号拼接
字符串。会频繁创建很多的字符串对象,性能差。 -
在单线程环境下创建内部无锁的StringBuilder类的对象来拼接字符串,以复用同一字符串对象,加快拼接速度。
在多线程环境下创建内部加锁的StringBuffer类的对象来拼接字符串,以保证线程安全。StringBuilder类与StringBuffer类均在原始对象上做拼接,不会创建额外的字符串对象。
-
-
String类的常用方法:
方法名 概述 入参 返回值 备注 length 获取字符串对象的总长度。 - 字符串对象的总长度。 indexOf 获取某字符串在指定字符串中首次出现的下标索引。 需要查找的字符串。 查找的字符串在指定字符串中首次出现的下标索引。
> 若没有查找到字符串,则返回-1。下标计数从0开始。 lastIndexOf 获取某字符串在指定字符串中最后一次出现的下标索引。 需要查找的字符串。 查找的字符串在指定字符串中最后一次出现的下标索引。
> 若没有查找到字符串,则返回-1。下标计数从0开始。 charAt 获取字符串中指定下标索引位置的字符。 需要获取字符的下标索引值。 char字符类型的对象。 若传入的下标索引超出字符串的总长度将会抛出StringIndexOutOfBoundsException异常。 substring 截取从指定下标索引开始一直到字符串末尾的字符串。 指定开始截取的下标索引。 截取后的新字符串对象。 substring 截取从指定下标索引开始和从指定下标结束的字符串。 1. 指定开始截取的下标索引。
2. 指定截取结束的下标索引。截取后的新字符串对象。 指定开始截取下标索引位置的字符会保留,而指定结束截取下标索引位置的字符将丢弃。
指定截取结束的下标索引是从下标索引0的位置计数,而非从指定开始截取的下标索引开始计数。trim 去除字符串首尾的空格。 - 去除首尾空格的新字符串对象。 字符串中间的任何空格都不会被去除 replace 将字符串中某些字符或字符串内容,全局替换为指定的字符或字符串内容。 1. 要替换的字符或字符串。
2. 替换为的字符或字符串。替换后的新字符串对象。
> 若要替换的字符或字符串没有出现在原字符串中,则返回原字符串。若要替换的字符或字符串在原字符串中出现多次,将会全局替换 startWith 判断某字符串中是否以指定的字符串开头。 指定的开头字符串。 布尔值:
1.true
字符串中以指定的字符串开头。
2.false
字符串中不以指定的字符串开头。endWith 判断某字符串中是否以指定的字符串结尾。 指定的结尾字符串。 布尔值:
1.true
字符串中以指定的字符串结尾。
2.false
字符串中不以指定的字符串结尾。equals 比较两个字符串对象的内容是否一致。 要比较的另一字符串对象。 布尔值:
1.true
两字符串内容一致。
2.false
两字符串内容不一致。使用==符号比较的是两字符串的内存地址,所以结果大多为false equalsIgnoreCase 忽略大小写来比较两个字符串对象的内容是否一致。 参与比较的另一字符串对象。 布尔值:
1.true
两字符串内容一致。
2.false
两字符串内容不一致。compareTo 按照字典顺序比较两个字符串。 参与比较的另一字符串对象。 整型值:
1.负整数
字符串对应ASCII码表的位置比参数中给定字符串对应ASCII码表的位置靠前。
2.正整数
字符串对应ASCII码表的位置比参数中给定字符串对应ASCII码表的位置靠后。
3.0
两字符串内容一致。例:
在ASCII码表中,字符a在前,字符b在后。那么:
+ “b”.compareTo(“a”);返回1
+ “a”.compareTo(“b”);返回-1
+ “a”.compareTo(“a”);返回0toLowerCase 将字符串中所有的字符改为小写字母。 要转换的字符串对象。 转换后的新字符串对象。 数字或非字符不受影响。 toUpperCase 将字符串中所有的字符改为大写字母。 要转换的字符串对象。 转换后的新字符串对象。 数字或非字符不受影响。 split 按照指定的字符或字符串将字符串分割为字符串数组。 指定的分隔符(字符或字符串)。 字符串数组。 - format 用格式化的方法创建字符串。 1. 格式字符串。
2. 格式字符串中格式符号对应的参数。以格式字符串为规范创建的新字符串对象。 可用于数据类型、进制、日期时间、文本的格式化,生成特定的字符串内容。
> 例:
> 以下示代码将返回:
> hello, world: 2012。
css String.format("hello, %s: %d", "world", 2012);
replace() 与 replaceAll() 的异同点:
- 均可以副本的方式全局替换字符串。
- replace()仅支持以字符、字符串全局替换;replaceAll()还支持以正则表达式全局替换。
-
-
关于Java的正则表达式
例:
以下将匹配1个前1~3位是数字(没有任何数字或最多只能有3个数字)、最后1位是任意字母的字符串。String reg = "^\\d{0,3}[A-Za-z]{1}$"; System.out.print("123A".matches(reg)); // 输出 true
第六章 数组
-
关于数组
-
分类:
-
二维数组示例:
String arr[][] = new String[3][2]; // 定义一个3行2列的二维数组for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {arr[i][j] = String.format("我是第%d行第%d列", i + 1, j + 1);} }Stream.of(arr).forEach(item -> {log.info(String.format("我是行:%s,%s。", item[0], item[1])); });
我是行:我是第1行第1列,我是第1行第2列。 我是行:我是第2行第1列,我是第2行第2列。 我是行:我是第3行第1列,我是第3行第2列。
-
-
Arrays 类的常用方法:
方法名 概述 方法定义 备注 Arrays.fill 将某值逐位填充进某数组中。 java /** * @param a 目标填充数组 * @param val 目标填充数字 */ public static void fill(int[] a, int val) { …… }
> 不同的基本数据类型有不同的重载方法,此处仅写出了操作整型数组的方法定义。例:
以下示例代码会将10逐位填充进长度为5的空数组中。java int arr[] = new int[5]; Arrays.fill(arr, 10);
Arrays.sort 升序排序数组。 java /** * @param a 待排序的目标数组对象 */ public static void sort(int[] a) { …… }
> 不同的基本数据类型有不同的重载方法,此处仅写出了操作整型数组的方法定义。底层基于双轴快排 DualPivotQuicksort。 Arrays.copyOf 以复制指定数组内元素的方式,创建新数组。 java /** * @param original 原数组 * @param newLength 要复制的长度 * @return 复制后的新数组 */ public static int[] copyOf(int[] original, int newLength) { …… }
> 不同的基本数据类型有不同的重载方法,此处仅写出了操作整型数组的方法定义。例:
以下示例代码,会基于已有数组 arr 中的 3 个元素,创建新数组 newArr。
当选择范围未超原数组长度时,正常参照创建。
当选择范围超出原数组长度时,超出位的元素将以 0 代之。java int arr[] = new int[]{3, 6, 8}; int newArr[] = Arrays.copyOf(arr, 5); // 填充后,newArr中的元素为:3, 6, 8, 0,