📜  Java中的字符串

📅  最后修改于: 2022-05-13 01:54:26.814000             🧑  作者: Mango

Java中的字符串

Java中的字符串是由 char 数组在内部支持的对象。由于数组是不可变的(不能增长),因此字符串也是不可变的。每当对 String 进行更改时,都会创建一个全新的 String。

句法:

  = ""; 

例子:

String str = "Geeks";

字符串的内存分配

每当将 String 对象创建为字面量时,该对象将在 String 常量池中创建。这允许 JVM 优化 String 字面量的初始化。

例如:

String str = "Geeks";

该字符串也可以使用new运算符进行声明,即动态分配。如果 String 是动态分配的,它们会在堆中分配一个新的内存位置。该字符串不会被添加到字符串常量池中。

例如:

String str = new String("Geeks");

如果您想将此字符串存储在常量池中,则需要“实习”它。

例如:

String internedString = str.intern(); 
// this will add the string to string constant pool.

最好使用字符串字面量,因为它允许 JVM 优化内存分配。

显示如何声明 String 的示例

Java
// Java code to illustrate String
import java.io.*;
import java.lang.*;
 
class Test {
    public static void main(String[] args)
    {
        // Declare String without using new operator
        String s = "GeeksforGeeks";
 
        // Prints the String.
        System.out.println("String s = " + s);
 
        // Declare String using new operator
        String s1 = new String("GeeksforGeeks");
 
        // Prints the String.
        System.out.println("String s1 = " + s1);
    }
}


Java
class StringStorage {
    public static void main(String args[])
    {
        String s1 = "TAT";
        String s2 = "TAT";
        String s3 = new String("TAT");
        String s4 = new String("TAT");
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);
    }
}


输出:
String s = GeeksforGeeks
String s1 = GeeksforGeeks

Java中字符串中的接口和类

  • CharBuffer:这个类实现了 CharSequence 接口。此类用于允许使用字符缓冲区代替 CharSequences。这种用法的一个例子是正则表达式包Java.util.regex。
  • 字符串:字符串是一个字符序列。在Java中, String 的对象是不可变的,这意味着一个常量,一旦创建就不能更改。

创建字符串

  • 在Java中创建字符串有两种方法:
    • 字符串字面量
String s = “GeeksforGeeks”;
  • 使用关键字
String s = new String (“GeeksforGeeks”);
  • 字符串缓冲区:
    StringBufferString的对等类,它提供了字符串的大部分功能。字符串表示固定长度、不可变的字符序列,而 StringBuffer 表示可增长和可写的字符序列。
    句法:
StringBuffer s = new StringBuffer("GeeksforGeeks");
  • 字符串生成器:
    Java中的StringBuilder表示可变的字符序列。由于Java中的 String 类创建了一个不可变的字符序列,因此 StringBuilder 类提供了 String 类的替代方案,因为它创建了一个可变的字符序列。
    句法:
StringBuilder str = new StringBuilder();
str.append("GFG");
  • 字符串标记器:
    Java中的 StringTokenizer 类用于将字符串分解为标记。
    例子:

字符串分词器

  • StringTokenizer 对象在内部维护要标记化的字符串中的当前位置。一些操作将当前位置推进到处理的字符之后。通过获取用于创建 StringTokenizer 对象的字符串的子字符串来返回令牌。
  • 字符串连接器:
    StringJoiner 是Java.util包中的一个类,用于构造由分隔符分隔的字符序列(字符串),并且可以选择以提供的前缀开头并以提供的后缀结尾。尽管这也可以借助 StringBuilder 类在每个字符串后附加分隔符,但 StringJoiner 提供了一种简单的方法来做到这一点,而无需编写太多代码。
    句法:

上面我们看到我们可以通过 String 字面量创建字符串。

在这里,JVM 检查字符串常量池。如果字符串不存在,则创建一个新的字符串实例并将其放置在池中。如果字符串存在,则不会创建新对象。相反,它将返回对同一实例的引用。存储这些字符串实例的缓存称为字符串常量池或字符串池。在Java的早期版本中,直到 JDK 6 字符串池位于 PermGen(永久代)空间内。但是在 JDK 7 中,它被移到了主堆区域。

为什么字符串池从 PermGen 移动到正常的堆区域?

PermGen 空间有限,默认大小仅为 64 MB。在 PermGen 空间中创建和存储太多字符串对象是一个问题。这就是字符串池被移到更大的堆区域的原因。为了使Java内存效率更高,使用了字符串字面量量的概念。通过使用 'new' 关键字,即使字符串池中存在相同的字符串对象,JVM 也会在普通堆区域中创建一个新的字符串对象。

对于前-

让我们用一个Java程序看一下这个概念,并可视化实际的JVM内存结构:

程序:

Java

class StringStorage {
    public static void main(String args[])
    {
        String s1 = "TAT";
        String s2 = "TAT";
        String s3 = new String("TAT");
        String s4 = new String("TAT");
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);
    }
}
输出
TAT
TAT
TAT
TAT

JVM内存区

注意: Java中的所有对象都存储在堆中。引用变量指向存储在堆栈区域中的对象,或者它们可以包含在其他对象中,这些对象也将它们放入堆区域。