1.String

1.String声明为finaL的,不可破继承

2.String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String 可以比较大小.
3.String内部定义了final char[] value用于存储字符串数据

4.String:代表不可变的字符序列。简称:不可变性。
体现: 1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。

2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

3.当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

5.通过字面量的方式(区别于new)给一一个字符串赋值,此时的字符串值声明在字符串常量池中。
6.字符串常量池中是不会存储相同内容的字符串的。

1.1 String不同拼接操作的对比

1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2.只要其中有一个是变量,结果就在堆中
3.如果拼接的结果调用intern()方法,返回值就在常量池中

1.2 String与int的转换

  1. String转换为int:integer.parseInt()方法
  2. int转换为String:String.valueOf()方法
public class StringTest {
    public static void main(String[] args) {
        String str = "123";
        //调用Integer.parseInt()方法可以将字符串转换为整型
        int num = Integer.parseInt(str);
        System.out.println(num);
        //调用String.valueOf()方法可以将整型转换为字符串
        String str1 = String.valueOf(num);
        System.out.println(str1);
        System.out.println(str == str1);//false
    }
}

1.3 String与char[]的转换

1.String转换为char[]:toCharArray()方法

2.char[]转换为String:调用String的构造器

public class StringTest2 {
    public static void main(String[] args) {
        String str = "abc123";
        //将字符串转化为字符数组
        char[] charArray = str.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            System.out.println(charArray[i]);
        }
        //将字符数组转换为字符串
        char[] chars = new char[]{'a','b','c'};
        String str1 = new String(chars);
        System.out.println(str1);
    }
}

2.StringBuffer,StringBuilder

2.1 String,StringBuffer,StringBuilder三者的异同

String:不可变的字符序列,底层使用char[]存储
StringBuffer:可变的字符序列,线程安全的,效率低,底层使用char[]存储
StringBuilder:可变的字符序列,jdk5.0新增的,线程不安全的,效率高,底层使用char[]存储

2.2 StringBuffer的常用方法

StringBuffer append(xxx): 提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start, int end): 删除指定位置的内容
StringBuffer replace(int start, int end, String str): 把[start, end)位置替换为str
StringBuffer insert(int offset, xxx): 在指定位置插入xxxI[
StringBuffer reverse() :把当前字符序列逆转
public int indexOf(String str)
public String substring(int start, int end):返回一个·从start开始到end索引结束的左闭右开区间的子字符串
public int Length()
pubLic char charAt(int n )
pubLic void setCharAt(int n , char ch)

2.3 对比String、StringBuffer、 StringBuilder三者的效率

从高到低排列: StringBuilder > StringBuffer > String

2.4 String与StringBuffer、StringBuilder之间的转换

String -->StringBuffer、 StringBuilder: 调用StringBuffer、StringBuilder构造 器
StringBuffer、StringBuilder -->String: 调用String构造器

3.JDK 8之前的日期和时间的API

·

import org.junit.Test;

import java.util.Date;

public class DateTimeTest {
    //System类中的currentTimeMillis()
    @Test
    public void test(){
        //返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。称为时间戳
        long time = System.currentTimeMillis();
        System.out.println(time);
    }

    
    
    @Test
    public void test02(){
        //构造器1:Date(),创建当前时间日期对象
        Date data1 = new Date();
        //以年月日方式输出
        System.out.println(data1.toString()); //Thu Jul 29 15:35:42 CST 2021
        //以毫秒值方式输出
        System.out.println(data1.getTime());  //1627544142480

        //构造器2:Date(毫秒值) 创建指定毫秒值时间日期对象
        Date date2 = new Date(0);
        System.out.println(date2.toString());


        //java.sql.Date类:对应数据库中日期类型的变量
        java.sql.Date date3 = new java.sql.Date(3145623156767L);
        System.out.println(date3); //2069-09-06

        //将java.util.Date转化为java.sql.Date
        Date date4 = new Date();  //创建java.util.Date对象
        java.sql.Date date5 = new java.sql.Date(date4.getTime());   //转化为java.sql.Date对象
        System.out.println(date5);  //2021-07-29
    }
}

4.日期类:SimpleDateFormat

4.1 SimpleDateFormat对日期Date类的格式化和解析

@Test
public void test03() throws ParseException {
    //创建SimpleDateFormat ,构造器中传入格式,不传则为默认格式
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    Date date = new Date();
    //格式化日期
    String format = sdf.format(date);
    System.out.println(format); //2021-07-29 04:58:24
    //解析格式化
    Date date2 = sdf.parse("2021-07-29 04:58:24");
    System.out.println(date2 );
}

4.2 Calendar类

//Calendar类的测试
@Test
public void testCalendar(){
    //1.实例化
    //方式一:创建其子类(GregorianCalendar)的对象
    //方式二:调用其静态方法getInstance()
    Calendar calendar = Calendar.getInstance();

    //2.常用方法
    //get()
    System.out.println(calendar.get(Calendar.DAY_OF_MONTH));  //3
    System.out.println(calendar.get(Calendar.DAY_OF_YEAR));   //215

    //set()
    calendar.set(Calendar.DAY_OF_MONTH,21);
    System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //21

    //add
    calendar.add(Calendar.DAY_OF_MONTH,3);
    System.out.println(calendar.get(Calendar.DAY_OF_MONTH));  //24

    //setTime():Date -->  日历类
    Date date = new Date();
    calendar.setTime(date);
    System.out.println(calendar.get(Calendar.DAY_OF_MONTH));  //3
}


5.JDK8中新日期时间API


5.1 LocalDate,LocalTime,LocalDateTime

/*
* LocalDate,LocalTime,LocalDateTime的使用
* 说明:
*   1:LocalDateTime相较于LocalDate,LocalTime使用频率更高
*   2:类似于Calendar 
* */

public class JDK8DateTimeTest {
    @Test
    public void test01(){
        //now():获取当前日期,时间,日期+时间
        LocalDate localDate = LocalDate.now();
        LocalTime localTime = LocalTime.now();
        LocalDateTime localDateTime = LocalDateTime.now();

        System.out.println(localDate);
        System.out.println(localTime);
        System.out.println(localDateTime);

        //of()
        LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 6, 13, 23, 43);
        System.out.println(localDateTime1);

        //getXxx():获取相关属性
        System.out.println(localDateTime.getDayOfMonth());
        System.out.println(localDateTime.getDayOfWeek());
        System.out.println(localDateTime.getMonth());
        System.out.println(localDateTime.getMonthValue());
        System.out.println(localDateTime.getMinute());

        //不可变性,原来的localDate不会改变
        //withXxx():设置相关属性
        LocalDate localDate1 = localDate.withDayOfMonth(7);
        System.out.println(localDate);
        System.out.println(localDate1);

        LocalDateTime localDateTime2 = localDateTime.withHour(6);
        System.out.println(localDateTime);
        System.out.println(localDateTime2);

        //plusXxx():增加属性的值
        LocalDateTime localDateTime3 = localDateTime.plusMonths(3);
        System.out.println(localDateTime3);

        //minusXxx():减去属性的值
        LocalDateTime localDateTime4 = localDateTime.minusDays(6);
        System.out.println(localDateTime4);
    }
}

5.2 Instant类

/*
* Instant的使用
* 类似于 java.util.Date类
* */
@Test
public void test02(){
    //now():获取标准伦敦时间
    Instant instant = Instant.now();
    System.out.println(instant); //2021-08-02T07:17:52.210682800Z

    //添加时间偏移量
    OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); //标准北京时间
    System.out.println(offsetDateTime);  //2021-08-02T15:17:52.210682800+08:00

    //toEpochMilli():获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数 --> Date类的getTime()方法
    long milli = instant.toEpochMilli();
    System.out.println(milli);

    //ofEpochMilli():通过给定的毫秒数,获取Instant实例 --> Date(long millis)
    Instant instant1 = Instant.ofEpochMilli(1552436542732L);
    System.out.println(instant1);
}

5.3 java.time.format.DateTimeFormatter类

/*
* DateTimeFormatter:格式化或解析日期,时间
* 类似于SimpleDateFormat
* */
@Test
public void test03(){
    //方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
    DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    //格式化:日期 --》 字符串
    LocalDateTime localDateTime = LocalDateTime.now();
    String str1 = formatter.format(localDateTime);
    System.out.println(localDateTime);  //2021-08-03T14:36:12.843638300
    System.out.println(str1);      //2021-08-03T14:36:12.8436383
    //解析:字符串 --》 日期
    TemporalAccessor parse = formatter.parse(str1);
    System.out.println(parse);   //{},ISO resolved to 2021-08-03T14:36:12.843638300

    //方式二:本地化相关的格式。如:ofLocallizedDate()
    //FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :适用于LocaLDate
    DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
    //格式化
    String str2 = formatter1.format(LocalDate.now());
    System.out.println(str2); //2021年8月3日星期二

    //方式三:自定义格式。如ofPattern("yyyy-MM-dd hh:mm:ss")   重点
    DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
    //格式化
    String str3 = formatter2.format(LocalDateTime.now());
    System.out.println(str3);
    //解析
    TemporalAccessor accessor = formatter2.parse("2019-02-18 03:52:09");
    System.out.println(accessor);
}