任何人都可以告诉我创建了多少个对象。 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
}
}
答案 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中的值(存在的内容)匹配两个字符串,并且==检查两个对象是否指向相同的引用。
检查下面的链接,你会得到答案,
答案 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”检查两个对象的内容是否相同。