1. JAVA常用类概述
在Java开发中,常用类库是我们日常编码的基础工具包。这些经过精心设计的类,封装了大量实用功能,能显著提升开发效率。我从业十年来,从初级工程师到架构师,深刻体会到熟练掌握这些常用类对代码质量和开发速度的影响。
Java常用类主要分为三大类:基础类型包装类、字符串处理类和工具类。它们分布在java.lang和java.util这两个核心包中,无需额外导入即可使用。这些类经过20多年的迭代优化,在性能、线程安全和API设计上都达到了工业级水准。
提示:虽然这些类看似简单,但每个类背后都蕴含着精妙的设计思想。比如String的不可变性设计,就解决了字符串池、线程安全等一系列问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心类库解析
2.1 包装类(Wrapper Classes)
Java的8种基本类型都有对应的包装类:
| 基本类型 | 包装类 | 缓存范围 |
|---|---|---|
| byte | Byte | -128~127 |
| short | Short | -128~127 |
| int | Integer | -128~127 |
| long | Long | -128~127 |
| float | Float | 无缓存 |
| double | Double | 无缓存 |
| char | Character | 0~127 |
| boolean | Boolean | true/false |
自动装箱拆箱是包装类的核心特性:
java复制Integer a = 100; // 自动装箱
int b = a; // 自动拆箱
注意:包装类对象间的比较应该使用equals()而非==。因为==比较的是对象引用,而equals比较的是值。
2.2 字符串处理类
2.2.1 String类
String是最常用的不可变类,其底层从JDK9开始改用byte[]存储:
java复制public final class String {
private final byte[] value;
private final byte coder; // 0-Latin1, 1-UTF16
}
关键方法:
- length():返回字符串长度
- charAt(int):获取指定位置字符
- substring(int, int):截取子串
- equals(Object):内容比较
2.2.2 StringBuilder和StringBuffer
两者都继承自AbstractStringBuilder,主要区别:
- StringBuilder:非线程安全,性能更高(推荐使用)
- StringBuffer:线程安全,方法加synchronized
java复制StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" ").append("World");
String result = sb.toString(); // "Hello World"
2.3 工具类
2.3.1 Arrays类
提供数组操作的各种静态方法:
java复制int[] arr = {3,1,4,2};
Arrays.sort(arr); // [1,2,3,4]
int index = Arrays.binarySearch(arr, 3); // 2
2.3.2 Collections类
集合工具类,常用方法:
- sort(List):排序
- shuffle(List):随机打乱
- reverse(List):反转顺序
- synchronizedList(List):返回线程安全集合
3. 高级特性与最佳实践
3.1 不可变对象设计
String的不可变性带来了诸多优势:
- 线程安全:无需同步
- 缓存哈希值:提升性能
- 字符串池优化:减少内存占用
实现不可变类的要点:
- 类声明为final
- 所有字段设为private final
- 不提供setter方法
- 返回新对象而非修改内部状态
3.2 对象拷贝策略
Java中的对象拷贝分为浅拷贝和深拷贝:
- 浅拷贝:Object.clone()默认实现
- 深拷贝:需要递归复制所有引用对象
实现深拷贝的几种方式:
- 手动逐个字段复制
- 序列化/反序列化
- 使用第三方库如Apache Commons Lang
3.3 性能优化技巧
- 字符串拼接优先使用StringBuilder
java复制// 反例 - 产生多个临时String对象
String s = "a" + "b" + "c";
// 正例
StringBuilder sb = new StringBuilder();
sb.append("a").append("b").append("c");
- 使用valueOf()代替toString()
java复制Integer i = 100;
String s = String.valueOf(i); // 优于i.toString()
- 避免在循环中创建对象
java复制// 反例
for(int i=0; i<1000; i++) {
String s = new String("test");
}
// 正例
String template = "test";
for(int i=0; i<1000; i++) {
String s = template;
}
4. 常见问题排查
4.1 NumberFormatException异常
当字符串转换为数字失败时抛出:
java复制try {
int num = Integer.parseInt("123a");
} catch (NumberFormatException e) {
System.out.println("非法数字格式");
}
解决方案:
- 使用正则表达式预校验
- 捕获异常并提供默认值
4.2 NullPointerException处理
包装类的自动拆箱可能引发NPE:
java复制Integer a = null;
int b = a; // 抛出NullPointerException
防御性编程建议:
- 使用Objects.requireNonNull()校验
- 优先使用基本类型
- 使用Optional包装可能为null的值
4.3 日期时间处理
新版Java日期API(java.time包)解决了旧API的线程安全问题:
java复制LocalDate today = LocalDate.now();
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = now.format(formatter);
5. 实战应用案例
5.1 字符串加密工具
基于String和MessageDigest实现MD5加密:
java复制public static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
return HexFormat.of().formatHex(digest);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
5.2 对象深拷贝工具
使用序列化实现深拷贝:
java复制public static <T> T deepCopy(T obj) throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (T) ois.readObject();
}
5.3 集合排序优化
使用Comparator进行多字段排序:
java复制List<Person> persons = new ArrayList<>();
// 添加元素...
persons.sort(Comparator
.comparing(Person::getLastName)
.thenComparing(Person::getFirstName)
.thenComparingInt(Person::getAge));
在实际项目中,合理使用这些常用类可以显著提升代码质量。我建议新手开发者至少花两周时间系统学习这些核心类库,理解它们的实现原理和使用场景。这比盲目学习各种框架更有长远价值。
