JAVA记录

42 阅读3分钟

String、StringBuffer、StringBuilder区别

  1. 可变性:
  • String:不可变,一旦创建就不能修改其值
  • StringBuffer:可变,可以对其内容进行修改
  • StringBuilder:可变,可以对其内容进行修改
  1. 线程安全:
  • String:不可变,因此线程安全
  • StringBuffer:线程安全,方法有synchronized修饰
  • StringBuilder:非线程安全,但性能较好
  1. 性能:
  • String:每次修改都会创建新对象,性能较差
  • StringBuffer:线程安全机制导致性能略低
  • StringBuilder:性能最好,通常单线程环境下首选

BigInteger和BigDecimal的主要区别与使用:

  1. 应用场景:
  • BigInteger:用于表示任意精度的整数,当整数超出long的范围时使用
  • BigDecimal:用于表示任意精度的小数,主要用于金融计算等精度要求高的场景
  1. 精度与范围:
  • BigInteger:只能表示整数,但范围无限大
  • BigDecimal:可以表示小数,精度和范围都无限大
  1. 主要特点:
  • 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(字段)

主要缺点

  1. 设计缺陷:
  • Calendar中月份从0开始计数(0表示一月)
  • Date大部分方法已被废弃,功能有限
  1. 线程安全问题:
  • SimpleDateFormat和Calendar都不是线程安全的
  • 在多线程环境下使用容易导致问题
  1. 可变性问题:
  • Date和Calendar对象都是可变的
  • 作为参数传递或在集合中使用时可能导致意外修改
  1. API设计不直观:
  • Calendar的API设计复杂,使用不便
  • 日期计算和修改操作不够直观
  1. 格式化问题:
  • 格式化和解析需要使用额外的SimpleDateFormat类
  • 错误处理复杂且容易出错
  1. 时区处理困难:
  • Date本身不包含时区信息
  • 时区转换实现复杂

LocalDateTime的使用与优点

LocalDateTime主要优点

  1. 不可变性:LocalDateTime对象是不可变的,因此线程安全
  2. API设计直观:方法命名清晰易懂(如plusDays、withHour)
  3. 功能丰富:提供各种日期时间计算和操作方法
  4. 时区处理分离:与ZonedDateTime配合使用时更清晰
  5. 格式化灵活:通过DateTimeFormatter提供多种格式化选项
  6. 性能更好:比旧的Date和Calendar性能更高

LocalDateTime基本用法

  1. 创建日期时间:
  • LocalDateTime.now() - 获取当前日期时间
  • LocalDateTime.of(2023, 10, 1, 13, 45, 20) - 创建指定日期时间
  • LocalDateTime.of(localDate, localTime) - 从LocalDate和LocalTime创建
  1. 日期时间修改:
  • plusDays(1)、minusMonths(2) - 增减日期时间
  • withHour(10)、withMinute(30) - 修改特定字段
  • with(TemporalAdjusters.firstDayOfMonth()) - 使用调整器
  1. 日期时间获取:
  • getYear()、getMonthValue()、getDayOfMonth() - 获取日期部分
  • getHour()、getMinute()、getSecond() - 获取时间部分
  1. 日期时间比较:
  • isBefore()、isAfter()、isEqual() - 日期时间比较
  • Duration.between() - 计算时间差

DateTimeFormatter的使用

  1. 自定义格式:

 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");

  1. 格式化:

String formatted = localDateTime.format(formatter);

常用格式模式

  • y: 年
  • M: 月
  • d: 日
  • H: 小时(24小时制)
  • h: 小时(12小时制)
  • m: 分钟
  • s: 秒
  • S: 毫秒