• Java常用类(二)


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

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

    在这里插入图片描述

    ● 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));
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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

    ⭐ 时间处理相关类

    在这里插入图片描述

    “时间如流水,一去不复返”,时间是一维的。所以,我们需要一把刻度尺来表达和度
    量时间。在计算机世界,我们把 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 是一周中的某一天 。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    【示例】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);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ⭐ 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);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

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

    字母日期或时间元素表示示例
    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);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    ⭐ Calendar 日历类

    在这里插入图片描述

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

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

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

    【示例】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);
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

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

  • 相关阅读:
    数字驱动,营销赋能丨工商职院电子商务专业学生,前往餐饮美食电商新业态基地试岗交流
    LeetCode每日一题(1862. Sum of Floored Pairs)
    【C++】day3学习成果:类
    Python使用模拟退火(Simulated Annealing)算法构建优化器获取机器学习模型最优超参数组合(hyperparameter)实战+代码
    关于栈帧的一些知识点与理解
    stata17运行crtrees显示缺失值
    Vue3 生命周期
    【Rust—LeetCode题解】1656. 设计有序流
    wires hark抓包内容解析
    第1关:ODBC程序设计
  • 原文地址:https://blog.csdn.net/Wwd631255/article/details/133391878