【问题标题】:String object creation - double quotes, how? [duplicate]字符串对象创建 - 双引号,如何? [复制]
【发布时间】:2011-12-14 07:39:59
【问题描述】:

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

【问题讨论】:

标签: java string object


【解决方案1】:

String a = "Hello" 实际上并没有创建新对象。相反,当编译器看到像 "Hello" 这样的 字符串文字 时,它会将字符串添加到字符串文字池中,稍后将从中加载它。

【讨论】:

  • "如果字符串已经存在于池中,则返回对池中实例的引用。如果字符串不存在于池中,则实例化一个新的字符串对象,然后将其放入池中",因此,如果池中尚不存在字符串,它会创建一个对象。
  • @talnicolas:不过,这发生在类加载时,而不是相关字节码的运行时。
  • @Thilo 是的,但我认为明确地说,对象是在某个时候创建​​的,这里没有魔法。
【解决方案2】:

提供一个字符串作为文字最终使它在 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");

一个字符串对象是从字符串字面量池中创建的,即使池中已经存在一个相等的字符串。考虑到所有这些,请避免使用 new 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

【讨论】:

  • ...以及为什么应该始终使用equals() 而不是== 进行字符串比较的原因
猜你喜欢
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
相关资源
最近更新 更多