日期相关类(续)
- Calendar类
java.util.Calendar类:日历类。里边提供了很多操作日历字段的方法(YEAR、MONTH、DAY_OF_MONTH、HOUR)
Calendar类是一个抽象类,无法直接创建对象使用,里边有一个静态方法叫getInstance(),该方法返回了Calendar类的子类对象
1. 创建对象方式
(1)static Calendar getInstance() 使用默认时区和语言环境获得一个日历
例如: Calendar c = Calendar.getInstance(); // 多态
2. 成员方法
参数:
int field:日历类的字段,可以使用Calendar类的静态成员变量获取
public static final int YEAR = 1; 年
public static final int MONTH = 2; 月
public static final int DATE = 5; 月中的某一天
public static final int DAY_OF_MONTH = 5; 月中的某一天
public static final int HOUR = 10; 时
public static final int MINUTE = 12; 分
public static final int SECOND = 13; 秒
注意:四方的月份0-11 东方:1-12
(1)public int get(int field):返回给定日历字段的值。
例如: Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
System.out.println(year); // 2020
(2)public void set(int field, int value):将给定的日历字段设置为给定值。
例如: Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2022);
int year = c.get(Calendar.YEAR);
System.out.println(year); // 2088
注意: // 同时设置年月日,可以使用set的重载方法
c.set(2020,10,2);
(3)public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。(正数:增加;负数:减少)
例如: Calendar c = Calendar.getInstance();
c.add(Calendar.YEAR, 2);
int year = c.get(Calendar.YEAR);
System.out.println(year); // 2022
(4)public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
例如: Calendar c = Calendar.getInstance();
Date date = c.getTime();
System.out.println(date); // Tue Nov 03 08:07:02 CST 2020
System类
java.lang.System类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作。
在System类的API文档中,常用的方法有:
(1)public static long currentTimeMillis():返回以毫秒为单位的当前时间。
作用:用来测试程序的效率
练习:验证for循环打印数字1-9999所需要使用的时间(毫秒)
// 程序执行前,获取一次毫秒值
long s = System.currentTimeMillis();
for (int i = 1; i <= 9999; i++) {
System.out.println(i);
}
// 程序执行后,在获取一次毫秒值
long e = System.currentTimeMillis();
System.out.println("程序共耗时:" + (e - s) + "毫秒");
(2)public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):将数组中指定的数据拷贝到另一个数组中
参数: src - 原数组
srcPos - 原数组中的起始位置
dest - 目标数组
destPos - 目标数据中的起始位置
length - 要复制的数组元素的数量
练习: 将src数组中前3个元素,复制到dest数组的前3个位置上
复制元素前:src数组元素[1, 2, 3, 4, 5],dest数组元素[6, 7, 8, 9, 10]
复制元素后:src数组元素[1, 2, 3, 4, 5],dest数组元素[1, 2, 3, 9, 10]
int[] src = {1, 2, 3, 4, 5};
int[] dest = {6, 7, 8, 9, 10};
System.out.println("复制前:" + Arrays.toString(dest)); // [6, 7, 8, 9, 10]
// 将src数组中前3个元素,复制到dest数组的前3个位置上
System.arraycopy(src, 0, dest, 0, 3);
System.out.println("复制后:" + Arrays.toString(dest));// [1, 2, 3, 9, 10]
StringBuilder类
A. String类:
字符串是常量;它们的值在创建之后不能更改。
字符串的底层是一个被final修饰的数组,不能改变,是一个常量
private final byte[] value;
进行字符串的相加,内存中就会有多个字符串,占用空间多,效率低下
String s = "a" + "b" + "c" = "abc";
String s :"a","b","c" 3个字符串
"a"+"b" "ab" 1个字符串
"ab"+"c" "abc" 1个字符串
B. StringBuilder类:
字符串缓冲区,可以提高字符串的操作效率(看成一个长度可以变化的字符串)
底层也是一个数组,但是没有被final修饰,可以改变长度
byte[] value = new byte[16];
"a" + "b" + "c" = "abc"
"a" "b" "c" "" ""
0 1 2 3 4-15
StringBuilder在内存中始终是一个数组,占用空间少,效率高
如果超出了StringBuilder的容量,会自动的扩容
1. 构造方法:
(1)public StringBuilder():创建一个空的字符串缓冲区对象
例如: StringBuilder bu1 = new StringBuilder();
System.out.println("bu1:" + bu1); // bu1:
(2)public StringBuilder(String str):根据传入的内容创建一个字符串缓冲区对象
例如: StringBuilder bu2 = new StringBuilder("abc");
System.out.println("bu2:" + bu2); // bu2:abc
2.成员方法:
(1)public StringBuilder append(...):添加任意类型数据的字符串形式,并返回当前对象自身。
例如: StringBuilder bu1 = new StringBuilder();
bu1.append("abc");
bu1.append(1);
System.out.println(bu1); // abc1
// 链式编程:方法的返回值是一个对象,可以根据对象继续调用方法
// bu1.append("abc").append(1);
// System.out.println(bu1); // abc1
注意:
1. 参数可以是任意的数据类型
2. apend方法返回的是this,调用方法的对象bu1,因此使用append方法无需接收返回值
(2)public StringBuilder reverse(); 反转内容
例如: StringBuilder sb = new StringBuilder();
sb.append("hello").append("world");
sb.reverse();
System.out.println(sb); // dlrowolleh