0

谁能告诉我创建了多少对象。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

4 回答 4

5

只创建了两个对象。这样做时的第一个对象

String s1="hello";

当您这样做时,不会在内存中创建任何对象:

String s2="hello";

这是因为 JVM String 类是基于享元模式的,所以如果一个字符串已经存在于内存中,比如你的情况“hello”,那么创建一个新的引用将不会创建一个新的对象。s1 和 s2 都将指向同一个内存位置。

当您执行以下操作时会创建第二个对象:

String s3 = new String("hello");

作为 new 运算符将始终创建一个新对象。

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

于 2013-06-20T06:01:56.997 回答
1

不,想象一下不使字符串不可变的 StringPool 设施,这根本不可能,因为在字符串池的情况下,一个字符串对象/文字例如“hello”已被许多引用变量引用,因此如果其中任何一个更改了值,其他人将自动受到影响,也就是说

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

现在调用 String 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 将引用它。此外,文字“hello”也将被放置在池中(如果它不存在)。

于 2013-06-20T06:04:47.293 回答
0

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

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

== 和 equals 方法的区别

于 2013-06-20T06:03:59.900 回答
0

使用 String.contentEquals:

"stringA".contentEquals("StringB");

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

于 2013-06-20T06:05:52.627 回答