lang包常用类

发布于 2026-07-29 08:43 更新于 2026-07-29 08:43 1499 字 8 min read ... 访问量

本文介绍了 Java.lang 包中常用的核心类,重点讲解了 Object 类的 toString()、equals()、hashCode() 和 clone() 方法,强调了重写 equals() 时需配合重写 hashCode(),并指出 finalize() 不应用于资源管理。同时,详细说明了八种基本类型的包装类(如 Integer)的使用方法、自动装箱拆箱机制以及字符串常量池和不可变性特性。最后对比了 StringBuffer 和 StringBuilder 的区别,推荐在单线程场景下使用 StringBuilder 进行字符串拼接。

java.lang 包常用类

java.lang 包中的类会被自动导入,使用时通常不需要编写 import 语句。

Object 类

Object 是 Java 类层次结构的根类,所有类都直接或间接继承它。

toString() 方法

toString() 返回对象的字符串表示。默认格式通常由类名、@ 和哈希码的十六进制形式组成,但它不是可靠的内存地址。

@Override
public String toString() {
    return "Person{name='" + name + "', age=" + age + "}";
}

equals() 方法

Object.equals() 默认与 == 效果相同,比较两个引用是否指向同一个对象。子类可以重写它,改为比较对象内容。

重写 equals() 时通常也要重写 hashCode(),保证内容相等的对象具有相同哈希码。

hashCode() 方法

hashCode() 返回一个整数哈希值,常用于 HashMapHashSet 等哈希结构。哈希码相同不代表对象一定相等,但 equals() 相等的对象必须具有相同哈希码。

clone() 方法

clone() 用于复制对象。直接调用 Object.clone() 的类通常需要实现 Cloneable 接口,否则会抛出 CloneNotSupportedException。默认克隆属于浅拷贝,引用字段仍可能指向同一个对象。

finalize() 方法

finalize() 不保证何时执行,也不适合释放文件、网络连接等资源。应使用 try-with-resources 或显式关闭方法管理资源,不要依赖 finalize()

包装类

八种基本类型都有对应的包装类。

基本类型包装类
byteByte
shortShort
intInteger
longLong
charCharacter
floatFloat
doubleDouble
booleanBoolean

包装类把基本类型值封装为对象,便于在泛型集合等只接受引用类型的场景中使用。

Integer 常用方法

推荐使用 Integer.valueOf() 创建或获取 Integer 对象,使用 Integer.parseInt() 把字符串转换为 int

Integer value1 = Integer.valueOf(3);
Integer value2 = Integer.valueOf("3");
int number1 = value1.intValue();
int number2 = Integer.parseInt("100");

Integer.valueOf() 会复用部分常用数值的缓存对象。Java 规范至少要求缓存 -128127,更大的缓存范围可能由 JVM 配置决定。

Integer value1 = Integer.valueOf(3);
Integer value2 = Integer.valueOf(3);
System.out.println(value1 == value2); // 通常为 true

Integer value3 = Integer.valueOf(300);
Integer value4 = Integer.valueOf(300);
System.out.println(value3 == value4); // 不应依赖该结果

比较包装类数值内容时应使用 equals(),不要使用 == 判断对象内容。

自动装箱与自动拆箱

JDK 5 开始支持自动装箱和自动拆箱。

Integer value = 3; // 自动装箱,相当于 Integer.valueOf(3)
int number = value; // 自动拆箱,相当于 value.intValue()

自动拆箱时如果包装类引用为 null,会抛出 NullPointerException

Integer value = null;
// int number = value; // 运行时抛出 NullPointerException

String 类

String 表示不可变字符序列。字符串对象创建后,其字符内容不能被修改;看似修改字符串的操作实际上会返回新字符串。

String text = "abcdefg";
String result = text.replace("bcd", "BCD");

System.out.println(text);   // abcdefg
System.out.println(result); // aBCDefg

String 实现了 CharSequence 接口,因此需要 CharSequence 参数的位置可以传入字符串。

String 的内部存储

不同 JDK 版本的实现不同。Java 8 的 String 主要使用 char[] 保存内容;较新的 JDK 使用 byte[] 配合编码标记实现紧凑字符串。学习和使用 String API 时不应依赖具体内部数组类型。

字符串常量池

字符串字面量会放入字符串常量池,相同字面量通常复用同一个对象。使用 new String() 会显式创建新对象。

String s1 = "ab";
String s2 = "ab";
System.out.println(s1 == s2); // true

String s3 = new String("ab");
String s4 = new String("ab");
System.out.println(s3 == s4); // false
System.out.println(s3.equals(s4)); // true

编译期可以确定的字符串常量表达式会被折叠。

String s1 = "ab";
String s2 = "a" + "b";
System.out.println(s1 == s2); // true

包含变量的拼接通常在运行期产生结果对象,不应使用 == 比较字符串内容。

String 常用方法

获取长度和字符

String text = "abcdefg";
System.out.println(text.length());
System.out.println(text.charAt(2));

比较字符串

equals() 比较内容是否相等,compareTo() 按字典顺序比较。compareTo() 返回负数、零或正数,不保证只返回 -101

System.out.println("abc".equals("abc"));
System.out.println("abc".compareTo("abd"));

查找和判断

String text = "abcdefgabc";

System.out.println(text.contains("cde"));
System.out.println(text.startsWith("abc"));
System.out.println(text.endsWith("abc"));
System.out.println(text.indexOf("abc"));
System.out.println(text.lastIndexOf("abc"));

找不到指定内容时,indexOf()lastIndexOf() 返回 -1

截取字符串

substring() 的结束索引不包含在结果中。

String text = "abcdefg";
System.out.println(text.substring(2));
System.out.println(text.substring(2, 5)); // cde

替换、拆分和大小写转换

String text = "abcbc";

System.out.println(text.replace("bc", "BC"));
System.out.println(Arrays.toString(text.split("b")));
System.out.println(text.toUpperCase());
System.out.println(text.toLowerCase());
System.out.println("  Java  ".trim());

split() 的参数是正则表达式。拆分点号、竖线等特殊字符时,需要按正则表达式规则转义。

字符串与字节数组

编码和解码时应明确指定字符集。

String text = "你好";
byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
String result = new String(bytes, StandardCharsets.UTF_8);
System.out.println(text.equals(result));

StringBuffer 类

StringBuffer 是内容可变的字符序列。它内部维护可扩容缓冲区,追加、插入或删除内容时通常不需要像 String 拼接那样反复创建大量中间对象。

StringBuffer buffer = new StringBuffer("a");
for (int i = 0; i < 10_000; i++) {
    buffer.append('a');
}
String result = buffer.toString();

构造器通常会根据初始字符串长度预留额外容量。缓冲区空间不足时会自动扩容,具体扩容策略属于实现细节。

StringBuffer 常用方法

StringBuffer buffer = new StringBuffer("Java");

buffer.append(" SE");
buffer.insert(4, " 8");
buffer.delete(4, 6);
buffer.reverse();

System.out.println(buffer);

常用方法包括 append()insert()delete()replace()reverse()

StringBuilder 类

StringBuilderStringBuffer 提供相近的 API,也属于可变字符序列。

  • StringBuffer 的主要方法带有同步控制,适合多个线程共享同一实例并同时修改的场景。
  • StringBuilder 不提供这种同步保证,单线程场景下一般开销更小。

大多数局部字符串拼接场景优先使用 StringBuilder。线程安全不能只根据类名判断,还要结合对象是否被多个线程共享以及整体操作是否具有原子性。

喜欢的话,留下你的评论吧~

... 访问量
© 2026 跨越星轨的客 @Hoshiumi
Powered by theme astro-koharu · Inspired by Shoka