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