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

时间:2011-12-14 07:39:59

标签: java string object

  

可能重复:
  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”对创建新对象有什么作用?

2 个答案:

答案 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