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的转换
- String转换为int:integer.parseInt()方法
- 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);
}