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() 返回一个整数哈希值,常用于 HashMap、HashSet 等哈希结构。哈希码相同不代表对象一定相等,但 equals() 相等的对象必须具有相同哈希码。
clone() 方法
clone() 用于复制对象。直接调用 Object.clone() 的类通常需要实现 Cloneable 接口,否则会抛出 CloneNotSupportedException。默认克隆属于浅拷贝,引用字段仍可能指向同一个对象。
finalize() 方法
finalize() 不保证何时执行,也不适合释放文件、网络连接等资源。应使用 try-with-resources 或显式关闭方法管理资源,不要依赖 finalize()。
包装类
八种基本类型都有对应的包装类。
| 基本类型 | 包装类 |
|---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
包装类把基本类型值封装为对象,便于在泛型集合等只接受引用类型的场景中使用。
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 规范至少要求缓存 -128 到 127,更大的缓存范围可能由 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() 返回负数、零或正数,不保证只返回 -1、0、1。
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 类
StringBuilder 与 StringBuffer 提供相近的 API,也属于可变字符序列。
StringBuffer的主要方法带有同步控制,适合多个线程共享同一实例并同时修改的场景。StringBuilder不提供这种同步保证,单线程场景下一般开销更小。
大多数局部字符串拼接场景优先使用 StringBuilder。线程安全不能只根据类名判断,还要结合对象是否被多个线程共享以及整体操作是否具有原子性。
喜欢的话,留下你的评论吧~