# Java 字符串教程

> 原文： [https://javabeginnerstutorial.com/core-java-tutorial/java-string-tutorial/](https://javabeginnerstutorial.com/core-java-tutorial/java-string-tutorial/)

字符串是 Java 中大量使用的那些对象之一。 这就是`String`在 Java（字符串池）中具有唯一处理的原因。

*   `String`类表示字符串。
*   Java 程序中的所有字符串字面值（例如`"abc"`）都实现为此类的实例。
*   字符串就像常量，一旦创建，其值就无法更改。
*   字符串对象是不可变的，因此可以共享。
*   如果要执行很多字符串操作，则可以使用字符串缓冲区和字符串生成器代替字符串。

### 字符串创建

您可以通过两种方式在 Java 中创建字符串。 两者看起来相同，但是两种方法之间存在差异。

```java
String jbt = new String("JBT");  

String jbt = "JBT";
```

### 字符串的重要方面

1.  不可变

### 重要方法

*   `internal()`
*   `length()`
*   `toString()`
*   `trim()`
*   `substring()`

## 字符串存储

如您所知，java 中除原语外的所有内容都是对象。 字符串也是如此。 字符串也是对象，因此它仅驻留在堆上。 但是还有另一个术语用于字符串存储，即字符串池/字符串字面值池。 大多数时候，人们将其视为字符串对象的独立池（对我来说也是如此）。 但是这是错误的。 字符串池/字符串字面值池不过是对`String`对象的引用的集合。 我们知道`String`对象是不可变的，因此最好将“`String`”对象与多个引用“共享”。 （反之亦然，因为字符串对象在不同的​​引用之间共享，这就是字符串对象不可变的原因。）

## 字符串字面值和对象

字符串以以下两种格式创建，它们在很多方面彼此不同。

1.  字符串字面值
2.  使用`new`关键字

因此，当我们说字符串字面值时，实际上是指字符串池中的引用，而当我们说字符串对象（使用`new`关键字）时，我们直接是指堆中的字符串对象。 但是在两种情况下，我们仅指的是堆中的对象（直接/间接）。

## 如何创建

现在的问题出现了如何创建字符串字面值和字符串对象。 众所周知，我们可以通过两种方式创建字符串对象。

> `String str1 = "abc";`

#### 使用`new`关键字

```java
String str=new String("javabeginnerstutorial");
```

当我们使用`new`运算符创建`String`时，实际上是像第一个选项那样在堆中创建`String`对象。 在这里，我们在堆内存中创建一个字符串对象，其值为`"abc"`。 和一个名为“`str`”的引用。

还请注意，当我们使用`""`（字面值）创建此`String`对象时，还将创建字面值。 总共将有 1 个字符串对象 1 个字符串字面值并将创建引用。 但是引用将仅引用堆中的`String`对象，而不引用字符串池中的字面值。

当我们使用`""`时，我们正在创建字面值（`""`中的所有内容均视为字面值）。 在这种情况下（第二种情况），JVM 将在字符串池中查找所有引用，并检查其中是否有指向值`"abc"`的堆中的字符串对象，如果找到，则将返回该对象的引用。 否则，JVM 将在堆中创建一个新的字符串对象，并在字符串池中对其进行内化（使用`inter()`方法）（此对象的引用将添加到字符串池中），以供以后引用。 并且将返回新创建对象的引用。 现在，如果我们再次编写相同的代码来创建`String`字面值。

#### 字符串字面值

```java
String str2="javabeginnerstutorial";
```

这些类型的字符串是在堆中创建的，如果`String`常量池中的对象具有相同的值，则堆中的对象将被引用为`String`常量池中的该对象。 引用变量`"str2"`将指向堆中的对象。

字符串常量池是一个存储唯一字符串对象的池，从而增强了不变性，即，即使您对先前创建的字符串进行连接，也将在堆和常量池中同时创建一个新对象（前提是没有相似之处） 之前存在的对象），然后将该对象相应地返回给程序。

## 字符串垃圾回收

您可能已经听说过`String`字面值永远不适合进行垃圾回收。 注意，我们提到的是字符串字面值，而不是字符串对象。 它们是有区别的。 当不再从应用的活动部分引用对象时，该对象就有资格进行垃圾回收。 字符串字面值总是从字符串字面值池中对其进行引用。 这意味着它们始终引用它们，因此不符合垃圾回收的条件。 但是可能有些`String`对象没有任何引用，那么它们就有资格进行垃圾回收。

## 备忘单

*   **字符串对象**用于保存文本字符串。
*   `java.lang`包的一部分。
*   *字符串*可以使用连接运算符（`+`）添加。
*   字符使用单引号（`'`）作为定界符，而字符串使用双引号（`"`）作为定界符。
*   **字符串**对象是不可变的。 字符串对象的值一经分配就无法更改。
*   字符串类是最终的方法，它不能覆盖字符串类的方法。
*   所有**字符串字面值**由 JVM 添加到字符串池。
*   字符串具有*方法*`length()`，而数组具有*属性*`length`检查长度。
*   为了克服`String`的不可变属性，`StringBuffer`和`StringBuilder`出现在图片中。

