java进阶打卡02

日期相关类(续)

  • 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
Java员工打卡签到代码的实现方式有很多种,以下是其中一种可能的实现方式: ```java import java.util.Date; public class Employee { private String name; private Date lastSignIn; public Employee(String name) { this.name = name; } public void signIn() { Date now = new Date(); System.out.println(name + "签到成功,时间:" + now); lastSignIn = now; } public void signOut() { Date now = new Date(); System.out.println(name + "签退成功,时间:" + now); } public void checkInStatus() { if (lastSignIn == null) { System.out.println(name + "尚未签到"); } else { System.out.println(name + "上次签到时间:" + lastSignIn); } } } ``` 上面的代码定义了一个`Employee`类,其中包含了员工的姓名和上次签到时间。类中有三个方法:`signIn()`、`signOut()`和`checkInStatus()`。`signIn()`方法表示员工签到,会打印出员工姓名和当前时间,并将当前时间记录为上次签到时间;`signOut()`方法表示员工签退,会打印出员工姓名和当前时间;`checkInStatus()`方法表示查询员工的签到状态,会打印出员工姓名和上次签到时间(如果已经签到过),否则会提示尚未签到。 如果要使用这段代码,可以在其他类中创建`Employee`对象,并调用其中的方法来完成打卡签到功能。例如: ```java public class Main { public static void main(String[] args) { Employee emp1 = new Employee("张三"); emp1.signIn(); emp1.checkInStatus(); emp1.signOut(); } } ``` 这段代码创建了一个名为`emp1`的`Employee`对象,姓名为“张三”。接着调用了`signIn()`方法进行签到,`checkInStatus()`方法查询签到状态,最后调用了`signOut()`方法进行签退。运行这段代码后,会打印出以下结果: ``` 张三签到成功,时间:Thu Jul 22 14:47:23 CST 2021 张三上次签到时间:Thu Jul 22 14:47:23 CST 2021 张三签退成功,时间:Thu Jul 22 14:47:28 CST 2021 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值