# 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`出现在图片中。