# Java 字符串类指南

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

**Java 字符串**表示[不可变的](https://howtodoinjava.com/java/string/java-interview-question-why-strings-are-immutable/)字符序列，并且一旦创建就无法更改。 字符串的类型为`java.lang.String`类。 在此页面中，学习有关使用字符串字面值和[构造器](https://howtodoinjava.com/oops/java-constructors/)，字符串方法以及与字符串转换和格式设置有关的各种字符串示例创建字符串的信息。

## 1\. 用 Java 创建字符串

用 Java 创建字符串的方法有两种。

1.  #### 字符串字面量

    字符串字面值最简单，建议使用**在 Java 中创建字符串**。 这样，只需将双引号中的字符分配给`java.lang.String`类型的变量。

    ```java
    String blogName = "howtodoinjava.com";

    String welcomeMessage = "Hello World !!";

    ```

    字符串字面值存储在字符串池中，字符串池是由 JVM 创建的特殊内存区域。 一个`String`只能有一个实例。 具有相同字符序列的任何第二个`String`都将第一个字符串的引用存储在字符串池中。 它可以高效地使用字符串，并在运行时节省大量物理内存。

    ```java
    String blogName1 = "howtodoinjava.com";
    String blogName2 = "howtodoinjava.com";
    String blogName3 = "howtodoinjava.com";
    String blogName4 = "howtodoinjava.com";
    String blogName5 = "howtodoinjava.com";

    ```

    在上面的示例中，我们创建了 5 个具有相同`char`序列的字符串字面值。 在 JVM 内部，字符串池中只有一个`String`实例。 所有其余的 4 个实例将共享为第一个字面值创建的字符串字面值的引用。

2.  #### 字符串对象

    有时，我们可能希望为内存中的每个单独的字符串创建单独的实例。 我们可以使用**新的**关键字为每个字符串值创建一个字符串对象。

    使用`new`关键字创建的字符串对象 – 存储在*堆内存*中。

    ```java
    String blogName1 = new String("howtodoinjava.com");
    String blogName2 = new String("howtodoinjava.com");
    String blogName3 = new String("howtodoinjava.com");

    ```

    在上面的示例中，堆内存中将有 3 个具有相同值的`String`实例。

## 2\. Java 字符串方法

1.  [`char charAt(int index)`](https://howtodoinjava.com/java/string/string-charat-method-example/) – 返回指定索引处的字符。 指定的索引值应介于`0`至`length() -1`之间（包括两个端点）。 如果索引无效/超出范围，则抛出`IndexOutOfBoundsException`。

    ```java
    String blogName = "howtodoinjava.com";

    char c = blogName.charAt(5);	//'d'

    ```

2.  [`boolean equals(Object obj)`](https://howtodoinjava.com/java/string/string-equals-method/) – 将字符串与指定的字符串进行比较，如果两者均匹配，则返回`true`，否则返回`false`。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.equals( "howtodoinjava.com" );		//true
    blogName.equals( "example.com" );			//false
    ```

3.  [`boolean equalsIgnoreCase(String str)`](https://howtodoinjava.com/java/string/string-equalsignorecase-method/) – 与`equals`方法相同，但不区分大小写。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.equalsIgnoreCase( "howtodoinjava.com" );		//true
    blogName.equalsIgnoreCase( "HowToDoInJava.com" );		//true
    ```

4.  [`int compareTo(String string)`](https://howtodoinjava.com/java/string/java-string-compareto-method/) – 根据字符串中每个字符的 Unicode 值按字典顺序比较两个字符串。 您可以考虑基于字典的比较。

    如果参数字符串等于此字符串，则返回值为 0；否则，返回值为 0。 如果此字符串在字典上小于字符串参数，则小于 0 的值； 如果该字符串在字典上大于字符串参数，则该值大于 0。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.compareTo( "HowToDoInJava.com" );		//32
    blogName.compareTo( "example.com" );			//3

    ```

5.  [`int compareToIgnoreCase(String str)`](https://howtodoinjava.com/java/string/string-comparetoignorecase-example/) – 与`CompareTo`方法相同，但是在比较期间忽略大小写。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.compareToIgnoreCase( "HowToDoInJava.com" );		//0
    blogName.compareToIgnoreCase( "example.com" );				//3

    ```

6.  [`boolean startsWith(String prefix, int offset)`](https://howtodoinjava.com/java/string/java-string-startswith-example/) – 从指定的偏移量索引开始，检查`String`是否具有指定的前缀。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.startsWith( "d", 5 );		//true
    blogName.startsWith( "e", 5 );		//false

    ```

7.  [`boolean startsWith(String prefix)`](https://howtodoinjava.com/java/string/java-string-startswith-example/) – 测试字符串是否已指定`prefix`，如果是，则返回`true`，否则返回`false`。 在此重载方法中，偏移索引值为 0。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.startsWith( "h" );		//true
    blogName.startsWith( "e" );		//false

    ```

8.  [`boolean endsWith(String subfix)`](https://howtodoinjava.com/java/string/java-string-endswith-method/) – 查字符串是否以指定的后缀结尾。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.endsWith( "com" );			//true
    blogName.endsWith( "java" );		//false

    ```

9.  [`int hashCode()`](https://howtodoinjava.com/java/string/string-hashcode-method/) – 返回字符串的哈希码。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.hashCode();			//1894145264

    ```

0.  [`int indexOf(int ch)`](https://howtodoinjava.com/java/string/java-string-indexof-method-example/) – 返回指定字符参数在字符串中首次出现的索引。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.indexOf( 'o' );			//1

    ```

1.  [`int indexOf(int ch, int fromIndex)`](https://howtodoinjava.com/java/string/java-string-indexof-method-example/) – `indexOf(char ch)`方法的重载版本，但是它开始从指定的`fromIndex`中搜索字符串。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.indexOf( 'o', 5 );		//6

    ```

2.  [`int indexOf(String str)`](https://howtodoinjava.com/java/string/java-string-indexof-method-example/) – 返回指定子字符串`str`首次出现的索引。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.indexOf( "java" );			//9

    ```

3.  [`int indexOf(String str, int fromIndex)`](https://howtodoinjava.com/java/string/java-string-indexof-method-example/) - `indexOf(String str)`方法的重载版本，但是它开始从指定的`fromIndex`中搜索字符串。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.indexOf( "java" , 5);			//9

    ```

4.  [`int lastIndexOf(int ch)`](https://howtodoinjava.com/java/string/string-lastindexof-method/) – 返回字符串中字符`'ch'`的最后一次出现。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.lastIndexOf( 'o' );			//15

    ```

5.  [`int lastIndexOf(int ch，int fromIndex)`](https://howtodoinjava.com/java/string/string-lastindexof-method/) – `lastIndexOf(int ch)`方法的重载版本。 从`fromIndex`开始向后搜索。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.lastIndexOf( 'o', 5 );			//4

    ```

6.  [`int lastIndexOf(String str)`](https://howtodoinjava.com/java/string/string-lastindexof-method/) – 返回最后一次出现的字符串`str`的索引。 与`lastIndexOf(int ch)`相似。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.lastIndexOf( "java" );			//9

    ```

7.  [`int lastIndexOf(String str, int fromIndex)`](https://howtodoinjava.com/java/string/string-lastindexof-method/) – `lastIndexOf(String str)`方法的重载版本。 从`fromIndex`开始向后搜索。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.lastIndexOf( "java", 6 );			//9

    ```

8.  [`String substring(int beginIndex)`](https://howtodoinjava.com/java/string/java-string-substring-example/) – 返回字符串的子字符串。 子字符串以指定索引处的字符开头。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.substring( 7 );		//injava.com

    ```

9.  [`String substring(int beginIndex, int endIndex)`](https://howtodoinjava.com/java/string/java-string-substring-example/) – 返回子字符串。 子字符串以`beginIndex`处的字符开头，以`endIndex`处的字符结尾。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.substring( 7, 9 );		//in

    ```

0.  [`String concat(String str)`](https://howtodoinjava.com/java/string/java-string-concat-method-example/) – 在字符串的末尾连接指定的字符串参数。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.concat( " Hello Visitor !!" );		//howtodoinjava.com Hello Visitor !!

    ```

1.  [`String replace(char oldChar, char newChar)`](https://howtodoinjava.com/java/string/java-string-replace-method/) – 使用`newChar`参数更改所有出现的`oldChar`之后，返回新的更新字符串。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.replace( 'o', 'O' );		//hOwtOdOinjava.cOm

    ```

2.  [`public String replace(CharSequence target, CharSequence replacement)`](https://howtodoinjava.com/java/string/java-string-replace-method/) – 使用`replacement`参数更改所有出现的`target`后，返回新的更新字符串。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.replace( "com", "COM" );		//howtodoinjava.COM

    ```

3.  [`String replaceFirst(String regex, String replacement)`](https://howtodoinjava.com/java/string/java-string-replacefirst-example/) – 用指定的替换字符串替换与给定[正则表达式](https://howtodoinjava.com/java-regular-expression-tutorials/)参数匹配的子字符串的第一个匹配项。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.replaceFirst("how", "HOW");		//HOWtodoinjava.com

    ```

4.  [`String.replaceAll(String regex, String replacement)`](https://howtodoinjava.com/java/string/java-string-replaceall-example/) – 用替换字符串替换所有出现的与正则表达式参数匹配的子字符串。

5.  [`String[] split（String regex, int limit）`](https://howtodoinjava.com/java/string/java-string-split-example/) – 拆分字符串并返回与给定正则表达式匹配的子字符串数组。 `limit`是数组中元素的最大数量。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.split("o", 3);		//[h, wt, doinjava.com]

    ```

6.  [`String[] split(String regex)`](https://howtodoinjava.com/java/string/java-string-split-example/) – 先前方法的重载，没有任何阈值限制。

7.  [`boolean contains(CharSequence s)`](https://howtodoinjava.com/java/string/java-string-contains-example/) – 检查字符串是否包含指定的`char`值序列。 如果是，则返回`true`，否则返回`false`。 如果参数为`null`，则抛出 [`NullPointerException`](https://howtodoinjava.com/java/exception-handling/how-to-effectively-handle-nullpointerexception-in-java/)。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.contains( "java" );		//true
    blogName.contains( "python" );		//false

    ```

8.  [`public String toUpperCase(Locale locale)`](https://howtodoinjava.com/java/string/java-string-touppercase-method/) – 使用指定语言环境定义的规则将字符串转换为大写字符串。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.toUpperCase( Locale.getDefault() );		//HOWTODOINJAVA.COM

    ```

9.  [`String.toUpperCase()`](https://howtodoinjava.com/java/string/java-string-touppercase-method/) – 先前的`toUpperCase()`方法的重载版本，带有默认语言环境。
0.  [`String toLowerCase(Locale locale)`](https://howtodoinjava.com/java/string/java-string-tolowercase-method/) – 使用给定语言环境定义的规则将字符串转换为小写字符串。
1.  [`String.toLowerCase()`](https://howtodoinjava.com/java/string/java-string-tolowercase-method/) – 具有默认语言环境的先前方法的重载版本。
2.  [`String.intern()`](https://howtodoinjava.com/java/string/java-string-intern-method-example/) – 在内存池中搜索指定的字符串，如果找到，则返回它的引用。 否则，此方法将在字符串池中分配创建字符串字面值并返回引用。
3. `boolean isEmpty()` – 如果给定的字符串长度为 0，则返回`true`，否则返回`false`。

    ```java
    String blogName = "howtodoinjava.com";

    blogName.isEmpty();		//false
    "".isEmpty();			//true

    ```

4.  `static String join()` - 使用指定的分隔符连接给定的字符串，并返回连接的 Java `String`字面值。

    ```java
    String.join("-", "how","to", "do", "in", "java")		//how-to-do-in-java

    ```

5.  `static String format()` – 返回格式化的字符串。
6.  `String.trim()` - 从 Java 字符串中删除开头和结尾的空格。
7.  `char[] toCharArray()` – 将字符串转换为字符数组。
8.  `static String copyValueOf(char[] data)` – 返回一个字符串，其中包含指定字符数组的字符。

    ```java
    char[] chars = new char[] {'h','o','w'};

    String.copyValueOf(chars);		//how

    ```

9.  `byte[] getBytes(String charsetName)` – 使用指定的字符集编码将字符串转换为字节序列。
0.  `byte [] getBytes()` – 先前方法的重载版本。 它使用默认字符集编码。
1.  `int length()` – 返回字符串的长度。
2.  `boolean match(String regex)` – 验证字符串是否与指定的正则表达式参数匹配。
3.  `int codePointAt(int index)` – 与`charAt()`方法相似。 它返回指定索引的 Unicode 代码点值，而不是字符本身。
4.  `static String copyValueOf（char[] data, int offset, int count）` – 先前方法的重载版本，带有两个额外的参数 – 子数组的初始偏移量和子数组的长度。 它根据额外的参数从数组中选择字符，然后创建字符串。
5.  `getChars(int srcBegin, int srcEnd, char [] dest, int destBegin)` – 将`src`数组的字符复制到`dest`数组。 仅将指定范围复制（从`srcBegin`到`srcEnd`）到`dest`子数组（从`destBegin`开始）。
6.  `static String valueOf()` – 返回所传递参数的字符串表示形式，例如`int`，`long`，`float`，`double`，`char`和`char`数组。
7.  `boolean contentEquals(StringBuffer sb)` – 将字符串与指定的字符串缓冲区进行比较。
8.  `boolean regionMatches(int srcoffset, String dest, int destoffset, int len)` – 将输入的子字符串与指定字符串的子字符串进行比较。
9.  `boolean regionMatches(boolean ignoreCase, int srcoffset, String dest, int destoffset, int len)` – `regionMatches`方法的另一个变体，带有额外的布尔值参数，用于指定比较是区分大小写还是不区分大小写。

## 3\. 字符串转换示例

1.  [将 Java 字符串转换为`int`](https://howtodoinjava.com/java/string/convert-string-to-int/)
2.  [在 Java 中将`int`转换为字符串](https://howtodoinjava.com/java/string/convert-int-to-string/) 
3.  [将字符串转换为长](https://howtodoinjava.com/java/string/convert-string-to-long/)
4.  [在 Java 中将`Long`转换为字符串](https://howtodoinjava.com/java/string/convert-long-to-string/)
5.  [将字符串转换为日期](https://howtodoinjava.com/java/date-time/java-parse-string-to-date/)
6.  [将日期转换为字符串](https://howtodoinjava.com/java/date-time/java-date-examples/)
7.  [将字符串转换为`String[]`示例](https://howtodoinjava.com/array/string-to-string-array/)
8.  [Java 8 – 连接字符串数组 – 将数组转换为字符串](https://howtodoinjava.com/java8/java-8-join-string-array-example/)
9.  [将字符串转换为`InputStream`示例](https://howtodoinjava.com/java/io/convert-string-to-inputstream-in-java/)
10.  [将`InputStream`转换为字符串示例](https://howtodoinjava.com/java/io/how-to-read-data-from-inputstream-into-string-in-java/)
11.  [Java 拆分 CSV 字符串 – 将字符串转换为列表示例](https://howtodoinjava.com/java/string/java-split-csv-string-to-list/)
12.  [将 CSV 连接到字符串](https://howtodoinjava.com/java8/java-8-string-join-csv-example/)
13.  [将 HTML 转义为字符串示例](https://howtodoinjava.com/java/string/unescape-html-to-string/)
14.  [转义 HTML – 将字符串编码为 HTML 示例](https://howtodoinjava.com/java/string/escape-html-encode-string/)
15.  [将字节数组转换为字符串](https://howtodoinjava.com/array/java-convert-byte-array-to-string-example/)
16.  [`StackTrace`到字符串的转换](https://howtodoinjava.com/java/string/convert-stacktrace-to-string/)
17.  [将浮点数转换为字符串 – 格式转换为 N 个小数点](https://howtodoinjava.com/java/string/float-to-string-format-decimal-points/)

## 4\. 有用的字符串示例

1.  [使用递归反转 Java 中的字符串](https://howtodoinjava.com/java/string/reverse-string-using-recursion/)
2.  [删除单词之间的多余空格](https://howtodoinjava.com/java/string/remove-extra-whitespaces-between-words/)
3.  [仅删除字符串的前导空格](https://howtodoinjava.com/java/string/remove-leading-whitespaces/)
4.  [仅删除字符串的结尾空格](https://howtodoinjava.com/java/string/trim-remove-trailing-spaces/)
5.  [如何在 Java 中反转字符串](https://howtodoinjava.com/puzzles/how-to-reverse-string-in-java/)
6.  [用 Java 反转字符串中的单词](https://howtodoinjava.com/java/string/reverse-words-in-string/) 
7.  [Java 中使用递归的反向字符串](https://howtodoinjava.com/java/string/reverse-string-using-recursion/)
8.  [如何在字符串中查找重复的单词](https://howtodoinjava.com/java/string/how-to-find-duplicate-words-in-a-string-in-java/)
9.  [如何在字符串中查找重复的字符](https://howtodoinjava.com/java/string/find-duplicate-characters/)
10.  [Java 按字母顺序对字符串字符进行排序](https://howtodoinjava.com/sort/sort-string-chars-alphabetically/)
11.  [将字符串转换为标题大小写](https://howtodoinjava.com/java/string/convert-string-to-titlecase/)
12.  [分割字符串的 4 种方法](https://howtodoinjava.com/java/string/4-ways-to-split-tokenize-strings-in-java/)
13.  [左，右或居中对齐字符串](https://howtodoinjava.com/java/string/how-to-left-right-or-center-align-string-in-java/)
14.  [读取文件为字符串](https://howtodoinjava.com/java/io/java-read-file-to-string-examples/)
15.  [Java 8 `StringJoiner`示例](https://howtodoinjava.com/java/string/java8-stringjoiner-example/)
16.  [用空格或零左移字符串](https://howtodoinjava.com/java/string/left-pad-string-with-spaces-zeros/)
17.  [用空格或零右填充字符串](https://howtodoinjava.com/java/string/right-pad-string-with-spaces-zeros/)
18.  [获取字符串的前 4 个字符](https://howtodoinjava.com/java/string/get-first-4-characters/)
19.  [获取字符串的后 4 个字符](https://howtodoinjava.com/java/string/get-last-4-characters/)
20.  [将字符串格式设置为`(123)456-7890`模式](https://howtodoinjava.com/java/string/format-phone-number/)

## 5\. 常见问题

1.  [始终使用`length()`而不是`equals()`来检查空字符串](https://howtodoinjava.com/java/string/always-use-length-instead-of-equals-to-check-empty-string-in-java/)
2.  [为什么字符串是不可变的](https://howtodoinjava.com/java/string/java-interview-question-why-strings-are-immutable/)
3.  [Java 字符串面试问题](https://howtodoinjava.com/interview-questions/interview-stuff-about-string-class-in-java/)

## 6\. 参考

[`String` Java 文档](https://docs.oracle.com/javase/9/docs/api/java/lang/String.html)