Java常用类(二)
好久不见,因工作原因,好久没发文了,OldWang 回来了,持续更新Java内容!
- ⭐ 不可变和可变字符序列使用陷阱
- ⭐ 时间处理相关类
- ⭐ Date 时间类(java.util.Date)
- ⭐ DateFormat 类和 SimpleDateFormat 类
- ⭐ Calendar 日历类
⭐ 不可变和可变字符序列使用陷阱
● 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);}
}
代码中的格式化字符的具体含义见表:
字母 | 日期或时间元素 | 表示 | 示例 |
---|---|---|---|
G | Era 标志符 | Text | AD |
y | 年 | Year | 1996;96 |
M | 年中的月份 | Month | July;july;07 |
w | 年中的周数 | Number | 27 |
W | 月份中的周数 | Number | 2 |
D | 年中的天数 | Number | 189 |
d | 月份中的天数 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天数 | Text | Tuesday;Tue |
a | Am/pm 标记 | Text | PM |
H | 一天中的小时数(0-23) | Number | 0 |
k | 一天中的小时数(1-24) | Number | 24 |
K | am/pm 中的小时数(0-11) | Number | 0 |
h | am/pm 中的小时数(1-12) | Number | 12 |
m | 小时中的分钟数 | Number | 30 |
s | 分钟中的秒数 | Number | 55 |
S | 毫秒数 | Number | 978 |
z | 时区 | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | 时区 | RFC 822 time zone | 0800 |
时间格式字符也可以为我们提供其他的便利。比如:获得当前时间是今年的第几天。
【示例】获取今天时本年度第几天
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); // 打印:2049int month = calendar.get(Calendar.MONTH); // 打印:9int day = calendar.get(Calendar.DAY_OF_MONTH); // 打印:1int 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,。。。周六是 7System.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-11calendar2.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); // 月份减 7calendar3.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);}
}
在此祝大家中秋快乐,我们下期再见!