Java常用类(二)

好久不见,因工作原因,好久没发文了,OldWang 回来了,持续更新Java内容!

⭐ 不可变和可变字符序列使用陷阱

在这里插入图片描述

● String 使用的陷阱

String 一经初始化后,就不会再改变其内容了。对 String 字符串的操作实际上是对其副本(原始拷贝)的操作,原来的字符串一点都没有改变。
比如:
String s =“a”; 创建了一个字符串
s = s+“b”; 实际上原来的"a"字符串对象已经丢弃了,现在又产生了另一个字符串s+“b”(也就是"ab")。 如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的时间和空间性能,甚至会造成服务器的崩溃。

相反,StringBuilder 和 StringBuffer 类是对原字符串本身操作的,可以对字符串进行修改而不产生副本拷贝或者产生少量的副本。因此可以在循环中使用。

【示例】String 和 StringBuilder 在字符串频繁修改时的效率测试

public class Test {
	public static void main(String[ ] args) {
		/**使用 String 进行字符串的拼接*/
		String str8 = "";
		long num1 = Runtime.getRuntime().freeMemory();//获取系统剩余内存空间
		long time1 = System.currentTimeMillis();//获取系统的当前时间
		for (int i = 0; i < 5000; i++) {
				str8 = str8 + i;//相当于产生了 5000 个对象
	}
		long num2 = Runtime.getRuntime().freeMemory();
		long time2 = System.currentTimeMillis();
			System.out.println("String 占用内存 : " + (num1 - num2));
			System.out.println("String 占用时间 : " + (time2 - time1));
		/**使用 StringBuilder 进行字符串的拼接*/
			StringBuilder sb1 = new StringBuilder("");
			long num3 = Runtime.getRuntime().freeMemory();
			long time3 = System.currentTimeMillis();
				for (int i = 0; i < 5000; i++) {
					sb1.append(i);
	}
			long num4 = Runtime.getRuntime().freeMemory();
			long time4 = System.currentTimeMillis();
				System.out.println("StringBuilder 占用内存 : " + (num3 - num4));
				System.out.println("StringBuilder 占用时间 : " + (time4 - time3));
	}
}

执行结果如图所示:
在这里插入图片描述

⭐ 时间处理相关类

在这里插入图片描述

“时间如流水,一去不复返”,时间是一维的。所以,我们需要一把刻度尺来表达和度
量时间。在计算机世界,我们把 1970 年 1 月 1 日 00:00:00 定为基准时间,每个度量单位是毫秒(1 秒的千分之一),如图所示。
在这里插入图片描述
我们用 long 类型的变量来表示时间,从基准时间前后几亿年都能表示。
这个“时刻数值”是所有时间类的核心值,年月日都是根据这个“数值”计算出来的。

我们工作学习涉及的时间相关类有如下这些:
在这里插入图片描述

⭐ Date 时间类(java.util.Date)

在标准 Java 类库中包含一个 Date 类。它的对象表示一个特定的瞬间,精确到毫秒。

🐟	Date() 分配一个 Date 对象,并初始化此对象为系统当前的日期和时间,可以精确到毫秒)。
🐟	Date(long date) 分配 Date 对象并初始化此对象,以表示自从标准基准时间以来的毫秒数。
🐟	boolean equals(Object obj) 比较两个日期的相等性。
🐟	long getTime() 返回毫秒数。
🐟	String toString() 把此 Date 对象转换为以下形式的 String:
 dow mon dd hh:mm:ss zzz yyyy 其中:dow 是一周中的某一天 。

【示例】Date 类的使用

	long nowNum = System.currentTimeMillis(); //当前时刻对应的毫秒数
	Date d = new Date(); //当前时刻的对象
	System.out.println(d.getTime()); //返回时间对应的毫秒数
	Date d2 = new Date(1000L * 3600 * 24 * 365 * 150); //距离 1970年 150 年
	System.out.println(d2);

⭐ DateFormat 类和 SimpleDateFormat 类

在这里插入图片描述

● DateFormat 类的作用

把时间对象转化成指定格式的字符串。反之,把指定格式的字符串转化成时间对象。
DateFormat 是一个抽象类,一般使用它的的子类 SimpleDateFormat 类来实现。

【示例】DateFormat 类和 SimpleDateFormat 类的使用

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
	public class TestDateFormat {
		public static void main(String[ ] args) throws ParseException {
			// new 出 SimpleDateFormat 对象
			SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd");
			// 将时间对象转换成字符串
			String daytime = s1.format(new Date());
			System.out.println(daytime);
			System.out.println(s2.format(new Date()));
			System.out.println(new SimpleDateFormat("hh:mm:ss").format(new Date()));
			// 将符合指定格式的字符串转成成时间对象.字符串格式需要和指定格式一致。
			String time = "2049-10-1";
			Date date = s2.parse(time);
			System.out.println("date1: " + date);
			time = "2049-10-1 20:15:30";
			date = s1.parse(time);
			System.out.println("date2: " + date);
	}
}

代码中的格式化字符的具体含义见表

字母日期或时间元素表示示例
GEra 标志符TextAD
yYear1996;96
M年中的月份MonthJuly;july;07
w年中的周数Number27
W月份中的周数Number2
D年中的天数Number189
d月份中的天数Number10
F月份中的星期Number2
E星期中的天数TextTuesday;Tue
aAm/pm 标记TextPM
H一天中的小时数(0-23)Number0
k一天中的小时数(1-24)Number24
Kam/pm 中的小时数(0-11)Number0
ham/pm 中的小时数(1-12)Number12
m小时中的分钟数Number30
s分钟中的秒数Number55
S毫秒数Number978
z时区General time zonePacific Standard Time; PST; GMT-08:00
Z时区RFC 822 time zone0800

时间格式字符也可以为我们提供其他的便利。比如:获得当前时间是今年的第几天。

【示例】获取今天时本年度第几天

import java.text.SimpleDateFormat;
import java.util.Date;
	public class TestDateFormat2 {
		public static void main(String[ ] args) {
			SimpleDateFormat s1 = new SimpleDateFormat("D");
			String daytime = s1.format(new Date());
			System.out.println(daytime);
	}
}

执行结果如图所示:
在这里插入图片描述

⭐ Calendar 日历类

在这里插入图片描述

Calendar 类是一个抽象类,为我们提供了关于日期计算的功能,比如:年、月、日、时、分、秒的展示和计算。

GregorianCalendar 是 Calendar 的子类,表示公历。

Notice!!!
注意月份的表示,一月是 0,二月是 1,以此类推,12 月是 11。 
因为大多数人习惯于使用单词而不是使用数字来表示月份,这样程序也许更易读,父类 Calendar 使用常量来表示月份:JANUARY、FEBRUARY 等等。

【示例】GregorianCalendar 类和 Calendar 类的使用

import java.util.*;
	public class TestCalendar {
		public static void main(String[ ] args) {
		// 得到相关日期元素
		GregorianCalendar calendar = new GregorianCalendar(2049, 9, 1, 22, 10, 50);
			int year = calendar.get(Calendar.YEAR); // 打印:2049
			int month = calendar.get(Calendar.MONTH); // 打印:9
			int day = calendar.get(Calendar.DAY_OF_MONTH); // 打印:1
			int day2 = calendar.get(Calendar.DATE); // 打印:1
			// 日:Calendar.DATE 和 Calendar.DAY_OF_MONTH 同义
			int date = calendar.get(Calendar.DAY_OF_WEEK); // 打印:1
			// 星期几 这里是:1-7.周日是 1,周一是 2,。。。周六是 7
		System.out.println(year);
		System.out.println(month);
		System.out.println(day);
		System.out.println(day2);
		System.out.println(date);
			// 设置日期
			GregorianCalendar calendar2 = new GregorianCalendar();
			calendar2.set(Calendar.YEAR, 2049);
			calendar2.set(Calendar.MONTH, Calendar.OCTOBER); // 月份数:0-11
			calendar2.set(Calendar.DATE, 1);
			calendar2.set(Calendar.HOUR_OF_DAY, 10);
			calendar2.set(Calendar.MINUTE, 20);
			calendar2.set(Calendar.SECOND, 23);
			printCalendar(calendar2);
			// 日期计算
			GregorianCalendar calendar3 = new GregorianCalendar(2049, 9, 1, 22, 10, 50);
			calendar3.add(Calendar.MONTH, -7); // 月份减 7
			calendar3.add(Calendar.DATE, 7); // 增加 7 天
			printCalendar(calendar3);
			// 日历对象和时间对象转化
			Date d = calendar3.getTime();
			GregorianCalendar calendar4 = new GregorianCalendar();
			calendar4.setTime(new Date());
	}
			static void printCalendar(Calendar calendar) {
			int year = calendar.get(Calendar.YEAR);
			int month = calendar.get(Calendar.MONTH) + 1;
			int day = calendar.get(Calendar.DAY_OF_MONTH);
			int date = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 星期几
			String week = "" + ((date == 0) ? "日" : date);
			int hour = calendar.get(Calendar.HOUR);
			int minute = calendar.get(Calendar.MINUTE);
			int second = calendar.get(Calendar.SECOND);
			System.out.printf("%d 年%d 月%d 日,星期%s %d:%d:%d\n", year, month, day, week, hour, minute, second);
	}
}

在此祝大家中秋快乐,我们下期再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

造次阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值