Java 中字符串的存储
字符串是 Java 中的一个类,用于存储一系列字符。这些字符实际上是 String 类型的对象。字符串的值用双引号括起来。String 类位于 java.lang 包中。
在本文中,我们将深入了解 Java 中字符串的存储机制。
字符串和字符串的存储
创建字符串 -
语法
String nameOfobject = “ values ”;
示例 1
String st1 = “Tutorix and Tutorialspoint”;
这里,'st1' 是引用变量,其值用双引号括起来。
我们也可以使用 new 关键字来创建新的字符串 -
语法
String nameOfobject = new String(“ values ”);
示例 2
String st2 = new String(“You are here at Tutorialspoint”);
这里,'st2' 是使用 new 关键字创建的引用变量。
从字符数组创建字符串 -
示例 3
char chs[] = { ‘T’, ‘U’, ‘T’, ‘O’, ‘R’, ‘I’, ‘X’ }; String st3 = new String(chs);
在上面的示例中,我们创建了一个字符数组 'chs',并将其作为参数传递给字符串 'st3',使用了 new 关键字。
到目前为止,我们已经讨论了什么是字符串以及如何用多种方法创建字符串。现在,让我们了解它如何在内存中存储。
字符串池
Java 中字符串的存储方式与其他编程语言不同。我们都知道引用变量存储在栈中,它们的值存储在堆中。字符串也是如此,引用变量存储在栈中,但它们的字符对象及其值则存储在字符串池中,字符串池是堆内的一个独立的内存空间。
当我们创建一个字符串类型的对象时,它会被存储在堆的字符串池中。此时,字符串池在堆中创建。现在,无论何时我们创建一个具有相同值或不同值的新字符串,JVM 都会检查给定的值是否已存在于字符串池中。如果不存在,则会为该引用变量创建新的值,但在相反的情况下,JVM 不会使用给定值重新创建新对象,它只是将旧值指向该引用变量。
示例
假设我们正在创建一个字符串对象,如下所示 -
String st4 = “Tutorix”;
然后,它将存储在字符串池中 -
当我们创建一个新的字符串对象时 -
String st5 = “Tutorials”; 那么,
但是,如果我们将 st5 初始化为“Tutorix”,则 JVM 不会为其创建新对象。它将旧值指向 'st5'。
检查字符串存储的程序
我们可以使用比较运算符 '==' 来检查两个引用变量是否指向同一个对象。当两个对象引用指向同一个实例时,它返回 true,否则返回 false。
示例 1
在这个示例中,我们将声明并初始化两个字符串变量 'st1' 和 'st2',它们具有相同的值。然后,我们将使用 == 运算符来检查它们是否指向同一个对象。结果将存储在一个布尔变量 'isSame' 中。
public class Main { public static void main(String[] args) { String st1 = "Tutorix"; String st2 = "Tutorix"; boolean isSame = (st1 == st2); System.out.print(isSame); } }
输出
true
示例 2
在这个示例中,我们将使用 new 关键字创建两个字符串对象。当我们使用 new 关键字时,JVM 会创建一个新对象,而不管给定对象的值是什么。换句话说,JVM 将为给定的引用变量创建一个新对象,无论其值是否相同。
public class Main { public static void main(String[] args) { String st1 = new String("Tutorix"); String st2 = new String("Tutorix"); boolean isSame = (st1 == st2); System.out.print(isSame); } }
输出
false
在上面的代码中,我们使用 new 关键字创建了两个字符串,并再次使用 == 运算符检查它们是否指向同一个对象。这里的结果为 false,这表示两者指向不同的对象。
结论
在本文中,我们了解了字符串以及它们如何在内存中存储。此外,我们还通过 Java 程序检查了具有相同值的两个引用变量是否指向同一个对象。