Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Java 基础

基本概念

var关键词

var 是局部变量类型推断(local variable type inference),它的意思不是“动态类型”,而是让编译器根据右边的表达式自动推断变量类型,只允许用于“方法内部 + 有明确初始化表达式”的局部变量,且方法签名必须显式声明,不能隐式推断。

场景能否使用 var示例
方法内部局部变量var x = 10;
增强 for 循环变量for (var item : list) {}
普通 for 循环变量for (var i = 0; i < 10; i++) {}
try-with-resourcestry (var in = new FileInputStream("a.txt")) {}
Lambda 参数(Java 11+)(var x, var y) -> x + y
成员变量(字段)class A { var x = 10; }
方法参数void test(var x) {}
构造器参数A(var x) {}
方法返回类型public var test() {}
未初始化变量var x;
初始化为 nullvar x = null;
数组字面量(无 new)var arr = {1,2,3};
数组(带 new)var arr = new int[]{1,2,3};

基本类型

类型大小默认值(成员变量)取值范围
byte1 字节0-128 ~ 127
short2 字节0-32,768 ~ 32,767
int4 字节0-2³¹ ~ 2³¹-1
long8 字节0L-2⁶³ ~ 2⁶³-1
float4 字节0.0f±1.4E-45 ~ ±3.4E38
double8 字节0.0d±4.9E-324 ~ ±1.7E308
char2 字节‘\u0000’0 ~ 65535
booleanJVM相关(通常1字节)falsetrue / false

包装类

自动装箱(Autoboxing)是指 Java 编译器在基本数据类型和其对应的包装类之间进行的自动转换机制,例如将 int 自动转换为 Integer。当把基本类型赋值给包装类,或在集合中使用基本类型时,编译器会自动调用对应的 valueOf() 方法完成转换;反过来,把包装类赋值给基本类型时,会自动调用如 intValue() 这样的方法完成拆箱。

对比项基本类型 (primitive)包装类 (wrapper)
是否是对象❌ 不是✅ 是对象
是否有方法❌ 没有✅ 有方法
是否可以为 null❌ 不可以✅ 可以
存储位置栈内存(局部变量)堆内存
默认值(成员变量)0 / falsenull
是否支持泛型❌ 不支持✅ 支持
性能更高略低(对象开销)
可用于集合❌ 不行✅ 可以

字符串

String 的不可变性指的是:一旦 String 对象被创建,它的内容就不能被修改。任何看似“修改”字符串的操作(例如拼接、replace 等)都会创建一个新的 String 对象,而不是改变原有对象的内容。正因为这种不可变特性,String 才能够实现线程安全、支持字符串常量池复用、并且可以安全地作为 HashMap 的 key 使用。

String 的常见操作:

分类方法作用常见用途
长度length()获取长度双指针、边界判断
取字符charAt(i)获取指定位置字符遍历字符串
转数组toCharArray()转成 char[]原地修改、排序
子串substring(begin, end)截取子串滑动窗口
比较equals()比较内容判等
equalsIgnoreCase()忽略大小写字符串匹配
查找indexOf()查找字符/子串位置子串问题
lastIndexOf()从后查找反向匹配
判断contains()是否包含子串子串存在判断
startsWith()是否以某字符串开头前缀判断
endsWith()是否以某字符串结尾后缀判断
替换replace()替换字符/字符串字符替换
replaceAll()正则替换模式替换
分割split()按分隔符拆分字符串解析
去空格trim()去首尾空格输入清洗
拼接concat()拼接字符串少用,常用 +
大小写toLowerCase()转小写忽略大小写题
toUpperCase()转大写规范化处理
转数字valueOf()基本类型转字符串输出
Integer.parseInt()字符串转 int数字题

String 类上的静态方法:

方法作用常见用途
String.valueOf()将基本类型或对象转为字符串输出转换
String.format()格式化字符串模板拼接
String.join()用分隔符拼接多个字符串拼接列表
String.copyValueOf()将 char[] 转为 String字符数组转字符串

StringBuilder 是一个可变字符串类,String 不可变,StringBuilder 可修改,不会每次创建新对象,它主要用于频繁拼接字符串和构造字符串。

方法作用常见用途
append()追加内容拼接字符串
insert(index, str)指定位置插入构造字符串
delete(start, end)删除区间删除字符
deleteCharAt(index)删除单个字符回溯
replace(start, end, str)替换区间字符串修改
reverse()反转字符串回文题
charAt(index)获取字符读取
setCharAt(index, ch)修改字符原地修改
length()当前长度边界控制
capacity()当前容量性能优化
toString()转为 String返回结果

数组

Java 数组在创建时必须指定长度,且一旦创建,长度不可变。

方法作用常见用途
sort()排序排序数组(算法题高频)
binarySearch()二分查找已排序数组查找
toString()打印一维数组调试输出
deepToString()打印多维数组二维数组调试
equals()比较一维数组内容判断数组相等
deepEquals()比较多维数组二维数组比较
fill()填充数组初始化
copyOf()复制数组扩容/截断
copyOfRange()复制指定区间子数组
asList()数组转 List集合转换
stream()数组转 Stream函数式处理
parallelSort()并行排序大数组优化

内存模型

对比项栈内存(Stack)堆内存(Heap)常量池(Constant Pool)
存储内容局部变量、方法调用信息对象实例常量、字符串常量
是否线程共享❌ 不共享(线程私有)✅ 共享✅ 共享
生命周期随方法结束释放由 GC 回收随类加载存在
存储数据类型基本类型值、对象引用对象本身字面量常量
是否有 GC❌ 无✅ 有部分由 GC 管理
访问速度相对慢

流程控制

增强 for 循环

增强 for 循环是 Java 5 引入的语法糖,用于 简化对数组或集合的遍历。

for (元素类型 变量 : 集合或数组) {
    // 使用变量
}

增强 for 循环本质上是:

Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String s = it.next();
}

case 语句

传统 switch 必须写 break,否则会 fall-through:

int day = 2;

switch (day) {
    case 1:
        System.out.println("Monday");
        break;
    case 2:
        System.out.println("Tuesday");
        break;
    default:
        System.out.println("Other");
}

Java 14 引入了 switch expression,不需要写 break,不会 fall-through

switch (day) {
    case 1 -> System.out.println("Monday");
    case 2 -> System.out.println("Tuesday");
    default -> System.out.println("Other");
}

此外,可以有返回值:

String result = switch (day) {
    case 1, 2 -> "Workday";
    default -> "Other";
};

复杂逻辑用 yield:

String result = switch (day) {
    case 1 -> {
        System.out.println("Processing...");
        yield "Monday";
    }
    default -> "Other";
};

异常处理

异常的结构

Java 所有异常都继承自 java.lang.Throwable,结构如下

Throwable
├── Error // 表示 JVM 级别错误,一般程序无法恢复,不建议捕获
└── Exception
      ├── RuntimeException // unchecked exception
      └── 其他受检异常(Checked Exception) // 必须显式处理(try-catch 或 throws)

异常的处理

  1. try-catch

try {
    int a = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("Error");
}
  1. throws

public void readFile() throws IOException {
}
  1. finally

try {
    ...
} catch (...) {
    ...
} finally {
    // 一定执行
}