可能重复:
Strings are objects in Java, so why don't we use 'new' to create them?
在Java中,类对象的创建方式与 -
类似MyClass a=new MyClass();
然后如何创建String类对象 -
String a="Hello";
这个“Hello”对创建新对象有什么作用?
答案 0 :(得分:4)
String a = "Hello"
实际上并不创建新对象。相反,当编译器看到像"Hello"
这样的字符串文字时,它会将字符串添加到字符串文字池中,稍后将从中加载该字符串。
答案 1 :(得分:2)
将String作为文字提供最终使其位于JVM的String Literal Pool
中。引自this article:
与所有对象分配一样,字符串分配在时间和内存方面都证明是昂贵的。 JVM在实例化字符串文字时执行一些技巧,以提高性能并减少内存开销。为了减少在JVM中创建的String对象的数量,String类保留了一个字符串池。每次代码创建字符串文字时,JVM首先检查字符串文字池。如果池中已存在该字符串,则返回对池化实例的引用。如果池中不存在该字符串,则新的String对象将实例化,然后放入池中。 Java可以进行优化,因为字符串是不可变的,可以共享而不用担心数据损坏。例如:
public class Program
{
public static void main(String[] args)
{
String str1 = "Hello";
String str2 = "Hello";
System.out.print(str1 == str2);
}
}
结果是
true
不幸的是,当你使用
时String a=new String("Hello");
即使池中已存在相等的字符串,也会从String文本池中创建String对象。考虑到这一切,避免使用新的String,除非您明确知道自己需要它!例如
public class Program
{
public static void main(String[] args)
{
String str1 = "Hello";
String str2 = new String("Hello");
System.out.print(str1 == str2 + " ");
System.out.print(str1.equals(str2));
}
}
结果是
false true