3.2 注释

  1. //
  2. /**/
  3. /**
  4. * 自动生成文档
  5. * @version abc
  6. * @author def
  7. */

3.3 数据类型

3.3.1整型

  • int, 4B
  • short, 2B
  • long, 8B
  • byte, 1B

整型的范围与机器无关.

  1. // long
  2. 4L
  3. // 十六进制 (或 0X)
  4. 0xCAFE
  5. // 八进制 (0开头)
  6. 010
  7. // 二进制 (或 0B)
  8. 0b1001
  9. // 人类易读的10进制和二进制
  10. 1_000_000
  11. 0b1111_0100_0010_0100_0000

没有无符号整型.

3.3.2 浮点型

  • float, 4B
  • double, 8B

float 的精度在6~7位有效数字.

  1. // 或者 F
  2. 3.14f
  3. // 默认为 double (D, d)
  4. 3.14

特殊值:

  • 正无穷大, Double.POSITIVE_INFINITY
  • 负无穷大, Double.NEGATIVE_INFINITY
  • NaN, Double.NaN
  1. // 判断是否为 NaN
  2. Double.isNaN(x)

3.3.3 char 类型

  • char, 2B
  • 使用单引号 'A'
  1. \u2122

3.3.4 Unicode 和 char 类型

  • 码点:U+0041
  • 代码平面, code plane

3.3.5 boolean 类型

  • false
  • true

3.4 变量与常量

3.4.1 声明变量

  1. double salary;
  2. // _ 不能作为变量名
  3. // 一行中声明两个变量
  4. int i, j;

3.4.2 变量初始化

  • 使用未初始化的变量会在编译时报错
  1. int vacationDays;
  2. vacationDays = 12;
  3. int vacationDays = 12;
  4. // java10 开始支持类型自动推导
  5. var vacationDays = 12;

3.4.3 常量

  1. final double CM_PER_INCH = 2.54;

类常量:

  1. package chapter03;
  2. // 文件名与类名相同, 并带有 .java 扩展名, 包括大小写.
  3. public class FirstSample {
  4. // static final 不用 new 对象就可在方法中使用
  5. public static final double abc = 2.54;
  6. public static void main(String[] args) {
  7. System.out.println(abc);
  8. // 使用自定义退出码
  9. // System.exit();
  10. }
  11. }

3.4.4 枚举类型

  1. package chapter03;
  2. public class FirstSample {
  3. public static final double abc = 2.54;
  4. public static void main(String[] args) {
  5. Size s = Size.SMALL;
  6. System.out.println(s);
  7. }
  8. }
  9. enum Size{SMALL, MEDIUM, LARGE, EXTRA_LARGE};

3.5 运算符

  • 整数被0除将产生异常
  • 浮点数被0除将产生无穷大或 NaN

3.5.2 数学函数与常量

  1. package chapter03;
  2. public class FirstSample {
  3. public static final double abc = 2.54;
  4. public static void main(String[] args) {
  5. double x = 4;
  6. double y = Math.sqrt(x);
  7. System.out.println(y);
  8. }
  9. }

数学家知道的最优规则:

  • 余数总是要 >= 0

避免总写包名:

  1. package chapter03;
  2. import static java.lang.Math.*;
  3. public class FirstSample {
  4. public static final double abc = 2.54;
  5. public static void main(String[] args) {
  6. double x = 4;
  7. double y = sqrt(x);
  8. System.out.println(y);
  9. }
  10. }

3.5.3 数值类型之间的转换

合法转换:

  • 虚线: 有精度损失

image.png

合法转的自动转换:

  1. package chapter03;
  2. public class FirstSample {
  3. public static final double abc = 2.54;
  4. public static void main(String[] args) {
  5. double x = 4;
  6. int y = 3;
  7. System.out.println(x+y);
  8. }
  9. }

3.5.4 强制类型转换

  1. package chapter03;
  2. public class FirstSample {
  3. public static final double abc = 2.54;
  4. public static void main(String[] args) {
  5. double x = 9.997;
  6. int nx = (int)x;
  7. System.out.println(x+nx);
  8. }
  9. }

3.5.5 结合赋值和运算符

3.5.6 自增与自减运算符

3.5.7 关系和 boolean 运算符

3.5.8 位运算符

  • &, and
  • |, or
  • ^, xor
  • ~, not

3.5.9 括号与运算符级别

3.6 字符串

String 不是内置的字符串类型.

3.6.1 子串

3.6.2 拼接

  1. package chapter03;
  2. public class FirstSample {
  3. public static final double abc = 2.54;
  4. public static void main(String[] args) {
  5. int age = 13;
  6. String rating = "PG" + age; // 不同类型直接拼接, go 需要类型转换
  7. System.out.println(rating);
  8. }
  9. }

3.6.3 不可变字符串

不能直接修改原字符串, 需要先提取再创建新的:

  1. package chapter03;
  2. public class FirstSample {
  3. public static final double abc = 2.54;
  4. public static void main(String[] args) {
  5. String greeting = "Hello";
  6. greeting = greeting.substring(0, 3) + "p!";
  7. System.out.println(greeting);
  8. }
  9. }

3.6.4 检测字符串是否相等

  1. // 一定要使用 equals()
  2. "Hello".equals(greeting)

3.6.5 空串与 Null 串

  1. // 检查空串
  2. if (str.length() == 0)
  3. // 或
  4. if (str.equals(""))
  5. // 检测 null
  6. if (str == null)
  1. package chapter03;
  2. public class FirstSample {
  3. public static final double abc = 2.54;
  4. public static void main(String[] args) {
  5. String greeting = null;
  6. // 会抛出异常
  7. if (greeting.length() != 0) {
  8. System.out.println(greeting);
  9. }
  10. }
  11. }

3.6.6 码点与代码单元

3.6.7 String API

3.6.8 阅读联机 API 文档

3.6.9 构建字符串

使用 StringBuilder 拼接大量小字符串:

  1. package chapter03;
  2. public class FirstSample {
  3. public static void main(String[] args) {
  4. StringBuilder builder = new StringBuilder();
  5. builder.append("abc");
  6. builder.append("def");
  7. System.out.println(builder);
  8. }
  9. }

StringBuffer 是 StringBuilder 的前身, 性能稍低, 但是是并发安全的.

3.7 输入与输出

3.7.1 读取输入

  1. package chapter03;
  2. import java.util.Scanner;
  3. public class FirstSample {
  4. public static void main(String[] args) {
  5. Scanner in = new Scanner(System.in);
  6. String name = in.nextLine();
  7. System.out.println(name);
  8. }
  9. }

3.7.2 格式化输出

image.png

image.png

3.7.3 文件输入与输出

  1. package chapter03;
  2. import java.io.IOException;
  3. import java.nio.charset.StandardCharsets;
  4. import java.nio.file.Path;
  5. import java.util.Scanner;
  6. public class FirstSample {
  7. public static void main(String[] args) throws IOException {
  8. Scanner in = new Scanner(Path.of("README.md"), StandardCharsets.UTF_8);
  9. System.out.println(in.nextLine());
  10. in.close();
  11. }
  12. }

3.8 控制流程

3.8.1 块作用域

  1. package chapter03;
  2. public class FirstSample {
  3. public static void main(String[] args) throws {
  4. int n;
  5. {
  6. int n; // 编译时错误, 重定义, Go 是可以的
  7. }
  8. }
  9. }

3.8.2 条件语句

  1. if (condition1) statement1 else if (condition2) statement2 else statement3

3.8.3 循环

  1. while (condition) statement
  2. do statement while (condition);

3.8.4 确定循环

  1. package chapter03;
  2. public class FirstSample {
  3. public static void main(String[] args) {
  4. for (int i = 1; i <= 10; i++) {
  5. System.out.println(i);
  6. }
  7. }
  8. }

3.8.5 多重选择: switch 语句

  1. package chapter03;
  2. public class FirstSample {
  3. public static void main(String[] args) {
  4. int n = (int)(Math.random()*100);
  5. switch (n) {
  6. case 1:
  7. System.out.println(n);
  8. break; // 默认不退出 switch
  9. case 2:
  10. System.out.println(n+1);
  11. break;
  12. default:
  13. break;
  14. }
  15. }
  16. }

编译时可以添加 fallthrough 选项来对没有使用 break 的 switch 提出警告.

case 标签的类型可以是:

  • char, byte, short, int
  • 枚举
  • 字符串字面量

3.8.6 中断控制流程的语句

带标签的 break

  • 跳出多重嵌套的循环语句
  1. package chapter03;
  2. public class FirstSample {
  3. public static void main(String[] args) {
  4. int i, j = 0;
  5. label:
  6. for (i = 0; i < 10; i++) {
  7. for (j = 0; j < 10; j++) {
  8. if (j*i == 36) {
  9. break label;
  10. }
  11. }
  12. }
  13. System.out.printf("%d, %d\n", i, j);
  14. }
  15. }
  1. package chapter03;
  2. public class FirstSample {
  3. public static void main(String[] args) {
  4. int i, j = 0;
  5. for (i = 0; i < 10; i++) {
  6. for (j = 0; j < 10; j++) {
  7. if (j == 0) {
  8. continue;
  9. }
  10. System.out.println(i/j);
  11. }
  12. }
  13. System.out.printf("%d, %d\n", i, j);
  14. }
  15. }

带标签的 continue 将跳到与标签匹配的循环的首部.

3.9 大数

原则上是,只要你的计算机的内存足够大,可以有无限位的.

  • BigInteger
  • BigDecimal
  1. package chapter03;
  2. import java.math.BigInteger;
  3. public class FirstSample {
  4. public static void main(String[] args) {
  5. BigInteger bi = new BigInteger("123456789112344454");
  6. BigInteger result = bi.multiply(bi);
  7. System.out.println(result);
  8. }
  9. }

3.10 数组

3.10.1 声明数组

  • 长度不能改变
  1. int[] a = new int[100];
  2. var a = new int[100];
  3. int[] smallPrimes = {1, 2, 3};
  4. int[] a = new int[]{1, 2, 3};
  • 创建长度为0的数组
  1. new elementType[0]
  2. new elementType[]{}

3.10.2 访问数组元素

  1. package chapter03;
  2. public class FirstSample {
  3. public static void main(String[] args) {
  4. int[] a = new int[10];
  5. for (int i = 0; i < 10; i++) {
  6. System.out.println(a[i]);
  7. }
  8. }
  9. }

3.10.3 for each 循环

  1. package chapter03;
  2. public class FirstSample {
  3. public static void main(String[] args) {
  4. int[] a = new int[10];
  5. for (int e : a) {
  6. System.out.println(e);
  7. }
  8. }
  9. }

3.10.4 数组拷贝

直接赋值将引用同一底层数组:

image.png

使用 Arrays.copyOf() 将原数据拷贝到新空间.

3.10.5 命令行参数

与 Go 不同, Java 的 args[0] 不从程序名开始.

3.10.6 数组排序

  1. package chapter03;
  2. import java.util.Arrays;
  3. public class FirstSample {
  4. public static void main(String[] args) {
  5. int[] a = new int[]{1, 3, 5, 4, 7, 9, 2};
  6. Arrays.sort(a);
  7. System.out.println(Arrays.toString(a));
  8. }
  9. }

3.10.7 多维数组

  1. double[][] balances;
  2. balances = new double[NYEARS][NRATES];
  1. package chapter03;
  2. public class FirstSample {
  3. public static void main(String[] args) {
  4. int[][] a2 = new int[3][3];
  5. System.out.println(a2[2][2]); // 直接使用
  6. }
  7. }

3.10.8 不规则数组

image.png

  1. package chapter03;
  2. public class FirstSample {
  3. public static void main(String[] args) {
  4. int[][] odds = new int[3][];
  5. for (int i = 0; i < 3; i++) {
  6. odds[i] = new int[i];
  7. }
  8. }
  9. }