九字符串的学习

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是线程安全的,同步处理,性能稍慢

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值