JAVA高级编程第五章
JAVA高级编程
文章目录
- JAVA高级编程
- 第五章 实用类补充
- StringBuffer类
- 类定义与特点
- 比较
- StringBuffer vs StringBuilder
- StringBuffer vs String
- 构造方法
- 主要方法
- 追加方法
- 插入方法
- 删除方法
- 其他方法
- 使用示例
- Date类
- 类定义与特点
- 构造方法
- 方法
- 获取时间
- 设置时间
- 比较方法
- SimpleDateFormat类
- 类定义与特点
- 常用模式字母
- 构造方法
- 主要方法
- 格式化日期(Date -> String)
- 解析日期(String -> Date)
- 其他方法
- Calendar类
- 基本介绍
- 方法
- get()
- set()
- add()
- getTimeInMillis()
- 常用常量
- 注意事项
第五章 实用类补充
StringBuffer类
StringBuffer
是 Java 中用于处理可变字符串的一个重要类,位于 java.lang
包中。它是线程安全的可变字符序列,适用于需要频繁修改字符串内容的场景。
类定义与特点
public final class StringBufferextends AbstractStringBuilderimplements Serializable, CharSequence
- 线程安全:所有公共方法都使用同步(synchronized)保证线程安全
- 可变性:可以修改内容而不创建新对象
- 继承关系:继承自
AbstractStringBuilder
抽象类 - 可序列化:实现了
Serializable
接口 - final类:不能被继承
比较
StringBuffer vs StringBuilder
特性 | StringBuffer | StringBuilder |
---|---|---|
线程安全 | 安全(方法同步) | 不安全 |
性能 | 稍低 | 更高 |
版本 | Java 1.0 | Java 5 |
使用场景 | 多线程环境 | 单线程环境 |
StringBuffer vs String
特性 | StringBuffer | String |
---|---|---|
可变性 | 可变 | 不可变 |
线程安全 | 安全 | 安全(因为不可变) |
性能 | 修改操作高效 | 修改操作低效 |
构造方法
构造方法 | 描述 |
---|---|
StringBuffer() | 创建初始容量为16的空缓冲区 |
StringBuffer(int capacity) | 创建指定初始容量的空缓冲区 |
StringBuffer(CharSequence seq) | 创建包含指定CharSequence内容的缓冲区 |
StringBuffer(String str) | 创建包含指定字符串内容的缓冲区 |
主要方法
追加方法
StringBuffer append(boolean b)
StringBuffer append(char c)
StringBuffer append(char[] str)
StringBuffer append(double d)
StringBuffer append(float f)
StringBuffer append(int i)
StringBuffer append(long l)
StringBuffer append(Object obj)
StringBuffer append(String str)
StringBuffer append(StringBuffer sb)
插入方法
StringBuffer insert(int offset, boolean b)
StringBuffer insert(int offset, char c)
StringBuffer insert(int offset, char[] str)
StringBuffer insert(int offset, double d)
StringBuffer insert(int offset, float f)
StringBuffer insert(int offset, int i)
StringBuffer insert(int offset, long l)
StringBuffer insert(int offset, Object obj)
StringBuffer insert(int offset, String str)
删除方法
StringBuffer delete(int start, int end)
StringBuffer deleteCharAt(int index)
其他方法
int capacity() // 返回当前容量
char charAt(int index) // 返回指定位置字符
StringBuffer reverse() // 反转字符序列
void setCharAt(int index, char ch) // 设置指定位置字符
void setLength(int newLength) // 设置字符序列长度
String substring(int start) // 返回子字符串
String substring(int start, int end) // 返回指定范围子字符串
void trimToSize() // 尝试减少存储空间
使用示例
StringBuffer sb = new StringBuffer();// 追加内容
sb.append("Hello");
sb.append(" ");
sb.append("World");// 插入内容
sb.insert(5, ",");// 删除内容
sb.delete(5, 6);// 替换字符
sb.setCharAt(4, '!');System.out.println(sb.toString()); // 输出: Hell! World
Date类
java.util.Date
类是 Java 中用于表示特定时间点的类,它存储的是自 1970年1月1日00:00:00 GMT (称为"纪元"或"Unix时间戳")以来的毫秒数。
类定义与特点
public class Dateimplements Serializable, Cloneable, Comparable<Date>
主要特点:
- 表示时间:精确到毫秒级别
- 可变的:Date对象创建后可以被修改(但大多数方法已废弃)
- 大部分方法已过时:被
Calendar
和新的日期时间API (java.time
) 取代
构造方法
构造方法 | 描述 |
---|---|
Date() | 创建一个表示当前时间的Date对象 |
Date(long date) | 根据指定的毫秒数创建Date对象 |
方法
获取时间
方法 | 描述 |
---|---|
long getTime() | 返回自1970年1月1日以来的毫秒数 |
int getYear() | 已废弃 - 使用Calendar或java.time |
---|---|
int getMonth() | 已废弃 - 使用Calendar或java.time |
int getDate() | 已废弃 - 使用Calendar或java.time |
设置时间
方法 | 描述 |
---|---|
void setTime(long time) | 设置Date对象的时间 |
void setYear(int year) | 已废弃 |
---|---|
void setMonth(int month) | 已废弃 |
void setDate(int date) | 已废弃 |
比较方法
方法 | 描述 |
---|---|
boolean after(Date when) | 检查是否在指定日期之后 |
boolean before(Date when) | 检查是否在指定日期之前 |
int compareTo(Date anotherDate) | 比较两个日期的顺序 |
示例
package Test;import java.util.Date;public class Test1 {public static void main(String[] args) {//创建表示当前时间的Date对象Date date = new Date();System.out.println(date);//获取毫秒数long time = date.getTime();System.out.println( time);//创建表示指定毫秒数的Date对象Date date1 = new Date(time + 3600000);System.out.println(date1);//检查是否在指定日期之后System.out.println(date.after(date1));//检查是否在指定日期之前System.out.println(date.before(date1));//比较两个日期的顺序System.out.println(date.compareTo(date1));}
}
SimpleDateFormat类
SimpleDateFormat
是 Java 中用于格式化和解析日期时间的类,属于 java.text
包。它可以将 Date
对象格式化为特定模式的字符串,也可以将符合模式的字符串解析为 Date
对象。
类定义与特点
public class SimpleDateFormatextends DateFormat
- 非线程安全:多个线程不能共享同一个 SimpleDateFormat 实例
- 模式敏感:使用特定的模式字符串定义格式
- 区域敏感:可以根据不同的 Locale 显示本地化的日期格式
常用模式字母
字母 | 含义 | 示例 |
---|---|---|
y | 年 | yyyy → 2023, yy → 23 |
M | 月 | MM → 07, MMM → 七月(中文), MMMM → 七月(中文) |
d | 日 | dd → 15 |
H | 小时(0-23) | HH → 14 |
h | 小时(1-12) | hh → 02 |
m | 分钟 | mm → 30 |
s | 秒 | ss → 45 |
S | 毫秒 | SSS → 789 |
E | 星期 | E → 周一(中文), EEEE → 星期一(中文) |
a | 上午/下午 | a → 下午(中文) |
构造方法
构造方法 | 描述 |
---|---|
SimpleDateFormat() | 使用默认模式和默认语言环境的日期格式 |
SimpleDateFormat(String pattern) | 使用给定模式和默认语言环境 |
SimpleDateFormat(String pattern, Locale locale) | 使用给定模式和指定语言环境 |
主要方法
格式化日期(Date -> String)
String format(Date date)
import java.text.SimpleDateFormat;
import java.util.Date;public class FormatExample {public static void main(String[] args) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String formatted = sdf.format(new Date());System.out.println("当前时间: " + formatted);// 输出示例: 当前时间: 2023-07-25 14:30:45}
}
解析日期(String -> Date)
Date parse(String source) throws ParseException
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class ParseExample {public static void main(String[] args) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");try {Date date = sdf.parse("2023/07/25");System.out.println("解析后的日期: " + date);} catch (ParseException e) {System.out.println("日期解析失败: " + e.getMessage());}}
}
其他方法
方法 | 描述 |
---|---|
void applyPattern(String pattern) | 应用新的日期模式 |
void setTimeZone(TimeZone zone) | 设置时区 |
void setLenient(boolean lenient) | 设置是否宽松解析(默认true) |
Calendar类
Calendar
类是 Java 中用于处理日期和时间的抽象类,它提供了比 Date
类更丰富的日期操作功能。
基本介绍
Calendar
类位于 java.util
包中,是一个抽象类,不能直接实例化。通常使用其子类 GregorianCalendar
或通过 getInstance()
方法获取实例。
Calendar calendar = Calendar.getInstance(); // 获取当前日期时间的Calendar对象
方法
get()
获取日期时间字段
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH); // 注意:月份从0开始(0-11)
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 24小时制
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
set()
设置日期时间
calendar.set(Calendar.YEAR, 2023);
calendar.set(Calendar.MONTH, Calendar.JANUARY); // 使用常量更安全
calendar.set(Calendar.DAY_OF_MONTH, 15);
add()
设置时间计算
calendar.add(Calendar.DAY_OF_MONTH, 5); // 加5天
calendar.add(Calendar.MONTH, -2); // 减2个月
getTimeInMillis()
获取时间戳
long timeInMillis = calendar.getTimeInMillis();
Date date = calendar.getTime();
常用常量
YEAR
- 年MONTH
- 月 (0-11)DAY_OF_MONTH
- 月中的日HOUR_OF_DAY
- 24小时制的小时MINUTE
- 分钟SECOND
- 秒MILLISECOND
- 毫秒DAY_OF_WEEK
- 星期几 (周日=1, 周六=7)WEEK_OF_YEAR
- 年中的周数
注意事项
- 月份从0开始:1月是0,12月是11
- 线程不安全:
Calendar
不是线程安全的 - 时区问题:默认使用系统时区,可以设置时区
calendar.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
date = calendar.getTime();
#### 常用常量- `YEAR` - 年
- `MONTH` - 月 (0-11)
- `DAY_OF_MONTH` - 月中的日
- `HOUR_OF_DAY` - 24小时制的小时
- `MINUTE` - 分钟
- `SECOND` - 秒
- `MILLISECOND` - 毫秒
- `DAY_OF_WEEK` - 星期几 (周日=1, 周六=7)
- `WEEK_OF_YEAR` - 年中的周数#### 注意事项1. **月份从0开始**:1月是0,12月是11
2. **线程不安全**:`Calendar` 不是线程安全的
3. **时区问题**:默认使用系统时区,可以设置时区```java
calendar.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));