作为常量或单例的Java字符串字面量
字符串是一个字符序列,在Java编程中被广泛使用。在Java编程语言中,字符串是对象。在Java中,如果我们在其他字符串变量声明中使用相同的字符串,虚拟机可能只会在内存中创建单个 String 实例。为了便于理解,让我们考虑如下示例:
图 1:
String string1 = "GeeksForGeeks";
String string2 = "GeeksForGeeks";
在上面的例子中, Java虚拟机只会在内存中创建一个“GeeksForGeeks”实例。有两个不同的变量,初始化为“GeeksForGeeks”字符串将指向内存中的同一个字符串实例。下图更准确地描述了示例:-
字符串字面量因此成为事实上的常量或单例。更准确地说,在Java,表示Java String字面量的对象是从一个常量 String 池获得的,该池由Java虚拟机内部保存。这意味着,即使来自不同项目的类分别编译,但在同一应用程序中使用,也可能共享常量 String 对象。共享发生在运行时,因此它不是编译时功能。
图 2:如果我们希望这两个字符串变量指向单独的 String 对象,那么我们使用 new运算符如下:
String string1 = new String("GeeksForGeeks");
String string2 = new String("GeeksForGeeks");
即使两个字符串的值相同,上面的代码也会在内存中创建两个不同的内存对象来表示它们。下图描述了 new运算符的使用:
Note: From the image above it is clearly depicted that two different memory blocks are created for two different string which contains same value string.
示例 1:
Java
// Java Program to Illustrate String Literals as
// Constants or Singletons
// Main class
// StringSingleton
public class GFG {
// Main driver method
public static void main(String[] args)
{
// Strings
String string1 = "GeeksForGeeks";
String string2 = "GeeksForGeeks";
String string3 = new String("GeeksForGeeks");
String string4 = new String("GeeksForGeeks");
// Checking if two string are same or not
if (string1 == string2) {
// Returns true
System.out.println("True");
}
else {
// Returns false
System.out.println("False");
}
// Again checking if two string are same or not
if (string1 == string3) {
// Returns false
System.out.println("True");
}
else {
System.out.println("False");
}
// Again checking if two string are same or not
if (string4 == string3) {
// Returns false
System.out.println("True");
}
else {
System.out.println("False");
}
}
}
Java
// Java Program to Illustrate String Literals as
// Constants or Singletons
// Main class
// StringSingleton
public class GFG {
// Main driver method
public static void main(String[] args)
{
// Strings
String string1 = "GeeksForGeeks";
String string3 = new String("GeeksForGeeks");
// Print and display statements
// Displays true
System.out.println(string1.equals(string3));
// Displays false
System.out.println(string1 == string3);
}
}
True
False
False
In the above program, a total of 3 objects will be created. Now, if we want to compare 2 string contents, we can use the equals method, and ‘==’ operator can be used to compare whether two string references are the same or not.
示例 2:
Java
// Java Program to Illustrate String Literals as
// Constants or Singletons
// Main class
// StringSingleton
public class GFG {
// Main driver method
public static void main(String[] args)
{
// Strings
String string1 = "GeeksForGeeks";
String string3 = new String("GeeksForGeeks");
// Print and display statements
// Displays true
System.out.println(string1.equals(string3));
// Displays false
System.out.println(string1 == string3);
}
}
true
false