String str = “hello123”;
// 由于String是不可变字符串, 必须用变量接收
str = str.replace(“123”, “666”); // hello666
穿插个知识点,Eclipse 中 **抽取代码块**的快捷键:先选中代码块,ALT + SHIFT + M
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200420123523942.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
**字符串截取**:
String str = “abcdea”;
// 字符串的截取区间: [2, 4)
str.substring(2, 4); // cd
str.substring(2); // cdea
str.indexOf(“a”); // 0
str.lastIndexOf(“a”); // 5
str.indexOf(“z”); // -1
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200420130039356.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
[]( )可变字符串(StringBuilder)
=======================================================================================
在进行大量字符串的改动操作时(比如拼接、替换)
* 使用 `String` 会非常消耗内存、降低程序性能
* 使用 `StringBuilder` 可以节省内存、提高程序性能
String s1 = “”;
s1 += “123”;
s1 += “456”;
StringBuilder s2 = new StringBuilder();
s2.append(“123”).append(“456”);
`String` 与 `StringBuilder` 性能对比:**50000 次字符串拼接操作**
public static void main(String[] args) {
testString(); // 2511ms
testStringBuilder(); // 2ms
}
static void testString() {
long begin = System.currentTimeMillis();
String str = "";
for (int i = 0; i < 50000; i++) {
str += i;
}
long end = System.currentTimeMillis();
System.out.println("String ->" + (end - begin) + "ms");
}
static void testStringBuilder() {
long begin = System.currentTimeMillis();
StringBuilder str = new StringBuilder();
for (int i = 0; i < 50000; i++) {
str.append(i);
}
long end = System.currentTimeMillis();
System.out.println("StringBuilder ->" + (end - begin) + "ms");
}
String -> 2511ms
StringBuilder -> 2ms
```
`StringBuilder` 的常用方法有:`append`、`insert`、`delete`、`replace`、`reverse`等;
注意:
* `StringBuilder` 并不是 `String` 的子类 或者 父类
* `StringBuilder`、`String` 都实现了 `CharSequence` 接口
[]( )StringBuilder 的 append 原理
--------------------------------------------------------------------------------------------
`StringBuilder` 的原理类似动态数组 `ArrayList`:底层会自动扩容;
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200420132746632.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
源码中可以看到扩容的算法:`(value.length << 1) + 2` 即 新容量是原来容量的 2 倍 + 2
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200420132824462.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
[]( )日期
=====================================================================
[]( )Date
-----------------------------------------------------------------------
`java.util.Date` 是开发中经常用到的**日期处理类**(注意:不是 `java.sql.Date`)
* 包含了年、月、日、时、分、秒等信息
```
// date1 代表当前时间
Date date1 = new Date();
// System.currentTimeMillis 表示 1970-01-01 00:00:00 GMT 到现在时间的毫秒数
// date2 也代表当前时间
Date date2 = new Date(System.currentTimeMillis());
// date3 代表 1970-01-01 00:00:00 GMT
Date date3 = new Date(0);
// Mon Apr 20 13:44:49 CST 2020
System.out.println(date1);
// Mon Apr 20 13:44:49 CST 2020
System.out.println(date2);
// Thu Jan 01 08:00:00 CST 1970
System.out.println(date3);
```
`System.currentTimeMillis` 返回的是从 1970-01-01 00:00:00 GMT 开始到现在经历的毫秒数
* 1970-01-01 **00:00:00 GMT**、1970-01-01 **08:00:00 CST** 代表的是同一个时间
* **GMT**(Greenwich Mean Time):格林尼治时间
* **CST**(China Standard Time UT+8:00):中国标准时间
`Date` 常用方法:
```
Date d1 = new Date();
Date d2 = new Date();
// 设置毫秒数, d1比d2早(d2经历的时间比d1大)
d1.setTime(1000);
d2.setTime(2000);
// 获取毫秒数
d1.getTime(); // 1000
d2.getTime(); // 2000
// 比较时间
d2.after(d1); // true
d1.before(d2); // true
d1.compareTo(d2); // -1(d2经历的时间比d1大)
```
[]( )SimpleDateFormat
-----------------------------------------------------------------------------------
`java.text.SimpleDateFormat` 常用来进行**日期的格式化处理**
```
SimpleDateFormat fmt = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// 利用日期对象生成字符串
String str = fmt.format(new Date());
// 2020年04月20日 13:57:13
System.out.println(str);
// 解析字符串为日期对象
Date date = fmt.parse(str);
// Mon Apr 20 13:57:13 CST 2020
System.out.println(date);
```
`SimpleDateFormat` 的模式字母:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020042013593859.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
[]( )Calendar
---------------------------------------------------------------------------
`java.util.Calendar` 也是开发中经常用到的**日期处理类**
* 功能比 `Date` 更加丰富,`Date` 中很多过期的方法都迁移到了 `Calendar` 中
示例:目前是 2020年4月20日 星期一 下午 14:16:33
```
// 表示当前时间
Calendar c = Calendar.getInstance();
c.getTime(); // Mon Apr 20 14:16:33 CST 2020
c.get(Calendar.YEAR); // 年: 2020
// 月(取值范围[0, 11], 0是1月, 11是12月)
c.get(Calendar.MONTH); // 3
// 一月中的第几天(取值范围[1, 31])
c.get(Calendar.DAY_OF_MONTH); // 20
// 一周中的第几天(取值范围[1, 7], 1是星期天, 2是星期一...,7是星期六)
c.get(Calendar.DAY_OF_WEEK); // 2
// 一年中的第几天(取值范围[1, 366])
c.get(Calendar.DAY_OF_YEAR); // 111
c.get(Calendar.HOUR); // 时: 2
c.get(Calendar.MINUTE); // 分: 16
c.get(Calendar.SECOND); // 秒: 33
c.get(Calendar.MILLISECOND); // 毫秒: 330
```
`Calendar` 的常用方法:
```
Calendar c = Calendar.getInstance();
// 设置时间为 2019年7月6日
c.set(2019, 06, 06);
// 2019年7月11日
c.add(Calendar.DAY_OF_MONTH, 5);
// 2019年9月11日
c.add(Calendar.MONTH, 2);
// 设置Date对象
c.setTime(new Date());
// 获得Date对象
c.getTime();
// 设置毫秒数
c.setTimeInMillis(System.currentTimeMillis());
// 获得毫秒数
c.getTimeInMillis();
```
### []( )打印格式化(很少用)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200420142245924.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)