数据类型

基本数据类型

括号中表示字节数

  • 整形:byte (1), short (2), int (4), long (8)
  • 浮点型:float (4), double (8)
  • 字符型:char (2)
  • 布尔型:boolean (未作规定)
1
2
3
4
5
6
7
8
9
10
11
int i1 = 2147483647;
int i2 = 0xAABBCC; // 十六进制
long l1 = 9223372036854775807L; // long 型字面量后要加 L/l,否则会作为整形解析导致溢出

float f1 = 3.14f; // float 型字面量要加 f
double d1 = 3.142; // 不加 f 为 double 类型

boolean b1 = true;

char c1 = 'a'; // char 存储一个字符
char c2 = '字'; // 支持 Unicode 字符

引用类型

除基本数据类型之外的都是引用类型

  • 字符串 String
  • 数组
  • 接口

引用类型存储的是对象的地址

1
2
3
4
String s1 = "Hello";

int[] a = new int[] {1, 2, 3};
int[] b = {1 ,2 ,3};

String 是不可变的

常量

关键字 final

1
final double PI = 3.14;

var 关键字

可以使用 var 关键字定义变量,类型由编译器推导

1
var sb = new StringBuilder(); // 等价于 StringBuilder sb = new StringBuilder();

类型转换

自动类型转换

不允许缩窄

1
2
3
char a = 'a';
int b = a; // 得到 'a' 的 ASCII 码
double c = b;

强制类型转换

语法:(typeName) variableName

1
2
final double PI = 3.14;
int a = (int) PI; // 只保留整数部分,若数值较大可能溢出

字符串与其他类型的转换

  • 字符串转其他类型

    1. 调用对应类的 toString() 方法
    2. 利用 + 号自动转换
    3. 利用 String 类的 valueOf() 方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int i = 10;

    // i
    String s1 = Integer.toString(i);

    // ii
    String s2 = "" + num;

    // iii
    String s3 = String.valueOf(num);
  • 字符串转其他类型

    • 调用其他类型的 parse 方法
    1
    2
    String s = "123";
    int i = Interge.parseInt(s);

操作符

  • 算术运算符
    • +, -, *, / (整除), %(取余), ++, --
  • 关系运算符
    • ==, !=, >, >=, <, <=
  • 位运算符
    • &, |, ^ (位异或), ~ (位非), <<
    • >> 负数高位补 1, 正数高位补 0
    • >>> (无符号右移) 不管正负,高位都补 0
  • 逻辑运算符
    • &&, ||, !
  • 赋值运算符
    • =, 以及二元算术运算符或位运算符与 = 的组合(如 +=
  • 条件运算符
    • ?:

输入输出

输入

import java.util.Scanner; 导入 Scanner

1
2
3
4
5
Scanner sc = new Scanner(System.in);
String s1 = sc.next(); // 读取字符型,以空格分隔
String line1 = sc.nextLine(); // 读取一行
int a = sc.nextInt(); // 读取一个整数
float f1 = sc.nextFloat(); // 读取浮点数

除此之外,还有 nextLong, nextDouble, 以及 hasNext(), hasNextInt() 等: 如果还有相应的输入返回 true, 否则返回 false

1
var i = sc.hasNextInt() ? sc.nextInt() : 0;

输出

1
2
System.out.println(a);  // 输出并换行
System.out.print(a); // 输出后不换行

格式化输出

占位符含义
%d整数
%f浮点数
%s字符串
%x十六进制整数
%e科学计数法表示的浮点数

转义符:\n, \t, \\, \', \"

1
System.out.printf("%d, %d, %d\n", a, b, c);

流程控制

if…else

1
2
3
4
5
6
if( expression1 )
statements1;
else if( expression2 )
statements2;
else
statements3;

switch

1
2
3
4
5
6
7
8
9
10
11
switch( expression ){
case constant-expression1 :
// statements;
break; // 可选
case constant-expression2:
// statements;
break;
// ...
default :
// statements;
}
  • switch 的 expression 可以是 byte, short, int, char, String
  • case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量或字面量
  • break 是可选的,没有显式跳转时,会进入下一个 case 继续执行
  • 如果所有分支都不匹配,则执行 default 分支,该分支可选,且不需要 break 语句

switch 语句还有如下写法:

1
2
3
4
5
6
7
switch(grade){
case 'A' -> System.out.println("优秀");
case 'B','C' -> System.out.println("良好");
case 'D' -> System.out.println("及格");
case 'F' -> System.out.println("不及格");
default -> System.out.println("未知等级");
}

这种写法不需要 break, 只会执行一条分支。

for loop

1
2
for(init_expr; test_expr; update_expr)
statement;

增强 for 循环:

1
2
3
4
int[] numbers = {1,2,3,5,8};
for (var i : numbers){
System.out.printf("%d, ", i);
}

while loop

1
2
while( test-condition )
body
1
2
3
do{
body
} while( test-condition );

break & continue

  • break: 从 switch 或循环中跳出
    • 如果有多层循环,break 只能跳出当前所在的循环
  • continue: 跳过本次循环剩余的代码,开始下一次循环