字符串对象实例化

时间:2013-05-24 20:04:54

标签: java

String s ="hello";
String s= new String ("hello");
String s1= new String("hello");

如何在案例上方内部创建字符串对象。

String s = null;
String s = new String (null);  // I get a compilation error at this line

我没有在上述情况下获得对象实例化。 Java doc说它创建了一个新的obj /用原始参数创建一个新的obj作为字符串。

但我还不清楚

6 个答案:

答案 0 :(得分:3)

Java使用Flyweight设计模式来管理JVM中的String实例。简而言之,这种模式归结为共享可能存储太多实例的对象。

String s ="hello";

这里,如果“hello”已经存在,JVM首先检查字符串池。如果是,s开始直接指向它。否则,首先将“hello”添加到池中,然后s指向它。

String s= new String ("hello");

这里,文字字符串“hello”已经存在于String池中,但仍然使用new仍然在堆上创建一个具有相同值“hello”的新String对象。

String s1= new String("hello");

与上述相同。我们现在有三个String对象。

String s = null;

在这里,您可以简单地将变量初始化为null。这里没什么特别的。

String s = new String (null);

这不起作用,因为String构造函数已重载。可能需要String;它也可能需要char[]。但是当你传递它时,null编译器不知道要调用哪个构造函数,因为它没有任何数据类型可以匹配,因此它会给你一个模糊错误。

答案 1 :(得分:2)

在字符串池中创建字符串对象,该字符串池在jvm中实现,以在内部创建和存储字符串对象。创建字符串的最佳方法是String s ="hello";

String s= new String ("hello");

创建2个不需要的String对象。

答案 2 :(得分:1)

像“hello”这样的字符串文字是Java中罕见的句法糖。它与调用构造函数不同,但它将为您提供PermGen中字符串池中相等String对象的引用。您的编译器错误是因为String类具有重载的构造函数,并且在传递null时编译器无法分辨您正在调用的那个。

答案 3 :(得分:1)

Java编译器对字符串进行一些优化,以防止具有相同值的多个String对象。它被称为“string interning”。这就是Java中的String不可变的原因。在第一种情况下,您实际执行的操作是将现有String对象的引用分配给新变量。您可以将其视为实例化的任何其他类,并将其分配给另一个变量:

WhateverClass object1 = new WhateverClass();
WhateverClass object2 = object1; // No new instance created, just assigning a reference
boolean areEquals = object1 == object2; // This is true, same reference
String string1 = "foo";
String string2 = "foo";
String string3 = new String("foo");
areEquals = string1 == string2; // true, same reference
areEquals = string1 == string3; // false, different objects

然而,使用“new”你正在强制创建一个新实例(更多的内存,更慢......),所以你应该尽可能地避免这种情况。 String构造函数中null参数的编译错误是a completely different story

答案 4 :(得分:0)

String和其他扩展Number的类(如Integer)使用池来存储某些对象,因此当您要求它们时,已经创建了它们。在String类中,所有文字字符串和字符串值常量表达式都被实现,这是调用String interning。因此,当您使用“”创建一个字符串时,所有这些字符串都被实现(如果它们不存在则被创建,如果存在则被创建)。类似于flyweight pattern

 String s = new String(null) // doesnt compile cause it's ambiguous
 String s = new String((String)null) // u can try this, but u will have a RuntimeException(NullPointerException) if u use this variable for something

所以如果你想测试

String s = new String("hello");  // "hello" is interned cause it's a literal and with the new clause u waste memory, cause u create max 2 times, one in the heap  and the other in permgen"
String s2 = "hello";
String s3 = "hello";
   System.out.println(s==s2); // false
   System.out.println(s2 == s3); // true
   System.out.println(s.equals(s2));//true

答案 5 :(得分:-1)

在Java中,对象通过其引用进行实例化。 如果创建一个字符串“Hello”,则会在堆栈中创建一个String的引用(指针)。 因此,如果你写:String s = null,引用将被实例化,但没有任何指向String的指针。如果你编写新的String(null),它将不得不创建一个指向空内存区域的指针,这就是你得到编译错误的原因。 希望能帮助,Simo