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”);
- 字符串缓冲区:
StringBuffer是String的对等类,它提供了字符串的大部分功能。字符串表示固定长度、不可变的字符序列,而 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 提供了一种简单的方法来做到这一点,而无需编写太多代码。
句法:
public StringJoiner(CharSequence delimiter)
上面我们看到我们可以通过 String 字面量创建字符串。
For ex- // String s=”Welcome”;
在这里,JVM 检查字符串常量池。如果字符串不存在,则创建一个新的字符串实例并将其放置在池中。如果字符串存在,则不会创建新对象。相反,它将返回对同一实例的引用。存储这些字符串实例的缓存称为字符串常量池或字符串池。在Java的早期版本中,直到 JDK 6 字符串池位于 PermGen(永久代)空间内。但是在 JDK 7 中,它被移到了主堆区域。
为什么字符串池从 PermGen 移动到正常的堆区域?
PermGen 空间有限,默认大小仅为 64 MB。在 PermGen 空间中创建和存储太多字符串对象是一个问题。这就是字符串池被移到更大的堆区域的原因。为了使Java内存效率更高,使用了字符串字面量量的概念。通过使用 'new' 关键字,即使字符串池中存在相同的字符串对象,JVM 也会在普通堆区域中创建一个新的字符串对象。
对于前-
String a=new String(“Bhubaneswar”)
让我们用一个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
注意: Java中的所有对象都存储在堆中。引用变量指向存储在堆栈区域中的对象,或者它们可以包含在其他对象中,这些对象也将它们放入堆区域。