第七章 常用类与集合框架
第一节 常用类与工具类
概述
本节内容围绕Java面向对象程序设计中的常用类和工具类展开。常用类和工具类是Java程序开发中不可或缺的基础部分,它们极大地简化了编程工作,提高了开发效率。通过本节的学习,考生将深入理解Java API中常用类的功能与使用方法,掌握工具类的设计理念及应用场景,为后续学习集合框架及复杂程序设计打下坚实基础。
学习目标
- 理解常用类的分类与基本功能
- 掌握工具类的设计特点与常见实现方式
- 深入了解String、Math、System等核心常用类的使用
- 通过实例熟练运用常用类解决实际问题
- 识别常见误区并掌握规范用法
核心概念
常用类:指Java标准库中频繁使用的类,如String、Math、System等,提供字符串操作、数学计算、系统功能访问等基础服务。
工具类:通常是由一系列静态方法组成的类,用于封装通用功能,便于代码复用和维护。工具类通常不需要实例化。
不可变对象(Immutable Object):对象一旦创建,其状态不能改变。String类即为典型的不可变类。
静态方法:不依赖于实例的类方法,通常用于工具类中,方便直接调用。
包装类:Java为基本数据类型提供的类,如Integer、Double等,常用以在集合中存储基本类型数据。
原理分析
常用类设计原理
- 高内聚低耦合:常用类职责单一,功能明确,方便维护和扩展。
- 封装性:隐藏内部实现细节,提供简单清晰的接口。
- 不可变设计:如String类,确保线程安全和性能优化。
工具类设计原则
- 静态方法提供通用服务,无状态,避免实例化开销。
- 私有构造方法防止实例化,保证类的工具性质。
- 方法命名规范,便于理解和调用。
详细内容
1. String类详解
String是Java中最常用的类之一,用于表示字符串。其核心特点和用法如下:
- 不可变性:String对象一旦创建,内容不能更改,每次修改都会生成新的String对象。
- 字符串池:为了节省内存,Java维护字符串常量池,重复字符串直接引用池中对象。
- 常用方法:length()、charAt()、substring()、indexOf()、equals()、compareTo()、toLowerCase()/toUpperCase()等。
示例代码:
String s1 = "Hello";
String s2 = s1.toLowerCase(); // 生成新字符串
System.out.println(s1); // Hello
System.out.println(s2); // hello
注意事项:
- 使用equals()方法进行字符串内容比较,避免用==比较地址。
- 避免频繁字符串拼接导致性能问题,推荐使用StringBuilder或StringBuffer。
2. Math类详解
Math类提供基本数学运算的静态方法,主要包括:
- 绝对值abs()
- 幂运算pow()
- 开方sqrt()
- 四舍五入round()
- 三角函数sin(), cos(), tan()
- 最大值max(), 最小值min()
- 随机数random()
示例代码:
int maxVal = Math.max(10, 20);
double root = Math.sqrt(25);
double randomNum = Math.random();
使用技巧:
- random()生成0.0至1.0之间的随机数,可结合数学运算实现范围限定。
- Math类方法均为静态,直接调用无需实例化。
3. System类详解
System类提供与系统相关的功能,常用方法包括:
- currentTimeMillis():获取当前时间戳(毫秒)
- arraycopy():数组复制功能
- exit():退出程序
- gc():请求垃圾回收
- getProperty():获取系统属性
示例代码:
long start = System.currentTimeMillis();
// 代码执行
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "毫秒");
注意事项:
- arraycopy()性能优于循环复制,适用于大批量数据处理。
- 使用exit()时要注意释放资源。
4. 包装类简介
包装类用于将基本数据类型包装成对象,便于在集合中使用。常见包装类有Integer、Double、Boolean等。
- 自动装箱(auto-boxing)和自动拆箱(auto-unboxing)简化使用。
- 包装类提供了转换和解析工具方法,如parseInt()、valueOf()等。
示例代码:
Integer num = 10; // 自动装箱
int n = num; // 自动拆箱
int parsed = Integer.parseInt("123");
5. 常用工具类设计特点
- 统一的静态工具方法封装
- 不允许创建实例,构造方法私有化
- 方法功能单一,便于复用和测试
实例分析
实例一:字符串处理工具类设计
背景:开发一个工具类,用于字符串去空格、判断空字符串和格式化输出。
分析:
- 设计为工具类,所有方法静态
- 提供isEmpty(String str)、trim(String str)、format(String template, Object... args)方法
代码示例:
public class StringUtils {
private StringUtils() { }
public static boolean isEmpty(String str) {
return str == null || str.trim().isEmpty();
}
public static String trim(String str) {
return str == null ? null : str.trim();
}
public static String format(String template, Object... args) {
return String.format(template, args);
}
}
结论:统一静态方法设计,方便调用,避免代码重复。
实例二:使用Math类计算圆的面积和周长
背景:编写程序计算半径为r的圆的面积和周长。
分析:
- 使用Math.PI获取圆周率
- 公式:面积=πr²,周长=2πr
代码示例:
public class CircleCalculator {
public static double area(double radius) {
return Math.PI * Math.pow(radius, 2);
}
public static double circumference(double radius) {
return 2 * Math.PI * radius;
}
}
结论:Math类简化数学计算,提高代码可读性。
实例三:利用System.arraycopy优化数组复制
背景:将一个数组部分元素复制到另一个数组。
分析:
- 使用System.arraycopy替代循环
- 参数包括源数组、起始索引、目标数组、目标起始索引、复制长度
代码示例:
int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[5];
System.arraycopy(src, 1, dest, 0, 3); // 复制src[1..3]到dest[0..2]
结论:arraycopy效率高,代码简洁。
常见误区
误区一:使用“==”判断字符串相等
- 错误:比较字符串内容应使用equals()方法。
- 正确:
str1.equals(str2)
误区二:频繁使用“+”拼接字符串
- 错误:大量字符串拼接影响性能。
- 正确:使用StringBuilder或StringBuffer进行拼接。
误区三:误用包装类导致空指针异常
- 错误:包装类对象为null时拆箱会抛异常。
- 正确:确保包装类对象非null再拆箱。
误区四:误用System.exit()导致程序异常终止
- 错误:不恰当调用会跳过资源释放。
- 正确:优先使用正常结束流程,必要时释放资源后调用exit。
误区五:误用System.arraycopy参数顺序
- 错误:参数顺序错误导致数组复制异常。
- 正确:仔细确认源数组、源起始下标、目标数组、目标起始下标、长度顺序。
应用场景
- 字符串处理模块:如用户输入验证、文本格式化、日志信息处理等。
- 数学计算程序:科学计算、图形绘制、游戏开发等涉及复杂数学运算的场景。
- 系统级编程:时间测量、性能分析、数组高效复制等。
- 工具类库开发:封装常用功能,供团队内部或开源使用,提高开发效率。
- 数据转换与解析:如将字符串转换为数值、日期处理等。
知识拓展
- StringBuilder与StringBuffer区别:StringBuilder非线程安全适合单线程,StringBuffer线程安全适合多线程环境。
- 正则表达式配合String类使用:用于复杂字符串匹配与替换。
- Java 8及以上的工具类增强:如Objects、Files、Collectors等工具类的使用。
- 自定义工具类设计模式:单例模式、工厂模式结合工具类应用。
- 性能优化技巧:减少对象创建、利用缓存机制提高效率。
总结回顾
本节重点围绕Java常用类与工具类展开,系统讲解了String、Math、System等核心类的设计理念、功能与使用方法。通过实例展示了工具类的设计范式和具体应用,强调了不可变对象和静态方法的重要性。课程还指出了常见误区,帮助考生避免错误用法。最后,通过实际应用场景和知识拓展,引导考生深入理解并灵活运用常用类和工具类,为面向对象程序设计的高级内容奠定基础。掌握本节内容,将极大提升编程能力和考试通过率。