1、字符串相关类
- String
- StringbBuffer
-
String类
代表字符串
- String类是一个final类,代表不可变的字符序列,不能被继承
- 字符串是常量,用双引号引起来,它们在创建之后不能修改
- String对象的字符内容是存储在一个final的字符数组value[]中的,体现不可变性
- String 实现了Serializable 接口 可序列化
- String 实现了Comparable 接口 可比较大小
- String 内部定义了final char[] value 用于存储字符串
- 通过字面量的方式给一个字符串赋值,此时字符串值声明在字符串常量池中
- 字符串常量池中不会存在相同内容
1、例子:
```java
public class HelloWorld {
/**
* 1.字符串常量和常量的拼接在常量池中.且字符串常量池中不会存在相同的常量
* 2.只要有一个变量参与,字符串的计算结果就在堆空间中。
* 3.如果计算的结果调用 intern 方法结果就在常量池中
* @param args
*/
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s0 = "hello"+ "world";
System.out.println(s3 == s0);//true
String s4 = s1 + "world";
System.out.println(s3 == s4);//false
String s5 = s4.intern();
System.out.println(s3 == s5);//true
}
}
<a name="jF2fG"></a>
### 2、String的常用方法
```java
public class HelloWorld {
/**
* 1.字符串常量和常量的拼接在常量池中.且字符串常量池中不会存在相同的常量
* 2.只要有一个变量参与,字符串的计算结果就在堆空间中。
* 3.如果计算的结果调用 intern 方法结果就在常量池中
* @param args
*/
public static void main(String[] args) {
String s = "HelloWorld";
//1.字符串的长度
System.out.println(s.length());
//2.字符串指定索引的字符
System.out.println(s.charAt(1));
//3.字符串转大写
System.out.println(s.toUpperCase());
//4.字符串转小写
System.out.println(s.toLowerCase());
//5.去除首尾空白字符串
String s1 = " hello word ";
System.out.println(s1.trim());
//6.比较两个字符内容是否相等
System.out.println("helloworld".equals(s));
//7.比较两个字符内容是否相等 忽略大小写
System.out.println("helloworld".equalsIgnoreCase(s));
//8.字符串连接 等同于+
System.out.println(s1.concat("xuezhiyi"));
//9.字符串截取
System.out.println(s.substring(2));
//10.字符串截取 左闭右开
System.out.println(s.substring(2,5));
//11.字符串比较
String s2 = "hello";
String s3 = "world";
System.out.println(s2.compareTo(s3));
//12.以什么开始或者结尾
System.out.println(s3.endsWith("ld"));
System.out.println(s3.startsWith("wo"));
System.out.println(s3.startsWith("rl",2));
//13.包含字符串
String s4 = "Hello";
System.out.println(s.contains(s4));
String s5 = "lol";
System.out.println(s.indexOf(s5));//找不到返回-1
}
}
3、String StringBuffer StringBuilder 异同
- String 不可变的字符序列 底层使用 final char[]
- StringBuffer 可变的字符序列 线程安全的效率低 底层使用 char[]
- StringBuilder 可变的字符序列 线程不安全的效率高 底层使用 char[]
StringBuffer StringBuilder 超出长度会扩容为原来的2倍+2 将原来的数组copy到新的数组 ```java public class HelloWorld {
/**
@param args */ public static void main(String[] args) {
StringBuffer buffer = new StringBuffer(); buffer.append(‘a’); buffer.append(‘b’); buffer.append(‘c’); buffer.append(‘d’); System.out.println(buffer); buffer.replace(2,3,”eee”); System.out.println(buffer.charAt(1)); System.out.println(buffer.insert(1,”pppp”)); StringBuffer delete = buffer.delete(1, 2); System.out.println(delete);
}
}
> 效率 StringBuilder > StringBuffer > String
<a name="nIlNv"></a>
## 2、jdk8之前的日期类
<a name="8v7wU"></a>
### 1、System类
获取毫秒时间戳 当前时间和1970年的时间差 毫秒为单位<br />long l = System._currentTimeMillis_();
<a name="M1fkE"></a>
### 2、java.util.Date;
<a name="0PzjK"></a>
#### 1、两个构造器的使用
1. Date date = new Date(); 创建当前时间对应的时间的对象
1. Date date1 = new Date(1626925140460L); 创建指定时间对应的时间对象
<a name="Ldz3y"></a>
#### 2、两个方法的使用
1. toString() 返回年月日时分秒
1. date.getTime();//返回当前对象的毫秒时间戳
<a name="1Yq2U"></a>
### 3、SimpleDateFormat
<a name="TtZTx"></a>
#### 格式化:日期转换成字符串
<a name="9cmR8"></a>
#### 解析:字符串转成日期
```java
//日期格式化 21-7-22 下午1:41
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(date);
System.out.println(format);
//日期解析 Thu Jul 22 13:38:00 CST 2021
String mydate= "2021-51-22 13:51:09";
Date parse = sdf.parse(mydate);
System.out.println(parse);
练习1:
@Test
public void test1() throws ParseException {
//"2021-07-22" 转换成 java.sql.date
String date = "2021-07-22";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date parse = sdf.parse(date);
java.sql.Date date1 = new java.sql.Date(parse.getTime());
System.out.println(date1);
}