3.2 注释
//
/**/
/**
* 自动生成文档
* @version abc
* @author def
*/
3.3 数据类型
3.3.1整型
- int, 4B
- short, 2B
- long, 8B
- byte, 1B
整型的范围与机器无关.
// long
4L
// 十六进制 (或 0X)
0xCAFE
// 八进制 (0开头)
010
// 二进制 (或 0B)
0b1001
// 人类易读的10进制和二进制
1_000_000
0b1111_0100_0010_0100_0000
没有无符号整型.
3.3.2 浮点型
- float, 4B
- double, 8B
float 的精度在6~7位有效数字.
// 或者 F
3.14f
// 默认为 double (D, d)
3.14
特殊值:
- 正无穷大, Double.POSITIVE_INFINITY
- 负无穷大, Double.NEGATIVE_INFINITY
- NaN, Double.NaN
// 判断是否为 NaN
Double.isNaN(x)
3.3.3 char 类型
- char, 2B
- 使用单引号
'A'
\u2122
3.3.4 Unicode 和 char 类型
- 码点:
U+0041
- 代码平面, code plane
3.3.5 boolean 类型
- false
- true
3.4 变量与常量
3.4.1 声明变量
double salary;
// _ 不能作为变量名
// 一行中声明两个变量
int i, j;
3.4.2 变量初始化
- 使用未初始化的变量会在编译时报错
int vacationDays;
vacationDays = 12;
int vacationDays = 12;
// java10 开始支持类型自动推导
var vacationDays = 12;
3.4.3 常量
final double CM_PER_INCH = 2.54;
类常量:
package chapter03;
// 文件名与类名相同, 并带有 .java 扩展名, 包括大小写.
public class FirstSample {
// static final 不用 new 对象就可在方法中使用
public static final double abc = 2.54;
public static void main(String[] args) {
System.out.println(abc);
// 使用自定义退出码
// System.exit();
}
}
3.4.4 枚举类型
package chapter03;
public class FirstSample {
public static final double abc = 2.54;
public static void main(String[] args) {
Size s = Size.SMALL;
System.out.println(s);
}
}
enum Size{SMALL, MEDIUM, LARGE, EXTRA_LARGE};
3.5 运算符
- 整数被0除将产生异常
- 浮点数被0除将产生无穷大或 NaN
3.5.2 数学函数与常量
package chapter03;
public class FirstSample {
public static final double abc = 2.54;
public static void main(String[] args) {
double x = 4;
double y = Math.sqrt(x);
System.out.println(y);
}
}
数学家知道的最优规则:
- 余数总是要 >= 0
避免总写包名:
package chapter03;
import static java.lang.Math.*;
public class FirstSample {
public static final double abc = 2.54;
public static void main(String[] args) {
double x = 4;
double y = sqrt(x);
System.out.println(y);
}
}
3.5.3 数值类型之间的转换
合法转换:
- 虚线: 有精度损失
合法转的自动转换:
package chapter03;
public class FirstSample {
public static final double abc = 2.54;
public static void main(String[] args) {
double x = 4;
int y = 3;
System.out.println(x+y);
}
}
3.5.4 强制类型转换
package chapter03;
public class FirstSample {
public static final double abc = 2.54;
public static void main(String[] args) {
double x = 9.997;
int nx = (int)x;
System.out.println(x+nx);
}
}
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 拼接
package chapter03;
public class FirstSample {
public static final double abc = 2.54;
public static void main(String[] args) {
int age = 13;
String rating = "PG" + age; // 不同类型直接拼接, go 需要类型转换
System.out.println(rating);
}
}
3.6.3 不可变字符串
不能直接修改原字符串, 需要先提取再创建新的:
package chapter03;
public class FirstSample {
public static final double abc = 2.54;
public static void main(String[] args) {
String greeting = "Hello";
greeting = greeting.substring(0, 3) + "p!";
System.out.println(greeting);
}
}
3.6.4 检测字符串是否相等
// 一定要使用 equals()
"Hello".equals(greeting)
3.6.5 空串与 Null 串
// 检查空串
if (str.length() == 0)
// 或
if (str.equals(""))
// 检测 null
if (str == null)
package chapter03;
public class FirstSample {
public static final double abc = 2.54;
public static void main(String[] args) {
String greeting = null;
// 会抛出异常
if (greeting.length() != 0) {
System.out.println(greeting);
}
}
}
3.6.6 码点与代码单元
3.6.7 String API
3.6.8 阅读联机 API 文档
3.6.9 构建字符串
使用 StringBuilder 拼接大量小字符串:
package chapter03;
public class FirstSample {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder();
builder.append("abc");
builder.append("def");
System.out.println(builder);
}
}
StringBuffer 是 StringBuilder 的前身, 性能稍低, 但是是并发安全的.
3.7 输入与输出
3.7.1 读取输入
package chapter03;
import java.util.Scanner;
public class FirstSample {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String name = in.nextLine();
System.out.println(name);
}
}
3.7.2 格式化输出
3.7.3 文件输入与输出
package chapter03;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.Scanner;
public class FirstSample {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(Path.of("README.md"), StandardCharsets.UTF_8);
System.out.println(in.nextLine());
in.close();
}
}
3.8 控制流程
3.8.1 块作用域
package chapter03;
public class FirstSample {
public static void main(String[] args) throws {
int n;
{
int n; // 编译时错误, 重定义, Go 是可以的
}
}
}
3.8.2 条件语句
if (condition1) statement1 else if (condition2) statement2 else statement3
3.8.3 循环
while (condition) statement
do statement while (condition);
3.8.4 确定循环
package chapter03;
public class FirstSample {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
}
}
3.8.5 多重选择: switch 语句
package chapter03;
public class FirstSample {
public static void main(String[] args) {
int n = (int)(Math.random()*100);
switch (n) {
case 1:
System.out.println(n);
break; // 默认不退出 switch
case 2:
System.out.println(n+1);
break;
default:
break;
}
}
}
编译时可以添加 fallthrough 选项来对没有使用 break 的 switch 提出警告.
case 标签的类型可以是:
- char, byte, short, int
- 枚举
- 字符串字面量
3.8.6 中断控制流程的语句
带标签的 break
- 跳出多重嵌套的循环语句
package chapter03;
public class FirstSample {
public static void main(String[] args) {
int i, j = 0;
label:
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if (j*i == 36) {
break label;
}
}
}
System.out.printf("%d, %d\n", i, j);
}
}
package chapter03;
public class FirstSample {
public static void main(String[] args) {
int i, j = 0;
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if (j == 0) {
continue;
}
System.out.println(i/j);
}
}
System.out.printf("%d, %d\n", i, j);
}
}
带标签的 continue 将跳到与标签匹配的循环的首部.
3.9 大数
原则上是,只要你的计算机的内存足够大,可以有无限位的.
- BigInteger
- BigDecimal
package chapter03;
import java.math.BigInteger;
public class FirstSample {
public static void main(String[] args) {
BigInteger bi = new BigInteger("123456789112344454");
BigInteger result = bi.multiply(bi);
System.out.println(result);
}
}
3.10 数组
3.10.1 声明数组
- 长度不能改变
int[] a = new int[100];
var a = new int[100];
int[] smallPrimes = {1, 2, 3};
int[] a = new int[]{1, 2, 3};
- 创建长度为0的数组
new elementType[0]
new elementType[]{}
3.10.2 访问数组元素
package chapter03;
public class FirstSample {
public static void main(String[] args) {
int[] a = new int[10];
for (int i = 0; i < 10; i++) {
System.out.println(a[i]);
}
}
}
3.10.3 for each 循环
package chapter03;
public class FirstSample {
public static void main(String[] args) {
int[] a = new int[10];
for (int e : a) {
System.out.println(e);
}
}
}
3.10.4 数组拷贝
直接赋值将引用同一底层数组:
使用 Arrays.copyOf() 将原数据拷贝到新空间.
3.10.5 命令行参数
与 Go 不同, Java 的 args[0] 不从程序名开始.
3.10.6 数组排序
package chapter03;
import java.util.Arrays;
public class FirstSample {
public static void main(String[] args) {
int[] a = new int[]{1, 3, 5, 4, 7, 9, 2};
Arrays.sort(a);
System.out.println(Arrays.toString(a));
}
}
3.10.7 多维数组
double[][] balances;
balances = new double[NYEARS][NRATES];
package chapter03;
public class FirstSample {
public static void main(String[] args) {
int[][] a2 = new int[3][3];
System.out.println(a2[2][2]); // 直接使用
}
}
3.10.8 不规则数组
package chapter03;
public class FirstSample {
public static void main(String[] args) {
int[][] odds = new int[3][];
for (int i = 0; i < 3; i++) {
odds[i] = new int[i];
}
}
}