String、StringBuffer、StringBuilder区别
- 可变性:
- String:不可变,一旦创建就不能修改其值
- StringBuffer:可变,可以对其内容进行修改
- StringBuilder:可变,可以对其内容进行修改
- 线程安全:
- String:不可变,因此线程安全
- StringBuffer:线程安全,方法有synchronized修饰
- StringBuilder:非线程安全,但性能较好
- 性能:
- String:每次修改都会创建新对象,性能较差
- StringBuffer:线程安全机制导致性能略低
- StringBuilder:性能最好,通常单线程环境下首选
BigInteger和BigDecimal的主要区别与使用:
- 应用场景:
- BigInteger:用于表示任意精度的整数,当整数超出long的范围时使用
- BigDecimal:用于表示任意精度的小数,主要用于金融计算等精度要求高的场景
- 精度与范围:
- BigInteger:只能表示整数,但范围无限大
- BigDecimal:可以表示小数,精度和范围都无限大
- 主要特点:
- BigInteger:
- 支持任意大小的整数运算
- 提供位运算、最大公约数等特殊运算
- 不可变、线程安全
- BigDecimal:
- 解决浮点数计算精度问题
- 提供精确的小数运算
- 支持控制精度
- 不可变、线程安全
Date和Calendar类的使用与缺点:
Date类
基本使用:
- 创建日期对象:new Date() 或 new Date(long timestamp)
- 获取时间戳:date.getTime()
- 比较日期:date1.after(date2)、date1.before(date2)
- 格式化与解析需借助SimpleDateFormat
Calendar类
基本使用:
- 创建实例:Calendar.getInstance()
- 获取日期:calendar.getTime()
- 设置日期:calendar.set(字段, 值)
- 日期计算:calendar.add(字段, 值)
- 获取字段值:calendar.get(字段)
主要缺点
- 设计缺陷:
- Calendar中月份从0开始计数(0表示一月)
- Date大部分方法已被废弃,功能有限
- 线程安全问题:
- SimpleDateFormat和Calendar都不是线程安全的
- 在多线程环境下使用容易导致问题
- 可变性问题:
- Date和Calendar对象都是可变的
- 作为参数传递或在集合中使用时可能导致意外修改
- API设计不直观:
- Calendar的API设计复杂,使用不便
- 日期计算和修改操作不够直观
- 格式化问题:
- 格式化和解析需要使用额外的SimpleDateFormat类
- 错误处理复杂且容易出错
- 时区处理困难:
- Date本身不包含时区信息
- 时区转换实现复杂
LocalDateTime的使用与优点
LocalDateTime主要优点
- 不可变性:LocalDateTime对象是不可变的,因此线程安全
- API设计直观:方法命名清晰易懂(如plusDays、withHour)
- 功能丰富:提供各种日期时间计算和操作方法
- 时区处理分离:与ZonedDateTime配合使用时更清晰
- 格式化灵活:通过DateTimeFormatter提供多种格式化选项
- 性能更好:比旧的Date和Calendar性能更高
LocalDateTime基本用法
- 创建日期时间:
- LocalDateTime.now() - 获取当前日期时间
- LocalDateTime.of(2023, 10, 1, 13, 45, 20) - 创建指定日期时间
- LocalDateTime.of(localDate, localTime) - 从LocalDate和LocalTime创建
- 日期时间修改:
- plusDays(1)、minusMonths(2) - 增减日期时间
- withHour(10)、withMinute(30) - 修改特定字段
- with(TemporalAdjusters.firstDayOfMonth()) - 使用调整器
- 日期时间获取:
- getYear()、getMonthValue()、getDayOfMonth() - 获取日期部分
- getHour()、getMinute()、getSecond() - 获取时间部分
- 日期时间比较:
- isBefore()、isAfter()、isEqual() - 日期时间比较
- Duration.between() - 计算时间差
DateTimeFormatter的使用
- 自定义格式:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
- 格式化:
String formatted = localDateTime.format(formatter);
常用格式模式
- y: 年
- M: 月
- d: 日
- H: 小时(24小时制)
- h: 小时(12小时制)
- m: 分钟
- s: 秒
- S: 毫秒