Java基础 - Java核心类库 - 可变字符串&日期相关类

目录

  • Java基础 - Java核心类库 - 可变字符串&日期相关类
  • 1 可变字符串
  • 1.1 可变字符串类的概念
  • 1.1.1 StringBuilder
  • 1.1.1.1 StringBuilder 构造方法
  • 1.1.1.2 StringBuilder 常用方法
  • 1.1.1.3 StringBuilder 自动扩容算法 (append 方法中)
  • 1.1.1.4 StringBuilder 常见笔试考点
  • 2 日期相关类
  • 2.1 Java 8 之前日期相关类
  • 2.1.1 System 类
  • 2.1.2 Date 类
  • 2.1.3 SimpleDateFormat 类
  • 2.1.4 Calendar 类(支持全球化)
  • 2.2 Java8 日期相关类
  • 2.2.1 Java 8日期类概述
  • 2.2.2 LocalDate 类
  • 2.2.3 LocalTime 类
  • 2.2.4 LocalDateTime 类
  • 2.2.5 Instant 类
  • 2.2.6 DateTimeFormatter 类

1 可变字符串

1.1 可变字符串类的概念

为什么需要可变字符串类?

  • 由于String类描述的字符串内容是个常量不可改变,当需要在Java代码中描述大量类似的字符串 时,只能单独申请和存储,此时会造成内存空间的浪费

可变字符串类有哪些?

  • java.lang.StringBuilder类
  • java.lang.StringBuffer类
  • 来描述字符序列可以改变的字符串

StringBuffer 和 StringBuilder的区别?

  • StringBuffer类是从jdk1.0开始存在,属于线程安全的类,因此效率比较低
  • StringBuilder类是从jdk1.5开始存在,属于非线程安全的类,效率比较高
1.1.1 StringBuilder
1.1.1.1 StringBuilder 构造方法

方法

功能

StringBuilder()

使用无参方式构造对象,容量为16

StringBuilder(int capacity)

根据参数指定的容量来构造对象,容量为参数指定大小

StringBuilder(String str)

根据参数指定的字符串来构造对象,容量为:初始长度16+字符串长度

1.1.1.2 StringBuilder 常用方法

方法

说明

int capacity()

用于返回调用对象的容量

int length()

用于返回字符串的长度,也就是字符的个数

StringBuilder insert(int offset, String str)

插入字符串并返回调用对象的引用,就是自己(返回值和调用对象是同一个字符串)

StringBuilder append(String str)

追加字符串

StringBuilder deleteCharAt(int index)

将当前字符串中下标为index位置的单个字符 删除

StringBuilder delete(int start,int end)

删除字符串

StringBuilder replace(int start,int end, String str)

替换字符串

StringBuilder setCharAt(int idex, char ch)

修改单个字符

int indexOf(String str)

从前往后查找,如果查找到字符串则匹配第一个字符位置

int lastIndexOf(String str)

从后往前查找

StringBuilder reverse()

字符串反转

  • String 作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder会改变其值
  • StringBuilder的很多方法的返回值均为StringBuilder类型。这些方法的返回语句均为:return this
  • 这些方法在对StringBuilder所封装的字符序列进行改变后又返回了该对象的引用。基于这样设计的目的在于可以连续调用(链式编程)
1.1.1.3 StringBuilder 自动扩容算法 (append 方法中)

算法:原始容量*2 + 2

public AbstractStringBuilder append(String str) {     
        int len = str.length(); //len 为当前传入append方法中字符串的长度
        ensureCapacityInternal(count + len); //count 为当前StringBuilder对象中已有字符串的长度  
    }

//进入ensureCapacityInternal方法

private void ensureCapacityInternal(int minimumCapacity) { 
        //原数组长度不够用,需要扩容并拷贝数组
        if (minimumCapacity - oldCapacity > 0) {
            value = Arrays.copyOf(value,
                    newCapacity(minimumCapacity) << coder);
        }
    }
    
//进入newCapacity方法

private int newCapacity(int minCapacity) {
	//扩容算法,左移位代表*2
	int newCapacity = (oldCapacity << 1) + 2;
}
1.1.1.4 StringBuilder 常见笔试考点
  • 实现String 类型和StringBuilder 类型之间的转换
Sting s = sb.toString();
Stringbuilder sb = new Stringbuilder(s);
  • String, StringBuffer, StringBuilder 之间的效率比较
String < StringBuffer < StringBuilder

2 日期相关类

2.1 Java 8 之前日期相关类

2.1.1 System 类

概念:Java.lang.System类

方法:

  • static long currentTimeMillis()
  • 返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时 间差
  • 单位是毫秒
  • 常用来测试代码的执行效率
2.1.2 Date 类

概念:java.util.Date类主要用于描述特定的瞬间,也就是年月日时分秒,可以精确到毫秒

常用方法:

用来设置年月日时分秒的构造参数已过时,被Calendar类取代

方法

功能

Date()

使用无参的方式构造对象,也就是当前系统时间

Date(long date)

根据参数指定毫秒数构造对象, 参数为距离1970年1月1日0时0分0秒 的毫秒数

long getTime()

获取调用对象距离1970年1月1日0时0分0秒的毫秒数

void setTime(long time)

设置调用对象为距离基准时间time毫秒的时间点(距离1970年1月1日0时0分0秒 time 毫秒)

2.1.3 SimpleDateFormat 类

概念:java.text.SimpleDateFormat类主要用于实现日期和文本之间的转换

常用方法:

方法

说明

SimpleDateFormat()

使用无参方式构造对象

SimpleDateFormat(String pattern)

根据参数指定的模式来构造对象,模式主要有: y-年 M-月 d-日 H-时 m-分 s-秒

final String format(Date date)

用于将日期类型转换为文本类型

Date parse(String source)

用于将文本类型转换为日期类型/当解析时需要将该format类的模式设定的和被解析字符串相同

String s = "1996/09/12"
SimpleDateFormat format = new SimpleDateFormat(YYYY-MM-dd)
2.1.4 Calendar 类(支持全球化)
  • 概念:java.util.Calender类主要用于描述特定的瞬间,取代Date类中的过时方法实现全球化
  • 该类是个抽象类,其具体子类针对不同国家的日历系统,其中应用最广泛的 是GregorianCalendar(格里高利历),对应世界上绝大多数国家/地区使用的标准日历系统

常用方法:

方法

说明

static Calendar getInstance()

用于获取Calendar类型的引 用

void set(int year, int month, int date, int hour, int minute, int second)

用于设置年月日时分秒信息/月份是基于0的,输入时月份-1(设2输1)

Date getTime()

用于将Calendar类型转换为 Date类型

void set(int field, int value)

设置指定字段的数值/可以使用数字或Calendar.字段(如MONTH)

void add(int field, int amount)

向指定字段增加数值

int get(int filed)

获取指定字段的值:y-1,M-2(为输入值),d-5,H-11,m-12,s-13

常用方式:

//1. 获取Calendar 的引用
Calender instance = Calender.getInstance();

//2. 使用该实例的set方法设置指定的年月日时分秒
instance.set(y,M,d,H,m,s);

//3. 调用 getTime 方法 将该Calender实例转换为Date对象
Date date = instance.getTime();

//4. 使用SimpleDateFormat 将Date对象解析为字符串格式
SimpleDateFormat format= new SimpleDateFormat();
String time = format.format(date);

多态的使用场合(3种)

  • 通过方法的参数传递形成多态
Shape接口
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);
 }

2.2 Java8 日期相关类

为什么Java 8还需要新的日期类来取代Date 和 Calendar

  • Date类中的年份是从1900开始的,而月份都从0开始
  • 格式化只对Date类有用,对Calendar类则不能使用
  • 非线程安全等
2.2.1 Java 8日期类概述

Java 8通过发布新的Date-Time API来进一步加强对 日期与时间的处理

  • java.time包:该包日期/时间API的基础包
  • java.time.chrono包:该包提供对不同日历系统的访问
  • java.time.format包:该包能够格式化和解析日期时间对象
  • java.time.temporal包:该包包含底层框架和扩展特性
  • java.time.zone包:该包支持不同时区以及相关规则的类
2.2.2 LocalDate 类

概念:

java.time.LocalDate类主要用于描述年-月-日格式的日期信息,该类不表示时间和时区信息

常用方法:

方法

说明

static LocalDate now()

在默认时区中从系统时钟获取当前日期

now 方法获取对象

2.2.3 LocalTime 类

概念:

java.time.LocalTime 类主要用于描述时间信息,可以描述时分秒以及纳秒

常用方法:

方法

说明

static LocalTime now()

从默认时区的系统时间中获取当前时间

static LocalTime now(ZoneId zone)

获取指定时区的当前时间

2.2.4 LocalDateTime 类

概念:

java.time.LocalDateTime类主要用于描述ISO-8601日历系统中没有时区的日期时间,如2007-12- 03T10:15:30

常用方法:

方法

说明

static LocalDateTime now()

从默认时区的系统时间中获取当前日期时间(年月日时分秒)

static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)

根据参数指定的年月日时分秒 信息来设置日期时间

其他方法:

int getYear() 获取年份字段的数值
int getMonthValue() 获取1到12之间的月份字段
int getDayOfMonth() 获取日期字段
int getHour() 获取小时数
int getMinute() 获取分钟数
int getSecond() 获取秒数
// 调用对象本身数据内容不会发生改变,返回值相当于创建了新对象
LocalDateTime withYear(int year) 设置为参数指定的年
LocalDateTime withMonth(int month) 设置为参数指定的月
LocalDateTime withDayOfMonth(int dayOfMonth) 设置为参数指定的日
LocalDateTime withHour(int hour) 设置为参数指定的时
LocalDateTime withMinute(int minute) 设置为参数指定的分
LocalDateTime withSecond(int second) 设置为参数指定的秒
LocalDateTime plusYears(long years) 加上参数指定的年
LocalDateTime plusMonths(long months) 加上参数指定的月
LocalDateTime plusDays(long days) 加上参数指定的日
LocalDateTime plusHours(long hours) 加上参数指定的时
LocalDateTime plusMinutes(long minutes) 加上参数指定的分
LocalDateTime plusSeconds(long seconds) 加上参数指定的秒
LocalDateTime minusYears(long years) 减去参数指定的年
LocalDateTime minusMonths(long months) 减去参数指定的月
LocalDateTime minusDays(long days) 减去参数指定的日
LocalDateTime minusHours(long hours) 减去参数指定的时
LocalDateTime minusMinutes(long minutes) 减去参数指定的分
LocalDateTime minusSeconds(long seconds) 减去参数指定的秒
2.2.5 Instant 类

概念:java.time.Instant类主要用于描述瞬间的时间点信息

常用方法:

方法

说明

static Instant now()

从系统时钟上获取当前时间,不是当前系统默认时区,本初子午线,差8小时

OffsetDateTime atOffset(ZoneOffset offset)

将此瞬间与偏移量组合以创建偏移日期时间/参数传入偏差时间 ZoneOffset.ofHours(8) 可获得当前系统时间

static Instant ofEpochMilli(long epochMilli)

根据参数指定的毫秒数来构造对象,参数为距离1970年1月1 日0时0分0秒的毫秒数 对应 Date 类 Date(long date)

long toEpochMilli()

获取距离1970年1月1日0时0分0秒的毫秒数 对应 Date 类 long getTime()

2.2.6 DateTimeFormatter 类

基本概念:

  • java.time.format.DateTimeFormatter类主要用于格式化和解析日期。

常用方法:

方法

说明

static DateTimeFormatter ofPattern(String pattern)

根据参数指定的模式来获取对象

String format(TemporalAccessor temporal)

将参数指定日期时间转换为字符串/TemporalAccessor是一个接口,已知实现类包括Instant,LocalDate,LocalTime,LocalDateTime

TemporalAccessor parse(CharSequence text)

将参数指定字符串转换为日期时间