StringBuilder类, StringBuffer类, 概念,常用方法等
Date类, Calendar类., SimpleDateFormat类, 概念和常用方法等
LocalData, LocalTime, LocalDateTime, Instant, DateTimeFormatter, 概念和常用方法
目录
13.1 可变字符串类(重点)
13.2 Java8之前的日期相关类(熟悉)
13.2.1 System类
13.2.2 Date类
13.2.3 SimpleDateFormat类
13.2.4 Calendar类
13.3 Java8中的日期相关类(熟悉)
13.3.1 Java8日期类的由来
13.3.2 Java8日期类的概述
13.3.3 LocalDate类
13.3.4 LocalTime类
13.3.5 LocalDateTime类
13.3.6 Instant类
13.3.7 DateTimeFormatter类
由于String类描述的字符串内容是个常量不可改变,当需要在Java代码中描述大量类似的字符串时(例如123,124,125),只能单独申请和存储,此时会造成内存空间的浪费。
为了解决上述问题,可以使用java.lang.StringBuilder类和java.lang.StringBuffer类来描述字符序列可以改变的字符串,如:"ab"。
StringBuffer类是从jdk1.0开始存在,属于线程安全的类,因此效率比较低。
StringBuilder类是从jdk1.5开始存在,属于非线程安全的类,效率比较高。
注意
作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder会改变其值。
StringBuilder的很多方法的返回值均为StringBuilder类型。这些方法的返回语句均为:return this。
由此可见,这些方法在对StringBuilder所封装的字符序列进行改变后又返回了该对象的引用。
基 于这样设计的目的在于可以连续调用。
package com.lagou.task13; /** * @author CH * @date 2020/9/29 14:36 */ public class StringBuilderTest { public static void main(String[] args) { //1.1//使用无参构造并打印 StringBuilder sb1 = new StringBuilder(); System.out.println("sb1 = " + sb1); // 自动调用toString方法 System.out.println("容量是: " + sb1.capacity()); //16 System.out.println("长度是: " + sb1.length()); //0 System.out.println("----------------------------------------------------"); //2.1//使用参数指定的容量来构造对象并打印容量和长度 StringBuilder sb2 = new StringBuilder(20); System.out.println("sb2 = " + sb2); // 自动调用toString方法 System.out.println("容量是: " + sb2.capacity()); //20 System.out.println("长度是: " + sb2.length()); //0 System.out.println("----------------------------------------------------"); //3.1//根据参数指定的字符串内容来构造对象并打印容量和长度 StringBuilder sb3 = new StringBuilder("hello"); System.out.println("sb3 = " + sb3); // 自动调用toString方法 hello System.out.println("容量是: " + sb3.capacity()); //21 System.out.println("长度是: " + sb3.length()); //5 System.out.println("-----------------------------------------------------"); //4.1//实现向字符串中插入和追加字符串内容 // 向下标为0的位置插入字符串内容"abcd", 也就是向开头位置插入字符串的内容 StringBuilder sb4 = sb3.insert(0,"abcd"); System.out.println("sb4 = " + sb4); //abcdhello System.out.println("sb3 = " + sb3); // insert返回的是调用对象自己,也就是sb3的内容变成了abcdhello //向中间位置插入字符串"1234" sb3.insert(4,"1234"); System.out.println("sb3 = " + sb3); //sb3 = abcd1234hello //向末位置插入字符串"ABCD" sb3.insert(sb3.length(),"ABCD"); System.out.println("sb3 = " + sb3); //sb3 = abcd1234helloABCD System.out.println("-----------------------------------------------------"); //向末尾追加字符串内容 sb3.append("World"); System.out.println("sb3 = " + sb3); //sb3 = abcd1234helloABCDWorld //当使用append, 字符串的长度超过字符串对象的初始容量时, 对象会自动扩容,默认扩容算法是: 原容量*2+2 //底层采用byte数组存放所有字符内容 // ctrl+alt+左右方向键 表示 回到上/下一个 位置 System.out.println("容量是: " + sb3.capacity()); //44 自动扩容了 System.out.println("长度是: " + sb3.length()); //22 System.out.println("-----------------------------------------------------"); //5.1//实现字符串中字符和字符串的删除 //表示删除下标为8的单个字符 sb3.deleteCharAt(8); System.out.println("sb3 = " + sb3); //sb3 = abcd1234elloABCDWorld //使用for循环删除多个字符 for(int i = 0; i < 4; i++) { //sb3.deleteCharAt(i); 这样写会删除一个字符跳过一个字符, 实际上每次删除后, 后面的字符都会向前补位 sb3.deleteCharAt(8); //始终删除下标为8的字符 } System.out.println("sb3 = " + sb3); //sb3 = abcd1234ABCDWorld System.out.println("-----------------------------------------------------"); // 删除起始字符串"ABCD" sb3.delete(0,4); System.out.println("sb3 = " + sb3); //sb3 = 1234ABCDWorld //删除中间的"ABCD" sb3.delete(4,8); System.out.println("sb3 = " + sb3); //sb3 = 1234World //删除末尾字符串 sb3.delete(4,sb3.length()); System.out.println("sb3 = " + sb3); //sb3 = 1234 System.out.println("容量是: " + sb3.capacity()); // 不会自动缩容 System.out.println("-----------------------------------------------------"); //6.1//实现字符串的内容的修改, 查找以及反转操作, //表示将下标为0的位置的字符修改为'a' sb3.setCharAt(0,'a'); System.out.println("sb3 = " + sb3); //sb3 = a234 // 修改"234"为"bcd" sb3.replace(1,4,"bcd"); System.out.println("sb3 = " + sb3); //sb3 = abcd //实现查找的功能 int pos = sb3.indexOf("b"); System.out.println("从前向后查找的结果是: " + pos); //1 pos = sb3.lastIndexOf("b"); System.out.println("从后向前查找的结果是: " + pos); //1 //实现字符串的反转功能 sb3.reverse(); System.out.println("反转后sb3 = " + sb3); //7.1//笔试考点 //考点一: 既然StringBuilder类的对象本身可以修改,那么为什么成员方法还有返回值? // 解析: 为了连续调用 //sb3.reverse().append("1").append("2").insert(0,"3").delete(0,1).reverse(); //考点二: 如何实现StringBuilder类型和String类型之间的转换 //String str3 = sb3.toString(); //StringBuilder sb5 = new StringBuilder(str3); //考点三: String, StringBuilder 和 StringBuffer之间,效率的 排列 //String < StringBuffer < StringBuffer } }
Java.lang.System类中提供了一些有用的类字段和方法。
java.util.Date类主要用于描述特定的瞬间,也就是年月日时分秒,可以精确到毫秒。
java.text.SimpleDateFormat类主要用于实现日期和文本之间的转换。
java.util.Calender类主要用于描述特定的瞬间,取代Date类中的过时方法实现全球化。
该类是个抽象类,因此不能实例化对象,其具体子类针对不同国家的日历系统,其中应用最广泛的 是GregorianCalendar(格里高利历),对应世界上绝大多数国家/地区使用的标准日历系统。
public static void draw(Shape s) {
s.show();
}
draw(new Rect(1, 2, 3, 4));
在方法体中直接使用多态的语法格式
Account acc = new FixedAccount();
通过方法的返回值类型形成多态
Calender getInstance() {
return new GregorianCalendar(zone, aLocale);
}
package com.lagou.task13; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * @author CH * @date 2020/9/29 17:11 */ public class CalendarTest { public static void main(String[] args) throws ParseException { //1.1//使用过时的方法按照指定的年月日时分秒类构造对象 Date d1 = new Date(2008-1900,8-1,8,20,8,8); //过时的方法 //2.1//设置日期对象的格式并打印 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sdf.format(d1); System.out.println("获取到的时间是: " + format); //获取到的时间是: 3908-09-08 20:08:08 修改构造后=> 获取到的时间是: 2008-08-08 20:08:08 System.out.println("-----------------------------------------------------"); //2.//使用取代的方式构造对象 //2.1// 获取Calendar类型的引用 // 考点 //既然Calendar是个抽象类,那为什么下面的方法可以获取对象呢 // 解析: 由源码可知, 返回的并不是Calendar类型的对象, 而是其子类的对象,形成了多态 // 多态的使用场合之三 Calendar instance = Calendar.getInstance(); //2.2//设置指定的年月日时分秒信息 instance.set(2008,8-1,8,8,8,8); //修改这里的月份 //2.3//转换为Date类型的对象 Date d2 = instance.getTime(); String format1 = sdf.format(d2); System.out.println("转换后的结果为: " + format1); //转换后的结果为: 2008-09-08 08:08:08 修改后=>转换后的结果为: 2008-08-08 08:08:08 System.out.println("字符转换回去为: " + sdf.parse(format1)); //字符转换回去为: Mon Sep 08 08:08:08 JST 2008 System.out.println("-----------------------------------------------------"); //3.1//向指定的字段设置指定的数值 instance.set(Calendar.YEAR,2018); //转换为Date类型并按照指定格式打印 Date d3 = instance.getTime(); System.out.println("设置年份后的结果是: " + sdf.format(d3)); //设置年份后的结果是: 2018-08-08 08:08:08 instance.add(Calendar.MONTH,2); Date d4 = instance.getTime(); System.out.println("增加月份后的结果是: " + sdf.format(d4)); //增加月份后的结果是: 2018-10-08 08:08:08 } }
JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被 弃用 了。
而Calendar并不比Date好多少。它们面临的问题是:
Date类中的年份是从1900开始的,而月份都从0开始。
格式化只对Date类有用,对Calendar类则不能使用。
非线程安全等。
Java 8通过发布新的Date-Time API来进一步加强对 日期与时间的处理。
java.time包:该包日期/时间API的基础包。
java.time.chrono包:该包提供对不同日历系统的访问。
java.time.format包:该包能够格式化和解析日期时间对象。
java.time.temporal包:该包包含底层框架和扩展特性。
java.time.zone包:该包支持不同时区以及相关规则的类。
java.time.LocalDate类主要用于描述年-月-日格式的日期信息,该类不表示时间和时区信息。
java.time.LocalTime 类主要用于描述时间信息,可以描述时分秒以及纳秒。
java.time.LocalDateTime类主要用于描述ISO-8601日历系统中没有时区的日期时间,
如2007-12- 03T10:15:30。
java.time.Instant类主要用于描述瞬间的时间点信息。
java.time.format.DateTimeFormatter类主要用于格式化和解析日期。