&&&&&总结&&&&&
1.可变字符串类(重点)
StringBuilder类, StringBuffer类, 概念,常用方法等
2. Java8之前的日期相关类(熟悉)
Date类, Calendar类., SimpleDateFormat类, 概念和常用方法等
3. Java8增加的日期相关类
LocalData, LocalTime, LocalDateTime, Instant, DateTimeFormatter, 概念和常用方法
目录
第十三章 可变字符串类和日期相关类
13.1 可变字符串类(重点)
13.1.1 基本概念
由于String类描述的字符串内容是个常量不可改变,当需要在Java代码中描述大量类似的字符串时(例如123,124,125),只能单独申请和存储,此时会造成内存空间的浪费。
为了解决上述问题,可以使用java.lang.StringBuilder类和java.lang.StringBuffer类来描述字符序列可以改变的字符串,如:"ab"。
StringBuffer类是从jdk1.0开始存在,属于线程安全的类,因此效率比较低。
StringBuilder类是从jdk1.5开始存在,属于非线程安全的类,效率比较高。
13.1.2 StringBuilder类常用的构造方法
13.1.3 StringBuilder类常用的成员方法
注意
作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder会改变其值。
13.1.4 返回值的设计
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
}
}
13.2 Java8之前的日期相关类(熟悉)
13.2.1 System类的概述
(1)基本概念
Java.lang.System类中提供了一些有用的类字段和方法。
(2)常用的方法
package com.lagou.task13;
/**
* @author CH
* @date 2020/9/29 16:31
*/
public class SystemTest {
public static void main(String[] args) {
//1.1// 获取当前系统时间距离 1970年1月1日0时0分0秒的毫秒数
long msec = System.currentTimeMillis();
System.out.println("当前系统时间距离1970年1月1日0时0分0秒已经过去" + msec); //1601364815553
//通常用于测试某一段代码的执行效率
}
}
13.2.2 Date类的概述
(1)基本概念
java.util.Date类主要用于描述特定的瞬间,也就是年月日时分秒,可以精确到毫秒。
(2)常用的方法
package com.lagou.task13;
import java.util.Date;
/**
* @author CH
* @date 2020/9/29 16:37
*/
public class DateTest {
public static void main(String[] args) {
//1.1//使用无参方式构造Date对象并打印
Date d1 = new Date();
System.out.println("d1 = " + d1); //获取当前系统时间 d1 = Tue Sep 29 16:41:59 JST 2020
System.out.println("------------------------------------------");
//2.1//使用参数指定的毫秒数来构造Date对象并打印 1秒 = 1000毫秒 东八区
Date d2 = new Date(1000);
System.out.println("d2 = " + d2); //d2 = Thu Jan 01 09:00:01 JST 1970
System.out.println("------------------------------------------");
//3.1//获取调用对象距离1970那个时间的毫秒数
long msec = d2.getTime();
System.out.println("获取到的毫秒是: " + msec); //1000
//4.1//设置调用对象所表示的时间点为参数指定的毫秒数
d2.setTime(2000);
System.out.println("d2 = " + d2); //d2 = Thu Jan 01 09:00:02 JST 1970
}
}
13.2.3 SimpleDateFormat类的概述
(1)基本概念
java.text.SimpleDateFormat类主要用于实现日期和文本之间的转换。
(2)常用的方法
package com.lagou.task13;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author CH
* @date 2020/9/29 16:59
*/
public class SimpleDateFormatTest {
public static void main(String[] args) throws ParseException {
//1.1//获取当前系统时间并打印
Date d1 = new Date();
System.out.println("d1 = " + d1); //d1 = Tue Sep 29 17:09:03 JST 2020
//2.1// 构造SimpleDateFormat类型的对象并指定格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//3.3//实现日期类型向文本类型的转换并打印
//alt + Enter 可以实现返回值的生成
String format = sdf.format(d1);
System.out.println("转换后的日期为: " + format); //转换后的日期为: 2020-09-29 17:09:03
//4.1//实现文本类型到日期类型的转换并打印
Date parse = sdf.parse(format);
System.out.println("转回日期格式为: " + parse); //转回日期格式为: Tue Sep 29 17:09:03 JST 2020
}
}
13.2.4 Calendar类的概述
(1)基本概念
java.util.Calender类主要用于描述特定的瞬间,取代Date类中的过时方法实现全球化。
该类是个抽象类,因此不能实例化对象,其具体子类针对不同国家的日历系统,其中应用最广泛的 是GregorianCalendar(格里高利历),对应世界上绝大多数国家/地区使用的标准日历系统。
(2)常用的方法
(3)多态的使用场合
- 通过方法的参数传递形成多态;
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
}
}
13.3 Java8中的日期相关类(熟悉)
13.3.1 Java8日期类的由来
JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被 弃用 了。
而Calendar并不比Date好多少。它们面临的问题是:
Date类中的年份是从1900开始的,而月份都从0开始。
格式化只对Date类有用,对Calendar类则不能使用。
非线程安全等。
13.3.2 Java8日期类的概述
Java 8通过发布新的Date-Time API来进一步加强对 日期与时间的处理。
java.time包:该包日期/时间API的基础包。
java.time.chrono包:该包提供对不同日历系统的访问。
java.time.format包:该包能够格式化和解析日期时间对象。
java.time.temporal包:该包包含底层框架和扩展特性。
java.time.zone包:该包支持不同时区以及相关规则的类。
13.3.3 LocalDate类的概述
(1)基本概念
java.time.LocalDate类主要用于描述年-月-日格式的日期信息,该类不表示时间和时区信息。
(2)常用的方法
13.3.4 LocalTime类的概述
(1)基本概念
java.time.LocalTime 类主要用于描述时间信息,可以描述时分秒以及纳秒。
(2)常用的方法
13.3.5 LocalDateTime类的概述
(1)基本概念
java.time.LocalDateTime类主要用于描述ISO-8601日历系统中没有时区的日期时间,
如2007-12- 03T10:15:30。
(2)常用的方法
package com.lagou.task13;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
/**
* @author CH
* @date 2020/9/30 15:27
*/
public class LocalDateTimeTest {
public static void main(String[] args) {
//1.1//获取当前日期信息并打印
LocalDate now = LocalDate.now();
System.out.println("当前日期是: " + now); //当前日期是: 2020-09-30
//2.1//获取当前时间信息并打印
LocalTime now1 = LocalTime.now();
System.out.println("当前时间是: " + now1); //当前时间是: 15:33:53.863121200
//3.1//获取当前日期时间信息并打印,,使用最多,要掌握
LocalDateTime now2 = LocalDateTime.now();
System.out.println("当前日期时间是: " + now2); //当前日期时间是: 2020-09-30T15:33:53.863121200
System.out.println("---------------------------------------------");
//4.1//使用参数指定的年月日时分秒的信息来获取对象并打印
// 使用ctrl+F12来查找指定的方法
LocalDateTime of = LocalDateTime.of(2008, 8, 8, 20, 8, 8);
System.out.println("指定的时间是: " + of); // 自动调用toString方 指定的时间是: 2008-08-08T20:08:08
System.out.println("获取到的年是: " + of.getYear()); //2008
System.out.println("获取到的月是: " + of.getMonthValue()); //8
System.out.println("获取到的日是: " + of.getDayOfMonth()); //8
System.out.println("获取到的时是: " + of.getHour()); //20
System.out.println("获取到的分是: " + of.getMinute()); //8
System.out.println("获取到的秒是: " + of.getSecond()); //8
System.out.println("---------------------------------------------");
//5.1//实现特征的设置并打印
//与String类型相似,调用对象本身的数据内容不会改变,返回值相当与创建了一个新的对象,有此证明了不可变性
LocalDateTime localDateTime = of.withYear(2012);
System.out.println("LocalDateTime = " + localDateTime); //LocalDateTime = 2012-08-08T20:08:08
System.out.println("of = " + of); //of = 2008-08-08T20:08:08
LocalDateTime localDateTime1 = localDateTime.withMonth(12);
System.out.println("localDateTime1 = " + localDateTime1); //localDateTime1 = 2012-12-08T20:08:08
System.out.println("---------------------------------------------");
//6.1//实现特征的增加并打印
LocalDateTime localDateTime2 = localDateTime1.plusDays(2);
System.out.println("localDateTime2 = " + localDateTime2); //localDateTime2 = 2012-12-10T20:08:08
System.out.println("localDateTime1 = " + localDateTime1); //localDateTime1 = 2012-12-08T20:08:08
LocalDateTime localDateTime3 = localDateTime2.plusHours(3);
System.out.println("localDateTime3 = " + localDateTime3); //localDateTime3 = 2012-12-10T23:08:08
//7.1//实现特征的减少并打印
LocalDateTime localDateTime4 = localDateTime3.minusMinutes(1);
System.out.println("localDateTime4 = " + localDateTime4); //localDateTime4 = 2012-12-10T23:07:08
System.out.println("localDateTime3 = " + localDateTime3); //localDateTime3 = 2012-12-10T23:08:08
LocalDateTime localDateTime5 = localDateTime4.minusSeconds(3);
System.out.println("localDateTime5 = " + localDateTime5); //localDateTime4 = 2012-12-10T23:07:05
System.out.println("localDateTime4 = " + localDateTime4); //localDateTime4 = 2012-12-10T23:07:08
}
}
13.3.6 Instant类的概述
(1)基本概念
java.time.Instant类主要用于描述瞬间的时间点信息。
(2)常用的方法
package com.lagou.task13;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
/**
* @author CH
* @date 2020/9/30 15:55
*/
public class InstantTest {
public static void main(String[] args) {
//1.1//使用Instant类来获取当前系统时间, 并不是当前系统的默认时区,本初子午线, 差8小时
Instant now = Instant.now();
System.out.println("now = " + now); //now = 2020-09-30T06:58:22.707192700Z
//2.1//加上失去所差的8个小时
OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.ofHours(9));
System.out.println("偏移后的日期时间为: " + offsetDateTime); // 偏移后的日期时间为: 2020-09-30T16:07:10.335354600+09:00
System.out.println("---------------------------------------------------");
//3.1//获取当前调用对象距离标准时间的毫秒数
long l = now.toEpochMilli();
System.out.println("获取到的毫秒差是:" + l); //获取到的毫秒差是:1601449933878
//4.1//根据参数指定的毫秒数来构造对象
Instant instant = Instant.ofEpochMilli(l);
System.out.println("根据参数指定的毫秒数构造出来的对象为:" + instant); //根据参数指定的毫秒数构造出来的对象为:2020-09-30T07:12:13.878Z
}
}
13.3.7 DateTimeFormatter类的概述
(1)基本概念
java.time.format.DateTimeFormatter类主要用于格式化和解析日期。
(2)常用的方法
package com.lagou.task13;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
/**
* @author CH
* @date 2020/9/30 16:15
*/
public class DateTimeFormatterTest {
public static void main(String[] args) {
//1.1//获取当前系统的日期时间并打印
LocalDateTime now = LocalDateTime.now();
System.out.println("now = " + now); //now = 2020-09-30T16:40:43.027885400
//2.1//按照指定的格式准备一个DateTimeFormatter类型对象
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//3.1//实现日期时间向字符串类型的转换并打印
String s = dateTimeFormatter.format(now);
System.out.println("调整格式后的结果是: " + s); //调整格式后的结果是: 2020-09-30 16:40:43
//4.1//实现字符串类型到日期时间类型的转换并打印
TemporalAccessor parse = dateTimeFormatter.parse(s);
System.out.println("转回去的结果是: " + parse); //转回去的结果是: {},ISO resolved to 2020-09-30T16:40:43
}
}