创建了多少个对象,包括String对象

时间:2013-06-20 06:00:55

标签: java

任何人都可以告诉我创建了多少个对象。 s3不是从字符串池中引用相同的hello吗?那里有多少个String对象

/**
 * 
 */
 package agnitio;

/**
 * @author admin
 *
 */
public class TestString {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    String s1="hello";
    String s2="hello";
    String s3 = new String("hello");
    System.out.println(s1==s2); // true
    System.out.println(s1==s3); // false
    System.out.println(s2==s3); // false

}

}

4 个答案:

答案 0 :(得分:5)

仅创建了两个对象。当你这样做时,第一个对象

String s1="hello";

执行以下操作时,内存中没有创建对象:

String s2="hello";

这是因为JVM String类基于flyweight模式,因此如果字符串已经存在于内存中,就像您的情况“hello”一样,那么创建新引用将不会创建新对象。 s1和s2都指向相同的内存位置。

执行以下操作时会创建

第二个对象

String s3 = new String("hello");

由于新操作员将始终创建新对象。

==比较两个引用是否指向相同的内存位置。而equals则比较字符串的内容。话虽如此,正如我所提到的,s1和s2都指向相同的内存位置,因此==和equals将返回TRUE进行比较。但是s3是一个不同的对象,因此s1和s2与==操作的比较将返回false。但如果你做的比较s1,s2和s3,你就会得到TRUE。

答案 1 :(得分:1)

.equals()方法根据该String中的值(存在的内容)匹配两个字符串,并且==检查两个对象是否指向相同的引用。

检查下面的链接,你会得到答案,

  

difference between == and equals method

答案 2 :(得分:1)

不,想象一下StringPool工具没有使字符串不可变,它根本不可能,因为在字符串池的情况下,一个字符串对象/文字,例如“hello”已引用许多引用变量,因此如果其中任何一个更改了值,则其他参数将自动受到影响,即可以说

String A = "hello"
String B = "hello" 

现在字符串B调用"hello".toUpperCase(),它将同一个对象更改为“TEST”,因此A也将是“TEST”,这是不可取的。

=====编辑=====

如果我们在谈论有多少字符串对象:

String s = "hello";    // one string object in the string pool "hello"
String s2 = "hello";   // two object variables (s, s2)

在这个简单的例子中,“abc”将进入池中,s和s2将引用它。

String s3 = new String("hello"); // creates two objects, and one reference variable.

在这种情况下,因为我们使用了new关键字,Java将创建一个新的String对象 在普通(非池)内存中,s将引用它。另外字面意思是“你好” 也将被放置在池中(如果它不存在)。

答案 3 :(得分:0)

使用String.contentEquals:

"stringA".contentEquals("StringB");

字符串是对象,每当你创建一个'新字符串'时,它实际上创建了一个'new String(value)',它指向内存中的一个位置。例如,“float”是一个原语/值,而Float是一个带有指向内存中某个位置的指针的对象。当你使用'=='时,它只是检查指针是否相同。 “String.contentEquals”检查两个对象的内容是否相同。