淘先锋技术网

首页 1 2 3 4 5 6 7

一、String类

1、底层概念:

  • String类:代表字符串。 Java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现。
  • String是一个final类,代表不可变的字符序列,不可被继承。
  • 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。
  • String实现了Serializable接口:表示字符串是支持序列化的。实现Comparable接口:表示String可以比较大小。
  • String内部定义了final char[] value用于存储字符串数据。
  • String:代表不可变的字符序列。简称:不可变性
  • 体现: ①当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。②当对现有的字符串进行连接操作时(如±),也需要重新指定内存区域赋值,不能使用原有的value进行赋值。③当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
  • 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
  • 字符串常量池中是不会存储相同内容的字符串的。

2、常用的类和方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、StringBuffer、StringBuilder的使用

String:不可变的字符序列。底层使用char[]存储
StringBuffer:可变的字符序列。线程安全(synchronized),效率低。底层使用char[]存储
StringBuilder:可变的字符序列。线程不安全(未同步),效率高。底层使用char[]存储(JDK 5.0新增)

源码分析:

String str = new String();// char[ ] value = new char[0];
string str1 = new String("abc");//char[] value = new char[]{ ' a ' , 'b' , ' c '};
StringBuffer sb1 = new StringBuffer(); 
//char[] value = new char[16];底层创建了一个长度是16的数组System.out.println(sb2.length())System.out.println(sb2.length());
sb1.append( 'a ' ); //value[e] = 'a' ;sb1.append( 'b'); //vaLue[1] = 'b ';
StringBuffer sb2 = new StringBuffer( " abc" ) ; //char[] value = new char[ " abc".length() + 16];
System.out.println(sb2.length());

根据上述代码分析此问题:
问题1.System.out.printLn(sb2.Length());//答案为3
问题2.扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。

建议:在开发中建议大家使用StringBuffer(int capacity)或StringBulider(int capacity)。

StringBuffer类的常用的方法:(增、删、改、查、插、长度、遍历)
在这里插入图片描述
在这里插入图片描述

//范围为[start,end)左闭右开,此范围适用于其他范围
StringBuffer delete(int start,int end)
        StringBuffer sb2 = new StringBuffer("abc");
        sb2.append('1');
        sb2.append(1);
        System.out.println(sb2);
//        sb2.replace(2,4,"hello");
//        sb2.insert(2,false);
        sb2.reverse();
        System.out.println(sb2);

当append和insert时,如果原来value数组长度不够,可扩容。
以上方法支持方法链操作。

//方法链
public StringBuilder append(String str){
	super.append(str);
	return this;
}

三者效率的对比:
StringBuilder > StringBuffer > String

二、Date日期类(JDK8之前的API)

1、底层概念:

java.util.Date类(子类:java.sql.Date类)
1.两个构造器的使用

  • 构造器一:创建一个对应当前时间的date对象
  • 构造器二:创建指定毫秒数的date对象

2.两个方法的使用

  • toString():显示当前的年、月、日、时、分、秒
  • getTime():获取当前Date对象对应的毫秒数。(时间戳)

3.java.sql.Date对应着数据库中的日期类型的变量

  • 如何实例化
  • 如何将java.util.Date对象转换为java.sql.Date对象
//如何实例化:
java.sql.Date date2 = new java.sql.Date(1465658451456L);
        System.out.println(date2);//2016-06-11
//如何将java.util.Date对象转换为java.sql.Date对象
        //方法一:
//        Date date3 = new java.sql.Date(646665546469L);
//        java.sql.Date date4 = (java.sql.Date) date3;
		//方法二:
        Date date5 = new Date();
        java.sql.Date date6 = new java.sql.Date(date5.getTime());

2、simpleDateFormat类

  • Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类
  • 格式化:日期 ——>文本、解析:文本——>日期

格式化使用的方法:

  • SimpleDateFormat(): 默认的模式和语言环境创建对象
  • public SimpleDateFormat(String pattern): 该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用:
  • public String format(Date date): 方法格式化时间对象date
        Date date = new Date();
        System.out.println(date);

        String format = sdf.format(date);
        System.out.println(format);
        //结果为:
        Sun Mar 28 11:33:24 CST 2021
		2021/3/28 上午11:33

解析的方法:

  • pulbic Date parse(String source): 从给定字符串的开始解析文本,以生成一个日期。
		String str = "2021/03/28 下午12:15";
        Date parse = sdf.parse(str);
        System.out.println(parse);
        //结果为:
        Sun Mar 28 12:15:00 CST 2021

自定义日期格式:

//自定义日期输出格式
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String format1 = sdf1.format(date);
        System.out.println(format1);
        //自定义格式的解析
        String str1 = "2022-9-15 12:00:00";
        Date parse1 = sdf1.parse(str1);
        System.out.println(parse1);

三、Calendar(日历)类

  • java.uitl.Calendar是一个抽象基类,主要用于完成日期字段之间的相互操作的功能。
  • 获取Calendar实例的方法:①使用Calendar.getInstance()方法 ②调用它的子类GregorianCalendar的构造器。
  • 一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY、MINUTE、SECOND

常用方法:

  • public void set(int field,int value)
  • public void add(int field,int amount)
  • public final Date getTime()
  • public final void setTime(Date date)

注意:

  • 获取月份时:一月是0,二月是1,以此类推,12月是11
  • 获取星期时:周日是1,周二是2,…周六是7
/*
    Calendar日历类的使用
     */
    //1.实例化
    //方式一:创建其子类(GregorianCalendar)的对象
    //方式二:调用其静态方法getInstance()
    @Test
    public void testCalendar(){
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar);

        //常用操作
        //get()
        int daynow = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(daynow);
        System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
        //set()
        calendar.set(Calendar.DAY_OF_MONTH,22);
        daynow = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(daynow);
        //add(),减天数加负数
        calendar.add(Calendar.DAY_OF_MONTH,3);
        daynow = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(daynow);
        //getTime():日历类 ---> Date类
        Date date = calendar.getTime();
        System.out.println(date);
        //setTime():Date类 ---> 日历类
        Date date1 = new Date();
        calendar.setTime(date1);
        daynow = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(daynow);
    }

1、JDK8之后新时间日期API(建议使用)

  • java.time ——包含值对象的基础包
  • java.time.format ——格式化和解析日期和时间
  • java.time.chrono ——提供对不同的日历系统的访问
  • java.time.temporal ——包括底层框架和扩展特性
  • java.time.zone ——包含时区支持的类

**说明:**大多数开发者只会用到基础包(java.time)和format包,少数用到temporal包。

2、常用的类和方法

LocalDate、LocalTime、LocalDateTime类是其中较重要的几个类,他们的实例是不可变的对象,分别表示使用ISO-5601日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。

  • LocalDate 代表IOS格式(yyyy-MM-dd)的日期,可以存储生日、纪念日等日期。
  • LocalTime 表示一个时间,而不是日期。
  • LocalDateTime 是用来表示日期和时间的,这是一个最常用的类之一。(使用频率高)

在这里插入图片描述

3、Instant时间戳

Instant的使用:获取时间线(默认本初子午线)上的瞬时时间点。可能被用来记录应用程序中的事件时间戳

		//默认获取本初子午线的时区时间
        Instant instant = Instant.now();
        System.out.println(instant);
        //设置时间偏移量得到当前自己国家的时间
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println(offsetDateTime);
        //toEpochMilli():获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数--类似于Date类的getTime()
        long milli = instant.toEpochMilli();
        System.out.println(milli);
        //ofEpochMilli():通过给定的毫秒数,获取Instant实例--类似Date(long millis)
        Instant ofEpochMilli = Instant.ofEpochMilli(1617199330291L);
        System.out.println(ofEpochMilli);

4、DateTimeFormatter类

该类提供了三种格式化方法:

  • 预定义的标准格式。 如:ISO_LOCAL_DATE_TIME; ISO_LOCAL_DATE; ISO_LOCAL_TIME
  • 本地化相关的格式。 如:ofLocalizedDateTime(FormatStyle.LONG/FULL/MEDIUM/SHORT/)
  • 自定义的格式。 如:ofPattern(“yyyy-MM-dd hh:mm:ss E”)