语法

1、数据类型与类型转换

基础类型、包装类型、自动拆装箱、强制类型转换是高频内容。

2、流程控制与运算规则

自增、自减、三元表达式、取余与取模重点看求值顺序和边界值。

3、数组、集合和遍历方式

forforeachMap 查找都要会选。

1
2
3
4
5
List<Role> roles = roleService.find(null);
Map<Integer, Role> roleMap = new HashMap<>();
for (Role role : roles) {
roleMap.put(role.getId(), role);
}

对象

对象创建、构造器、this、无参构造、有参构造要一起看。JavaBean、反射、序列化、ORM 映射都依赖这些基础。

常见坑:

1、类里什么构造器都不写,编译器会补无参构造

2、只写了有参构造,编译器不会再补无参构造

3、很多框架默认就是通过无参构造 + setter 反射创建对象

1
2
3
4
5
6
7
public class User {
private String name;

public User(String name) {
this.name = name;
}
}

这种写法手动 new 没问题,但交给反射、序列化、ORM 时经常直接报错。

集合

遍历集合时,只读优先 foreach,依赖索引或需要修改元素时用 for

1
2
3
for (File file : files) {
System.out.println(file);
}

数据量上来以后,先看复杂度。ListMap 本质是用空间换时间。

1
2
3
4
5
List<Role> roles = roleService.find(null);
Map<Integer, Role> roleMap = new HashMap<>();
for (Role role : roles) {
roleMap.put(role.getId(), role);
}

数组初始化、数组拷贝、Arrays.toString、交并差集处理都很常用。

易错点

1、自增、自减和表达式求值顺序

2、取余 %Math.floorMod() 的差别

3、基本类型和包装类型之间的边界

4、字符串常量、StringBuilderStringBuffer 的使用场景

5、String.format() 和占位符格式

1
2
String text = String.format("订单号:%03d", 7);
String message = String.format("%1$d-%2$s", 99, "abc");

类型

无参构造影响反射;instanceof 要看继承边界;枚举常用于状态约束;泛型解决类型安全。

1
2
System.out.println((null instanceof UserReceivedStageDTO)); // false
System.out.println((new UserReceivedStageDTO() instanceof UserStageDTO)); // true

枚举重点记 3 个点:

1、枚举本质上是继承 Enum 的类

2、枚举实例天然是 static final

3、枚举比较优先用 ==

1
2
3
4
Color color = null;
if (color == Color.BLACK) {
System.out.println("black");
}

泛型重点记擦除:

1、运行时拿不到 Pair<String>.class

2、不能判断 x instanceof Pair<String>

3、? extends T 适合读,? super T 适合写

1
2
3
Pair<Integer> pair = new Pair<>(1, 2);
Pair<? extends Number> target = pair;
Number number = target.getFirst();