代码之家  ›  专栏  ›  技术社区  ›  Batakj

赋值和创建字符串实例有什么区别?

  •  8
  • Batakj  · 技术社区  · 16 年前

    在一个面试问题中,面试官问我

    以下陈述的共同点和不同点是什么?

    String s = "Test";
    
    String s = new String("Test");
    

    内存分配有什么不同吗?

    5 回复  |  直到 14 年前
        1
  •  7
  •   codaddict    16 年前
    String s = "Test"; 
    

    将首先在字符串常量池中查找字符串“test”。如果找到s,则将使其引用找到的对象。如果找不到,将创建一个新的字符串对象,将其添加到池中,并使s引用新创建的对象。

    String s = new String("Test");
    

    将首先创建一个新的字符串对象,并使S引用它。此外,在字符串常量池中为字符串“test”创建一个条目, 如果 它还没有在那里。

    所以假设字符串“test”不在池中,第一个声明将创建一个对象,而第二个声明将创建两个对象。

        2
  •  5
  •   dragon66    14 年前

    在记忆方面的不同在于形式的表达: string s=“test” 使用“interned”string so as to share unique instances.

    表单调用: string s=“test”
    string s=new string(“test”)相比是否有效

    第一个调用使用现有的常量表达式(如果有)。 第二个调用在不使用任何现有实例的情况下创建一个新实例。

    下面的代码块演示了这一点:
    <代码> >/P>

    string test=new string(“test”);
    string internettest=“测试”;
    string noninterntest=新字符串(“test”);
    
    system.out.println(test==internetest);//打印错误
    system.out.println(测试!=noninterntest);//打印为真
    system.out.println(test.equals(noninterntest));//打印为真
    < /代码> 
    
    

    还注意到, JLS 指定了这样的行为:
    每个字符串文字都是对类字符串实例的引用(_§4.3.3)。字符串对象具有常量值。字符串文本,或者更一般地说,常量表达式的值字符串是“interned”的,以便共享唯一的实例,使用方法string.intern.

    从记忆的角度来看,蕨类的表现形式是: String s = "test"使用“interned”字符串共享唯一实例。

    形式的调用:string s=“测试”
    比…有效String s = new String("test")

    第一个调用使用现有的常量表达式(如果有)。 第二个调用在不使用任何现有实例的情况下创建新实例。

    下面的代码块演示了这一点:

    String test = new String("test");
    String internTest = "test";
    String nonInternTest = new String("test");
    
    System.out.println(test == internTest); // prints false
    System.out.println(test != nonInternTest); // prints true
    System.out.println(test.equals(nonInternTest)); // prints true
    

    还要注意,JLS指定这样的行为:
    每个字符串文字都是对类字符串实例的引用(_§4.3.3)。字符串对象具有常量值。字符串文本或者更一般地说,常量表达式的值字符串是“内部的”,以便使用string.intern方法共享唯一的实例。

        3
  •  1
  •   sap    16 年前

    string s=“test”;//创建一个字符串对象和一个引用变量 在这个简单的例子中,“测试”将进入池中,S将引用它。

    string s=new string(“test”);//创建两个对象和一个引用变量 在这种情况下,因为我们使用了new关键字,Java将创建一个新的字符串对象 在正常(非池)内存中,S将引用它。此外,文本“test”将 放在游泳池里。

    但它们的共同点是,它们都创建了一个新的字符串对象, “test”的值,并将其赋给参考变量s。

        4
  •  0
  •   GuruKulki    16 年前

    首先,将在字符串池中搜索字符串文字“test”,如果它存在,则S将引用它,不会创建新的字符串池。并且仅当“test”文本不存在时才创建新对象。

    但在第二种情况下,它将创建另一个对象,而不必担心它是否存在。

        5
  •  0
  •   anand    16 年前

    +创建一个新的字符串对象和创建引用之间的区别并不是什么,但我们告诉JVM创建一个新的对象。 创造参照意味着我们只创造我们自己的对象。