9.1字符串
字符串:是由若干个字符组成的一个有序的序列。在Java中,使用String这个类来描述字符串。
1) java.lang.String 使用final修饰,不能被继承
2) 字符串底层封装的是字符数组及其针对数组的操作方法
3) 字符串一旦创建,对象永远无法改变,但字符串引用可以重新赋值
4) 字符串在内存中采用Unicode编码方式,任何一个字符对应两个字节的定长编码
5) 字符串的索引值从0开始
9.2字符串常量池
**JVM为了提升性能和减少内存开销,避免重复创建字符串,其维护了一块特殊的内存空间,即字符串常量池**。当需要使用静态字符串(字面量/常量/常量连接的结果)时,先去检查字符串[常量池](https://so.csdn.net/so/search?q=常量池&spm=1001.2101.3001.7020)是否存在该字符串,若存在,则直接返回该字符串的引用地址;若不存在,则在字符串常量池中创建字符串对象,并返回对象的引用地址。
在 JDK 1.7 之前,运行时常量池(包括字符串常量池)存放在方法区。
在 JDK 1.7 时,字符串常量池被从方法区转移至 Java 堆中,注意并不是运行时常量池,而是字符串常量池被单独转移到堆,运行时常量池剩下的东西还是方法区中。
在 JDK 1.8 时,此时字符串常量池还在堆中。
## 9.3 常用构造器
1) String()
初始化一个新创建的空字符序列的字符串对象
2) String(String str)
初始化一个新创建的字符串对象,使其字符序列与参数相同。
换句话说,新创建的对象是该参数的副本
<u>3) String(byte[] bytes)</u>
使用默认编码集解码byte数组,构建一个字符串对象
<u>4) String(byte[] bytes,String charsetName)</u>
使用指定编码集charsetName 解码byte数组,构建一个字符串对象
5) String(byte[] bytes, int offset, int length)
使用默认编码集解码byte数组的从offset开始,length个元素,构建一个字符串对象
6) String(char[] value)
初始化一个字符串对象,使其字符序列包含参数的元素
9.4 常用方法
1) length方法
length()方法可以获取字符串对象的字符个数。
一定要注意,数组的元素个数的获取方式是 引用.length, 不是方法,是属性
java
String obj = “你好,HelloWorld”;
System.out.println(obj.length()); //13
2) 使用indexOf实现检索
- String类型提供了几个重载的indexOf方法
int indexOf(String str)
int indexOf(String str,int fromIndex)
作用:用于返回指定字符串在此字符串中第一次出现的索引,找不到返回-1
- String还定义了lastIndexOf方法
int lastIndexOf(String str)
int lastIndexOf(String str,int endIndex)
**作用**:用于返回指定字符串在此字符串中最后一次出现的索引,找不到返回-1
3) 使用substring获取子串
- 作用:substring方法用于返回一个字符串的子字符串
- 常用重载方法:
String substring(int beginIndex)
String substring(int beginIndex,int endIndex)
```
**4)** trim截掉空格
**作用**:去掉一个字符串的前与后的空字符,不会去掉中间的空字符
String trim()
**5)** charAt获取字符
作用:返回指定索引处的char值
char charAt(int index)
**6)** startsWith和endsWith
作用:检查一个字符是否以指定的字符串为前缀或后缀
boolean startsWith(String str)
boolean endsWith(String str)
**7)** 大小写变换
作用:对字符串中的字母进行转换成全部大写或全部小写
String toUpperCase()
String toLowerCase()
**8)** toCharArray
作用: 将字符串转变成字符数组
char[] toCharArray()
```
**9)** valueOf
作用:将其他类型转换成字符串类型
```
static String valueOf(int value)
static String valueOf(double d)
static String valueOf(char[] ch)
static String valueOf(Object obj)
```
10) equals与==
- equals方法用于判断两个字符串的内容是否一样
- ==用于判断两个字符串是不是同一个对象
- ## 9.5 StringBuilder和StringBuffer
由于字符串是不可变的,因此对字符串进行操作的时候,比较的麻烦,每次的操作都需要实例化一个 临时的空间来存放结果,效率不高。可以使用其他的某些类,来实现高效率的字符串的操作:StringBuilder和StringBuffer。
StringBuilder和StringBuffer,都是一个可变的字符序列(即可变的字符串),对象创建后可以通过调用方法来实现字符序列的改变,StringBuilder和StringBuffer类中的方法完全相同。 只需要学会其中一个,另一个就会了。
### 9.5.1 常用构造器
- StringBuilder()
构造一个不带任何字符的字符串生成器,其初始容量为16个字符
- StringBuilder(String str)
构造一个字符串生成器,其初始化为指定的字符串内容
9.5.2 常用方法
StringBuilder的很多方法的返回值均为StringBuilder类型,这些方法的返回值语句是:return this。也就是返回对象本身(地址),因此可以使用流式编程。
*1) append方法*
作用:将指定字符串追加到字符串之后
```
StringBuilder append(boolean b)
StringBuilder append(String str)
```
#### 2) insert方法
作用:将指定字符串插入到字符串的指定索引处
```
StringBuilder insert(int index,String str)
```
查阅API看重载方法
#### 3) delete方法
作用:删除字符串中的一部分
```
StringBuilder delete(int start , int end)
```
*4) reverse方法*
作用:将字符序列进行反转(左右颠倒)
```
StringBuilder reverse()
```
#### 5) toString方法
作用:将StringBuilder对象转变成String对象
```
String toString()
```
案例演示:
```java
// 对StringBuffer和StringBuilder进行的操作,可以直接影响自身,不用接受返回值。 // 1、构造,空字符串
// StringBuffer sb = new StringBuffer(); // 2、通过一个字符串实例化一个StringBuffer对象
StringBuffer sb = new StringBuffer("hello");
// 3、向后拼接元素
sb.append("!");
// 4、向指定位插入元素
sb.insert(5, " world");
// 5、删除指定范围的元素 [from, end)
sb.delete(6, 11);
// 6、删除指定下标的元素
sb.deleteCharAt(5);
// 7、将一个字符串的指定部分替换成新的字符串 hello!
sb.replace(5, 6, " world");
// 8、字符串翻转 "上海自来水来自海上 "
sb.reverse();
// 9、转成字符串
sb.toString();
```
9.5.3 三者的区别
- StringBuilder是可变字符串,如果进行字符串的内容计算,建议选择StringBuilder,这样性能更好一些。
- java的字符串连接的过程是利用StringBuilder实现的
- StringBuilder 也是final修饰的类型,不能被继承
- StringBuilder没有重写equals方法和toString()
- StringBuilder是非线程安全的,并发处理,性能稍快
- StringBuffer是线程安全的,同步处理,性能稍慢