Java 字符串对象创建-双引号,如何创建?

Java 字符串对象创建-双引号,如何创建?,java,string,object,Java,String,Object,可能重复: 在Java中,类对象的创建方式如下- MyClass a=new MyClass(); String a="Hello"; 那么字符串类对象是如何创建的- MyClass a=new MyClass(); String a="Hello"; 这个“Hello”是如何创建新对象的?String a=“Hello”实际上并没有创建新对象。相反,当编译器看到一个字符串文本(如“Hello”)时,它会将该字符串添加到字符串文本池中,稍后将从中加载该字符串。提供一个字符串作为文本,最

可能重复:

在Java中,类对象的创建方式如下-

MyClass a=new MyClass();
String a="Hello";
那么字符串类对象是如何创建的-

MyClass a=new MyClass();
String a="Hello";

这个“Hello”是如何创建新对象的?

String a=“Hello”
实际上并没有创建新对象。相反,当编译器看到一个字符串文本(如
“Hello”
)时,它会将该字符串添加到字符串文本池中,稍后将从中加载该字符串。

提供一个字符串作为文本,最终使其进入JVM的
字符串文本池。引述自:


字符串分配和所有对象分配一样,在时间和内存上都很昂贵。JVM在实例化字符串文本以提高性能和减少内存开销时执行一些技巧。为了减少JVM中创建的字符串对象的数量,String类保留了一个字符串池。每次代码创建字符串文字时,JVM都会首先检查字符串文字池。如果该字符串已存在于池中,则返回对池实例的引用。如果池中不存在该字符串,则会实例化一个新的字符串对象,然后将其放入池中。Java可以进行这种优化,因为字符串是不可变的,可以在不担心数据损坏的情况下共享。例如:

结果是

不幸的是,当你使用

字符串对象是从字符串文字池中创建的,即使池中已经存在相同的字符串。考虑到所有这些,除非您明确知道您需要新字符串,否则请避免使用新字符串!比如说

结果是


为什么它还没有关闭,这个问题已经关闭了很多次,因为它是重复的。“如果字符串已经存在于池中,则返回对池实例的引用。如果字符串不存在于池中,则实例化一个新的字符串对象,然后将其放入池中”,因此,如果字符串在池中不存在,它会创建一个对象。@Talnocolas:这发生在类加载时,而不是在所讨论的字节码的运行时。@Thilo是的,但我想说清楚,对象是在某个时刻创建的,这里没有什么神奇之处……这就是为什么您应该始终使用
equals()
而不是用于字符串比较的
=
String a=new String("Hello");
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