1. JAVA常用类概述
在JAVA开发中,常用类库是我们日常编码的基础工具集。这些经过精心设计的类,封装了大量常用功能,让我们不必重复造轮子。根据我十多年的JAVA开发经验,熟练掌握这些常用类不仅能提升开发效率,还能写出更健壮、更优雅的代码。
JAVA常用类主要分为以下几个大类:字符串处理类、集合框架类、日期时间类、数学运算类、IO流类和异常处理类。每个类都有其特定的使用场景和最佳实践,接下来我将结合实例详细解析这些核心类的使用技巧和注意事项。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 字符串处理类
2.1 String类深度解析
String是JAVA中最基础也最常用的类之一。但很多开发者并不真正理解它的特性:
java复制String str1 = "hello";
String str2 = new String("hello");
这两种创建方式有本质区别。第一种会检查字符串常量池,如果存在则直接引用,否则在池中创建;第二种则会在堆中新建对象。实际开发中,推荐使用第一种方式,除非确实需要新对象。
注意:String是不可变类,所有看似修改字符串的方法(如substring、replace)实际上都返回新对象。频繁拼接字符串会导致大量临时对象,影响性能。
2.2 StringBuilder和StringBuffer
对于需要频繁修改字符串的场景,应该使用StringBuilder(非线程安全)或StringBuffer(线程安全):
java复制StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" ").append("World");
String result = sb.toString();
性能测试表明,在循环10000次的字符串拼接中,StringBuilder比直接使用"+"快约100倍。StringBuffer由于同步锁,性能略低于StringBuilder,但在多线程环境下更安全。
3. 集合框架类
3.1 List接口及其实现类
ArrayList和LinkedList是最常用的List实现:
- ArrayList基于动态数组,随机访问快(O(1)),但插入删除慢(O(n))
- LinkedList基于双向链表,插入删除快(O(1)),但随机访问慢(O(n))
java复制List<String> arrayList = new ArrayList<>();
arrayList.add("Java");
arrayList.add("Python");
List<String> linkedList = new LinkedList<>();
linkedList.add("C++");
linkedList.add("Go");
实际选择时,如果查询多、修改少用ArrayList;如果频繁在中间位置插入删除,用LinkedList。
3.2 Map接口及其实现类
HashMap是最常用的Map实现,它使用哈希表存储键值对,平均时间复杂度为O(1):
java复制Map<String, Integer> map = new HashMap<>();
map.put("Java", 1);
map.put("Python", 2);
重要:HashMap的key对象必须正确实现hashCode()和equals()方法。默认容量是16,负载因子0.75,当元素数量超过容量*负载因子时会自动扩容。
对于需要排序的场景,可以使用TreeMap,它基于红黑树实现,能保持键的自然顺序:
java复制Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("Java", 1);
treeMap.put("Python", 2);
4. 日期时间类
4.1 Date和Calendar
传统的日期处理使用Date和Calendar类:
java复制Date now = new Date(); // 获取当前时间
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
calendar.add(Calendar.DAY_OF_MONTH, 1); // 加一天
但这两个类设计存在问题(如月份从0开始),在Java 8中已被新的日期时间API取代。
4.2 Java 8日期时间API
LocalDate、LocalTime和LocalDateTime是更好的选择:
java复制LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = now.format(formatter);
新API更直观、线程安全,且提供了丰富的日期计算方法。建议所有新项目都使用这套API。
5. 数学运算类
5.1 Math类
Math类提供了常用的数学运算方法:
java复制double sqrt = Math.sqrt(16); // 4.0
double pow = Math.pow(2, 3); // 8.0
long round = Math.round(3.6); // 4
对于精确计算,特别是金融领域,应该使用BigDecimal而不是double:
java复制BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal sum = a.add(b); // 0.3,不会出现浮点数精度问题
5.2 Random类
生成随机数可以使用Random类:
java复制Random random = new Random();
int num = random.nextInt(100); // 0-99的随机数
对于安全敏感的场景(如生成token),应该使用SecureRandom:
java复制SecureRandom secureRandom = new SecureRandom();
byte[] bytes = new byte[16];
secureRandom.nextBytes(bytes);
6. IO流类
6.1 文件操作
File类用于文件和目录操作:
java复制File file = new File("test.txt");
if(file.exists()) {
System.out.println("文件大小:" + file.length());
}
Java 7引入了更强大的Files和Paths工具类:
java复制Path path = Paths.get("test.txt");
byte[] bytes = Files.readAllBytes(path);
6.2 流操作
对于大文件,应该使用缓冲流提高性能:
java复制try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
使用try-with-resources语法可以自动关闭资源,避免内存泄漏。
7. 异常处理类
7.1 异常体系
Java异常分为检查型异常(IOException等)和非检查型异常(RuntimeException):
java复制try {
// 可能抛出异常的代码
} catch (IOException e) {
// 处理检查型异常
logger.error("IO错误", e);
} catch (Exception e) {
// 处理其他异常
logger.error("未知错误", e);
} finally {
// 清理资源
}
7.2 自定义异常
可以根据业务需求定义自己的异常类:
java复制public class BusinessException extends RuntimeException {
public BusinessException(String message) {
super(message);
}
}
好的异常处理应该:
- 记录完整的错误信息
- 给用户友好的提示
- 保持程序继续运行或优雅退出
8. 实用工具类
8.1 Objects类
Java 7引入的Objects工具类提供了安全的对象操作方法:
java复制String str = null;
String result = Objects.toString(str, "default"); // 避免NullPointerException
8.2 Arrays和Collections
这两个工具类提供了数组和集合的常用操作:
java复制int[] array = {3, 1, 2};
Arrays.sort(array);
List<String> list = new ArrayList<>();
Collections.sort(list);
Collections.reverse(list);
9. 类加载与反射
9.1 Class类
Class类是反射的基础,可以通过多种方式获取Class对象:
java复制Class<?> clazz1 = String.class;
Class<?> clazz2 = Class.forName("java.lang.String");
9.2 反射API
反射允许在运行时检查类、调用方法和访问字段:
java复制Method method = clazz.getMethod("substring", int.class);
String result = (String) method.invoke("Hello", 1); // "ello"
虽然反射强大,但会带来性能开销和安全风险,应该谨慎使用。
10. 最佳实践与性能优化
- 字符串处理:优先使用StringBuilder进行大量字符串拼接
- 集合选择:根据场景选择合适的集合实现,考虑线程安全需求
- 资源管理:使用try-with-resources确保资源释放
- 日期时间:新项目优先使用Java 8日期时间API
- 异常处理:不要吞掉异常,记录完整错误信息
- 性能敏感场景:避免过度使用反射
- 代码可读性:合理使用工具类简化代码
我在实际项目中总结的经验是,熟练掌握这些常用类后,开发效率可以提升30%以上。特别是在处理复杂业务逻辑时,选择合适的工具类往往能事半功倍。
