目录
整体结构
一个完整的Java应用程序
public class test {
public static void main(String[] args) {
System.out.println("Hello");
}
}
1.Java应用程序的所有内容必须放置在类中。
2.Java的类名必须以字母开头,遵循CamelCase的命名方法,即名字的每个单词首字母大写。
基本数据类型
1.System.out.println(2.0-1.1)的输出结果为0.8999999999999而非0.9,因为浮点数用二进制表示,其结果无法用二进制精确表示,就像1/3无法用十进制精确表示一样。
2.当心注释中的\u,它很可能因为后面没有跟随一个十六进制数而报错。
3.建议减少对char类型的使用,并以抽象数据类型String类代替。
4.Java中,char描述了UTF-16编码中的一个代码单元。
有关代码单元和Unicode与char之间的关系,详见书本。另请参阅:char 码点和代码单元
不要在代码中使用 $ 这个字符
5.Java的boolean中true与false不可以用0和1代替。
变量
1.Java中默认的整数与小数的类型为int与double,故当定义一个short变量s后,不可出现s = s + 1;的代码,正确写法如下:
s = (short) (s + 1);
因为数字1是int类型,s+1会因自动类型转换而变成int型,不可以直接赋给short类型的变量s,需要进行强制类型转换。
注意:
- 上述代码可以写作 s += 1; 该运算符自带强制类型转换。
- 转换时要注意精度和上限问题。
而下述代码仍是错误的:
byte a1 = 1;
byte a2 = 2;
byte a3 = a1 + a2;
因为a1, a2是变量,编译时编译器不能确定其结果,会将a1 + a2以int型数据处理,在赋给a3时,需要强制类型转换,即:
byte a3 = (byte) (a1 + a2);
2.C/C++区分变量的定义与声明,Java则不然。
3.在Java中使用final关键字来指示常量,例如:
final double PAI 3.1415926
若某个常量在一个类的多个方法中使用,则称其为类常量,并用下述语句表示:
public static final double PAI = 3.14
与其说它类似C/C++中的#define,不如说类似于const,Java中同样有const关键字,但是必须使用final指示常量。
4.int转换为float,long转换double时有可能会发生截断,比如int所包含的位数比float所能表示的位数多时。
5.不要在boolean类型与任何一种类型间使用强制类型转换。
6.若想要进行舍入整数而非取整运算,则可使用Math.round方法。
7.整数除以0会产生异常,浮点数除以0会得到无穷大或NaN结果。
字符串
1.substring方法接受两个参数a, b,a为子串在主串的起始位置,b为不想复制的第一个位置,返回子串的长度为b - a。
2.String类的字符串不可修改,但可以修改字符串变量,让它引用另外一个字符串。
(如str = "Hello"中,"Hello"是字符串,不可变;str是字符串变量,可以改变引用的对象)
- 如果复制一个字符串变量,原始字符串和复制字符串共享相同的字符。
- Java的字符串类相似于C/C++中的char *指针。
- 使用equals()方法而非“==”来判断两字符串是否相等。其中,若不区分大小写,使用equalsIgnoreCase方法。
- “==”运算符只能够确定两个字符串是否放到了同一个位置上。对于两个相同的字符串,是否相等这取决于虚拟机是否始终将两字符串共享。但事实上,只有字符串字面量是共享的,通过+,substring获得的字符串是不共享的。
- 在进行相等性测试时,字符串表现的更像是“指针”。
3.空串是指长度为0,内容为空的字符串,与不和任意对象关联的null串不同。
4.使用length方法检测字符串长度。更准确的是,length方法返回采用UTF-16编码表示的给定字符串所需要的代码单元的数量。这就有可能出现一个字符对应两个长度的现象,为得到真正的长度(即码点数量),可使用codePointCount(a, b)获得,其中a, b含义同substring的两个参数。
输入与输出
1.System.out.println()输出换行,而print方法则不换行。
2.读取标准输入需要的操作:
Scanner in = new Scanner(System.in);
该Scanner对象将关联标准输入流,使用nextLine等方法即可读取不同方式和格式的输入。
3.读取文件需要的操作:
Scanner in = new Scanner(Path.of(file_dir), StandardCharsets.UTF_8);
注意:文件名中包含反斜杠' \ '时,需添加额外的反斜杠,也即' \\ '。
4.使用printf进行与C/C++一样的格式化输出。若创建格式化的字符串,则使用String类的format方法。
控制流程
1.Java不允许在块内重定义变量。
2.使用带标签的break跳出块语句,例如:
label:
{
...
if(condition)
break label;
...
}
3.范围for循环for each 基本格式为for ( variable : collection ) statement,可以对数组或实现Iterable接口的对象进行处理。
这种方式的优点是不必考虑collection的起始值和终止值。
以数组为例,variable处应为数组元素element而非下标index,也即输出数组arr的元素应按如下格式:
for (int element : arr)
System.out.println(element);
注意:指出数组元素的类型并标在variable之前。
数组
1.使用下列语句定义(1.2行)与声明(3.4行)数组:
int[] arr1 = new int[5];
int[] arr2 = new int[] {1,2,3,4,5};
int[] arr3;
int arr4[];
2.获取数组长度可以使用length方法,转化为字符串可以使用toString方法,之后可以直接输出。
3.多维数组的创建与一维数组类似,以二维数组为例,步骤如下,两种方法均可:
// Method 1
int[][] arr1 = new int[5][6];
// Method 2
int[][] arr2 = new int[5][];
for(int i = 0; i < 5 ; i++)
arr2[i] = new int[6];
利用第二种方法可以创建“不规则数组”,即每行数组元素个数不同。