我已经编写了代码,但是请告诉String类的intern()
方法的功能,它是否尝试将池对象地址和内存地址放在同一页面上?
我开发了以下代码:
public class MyClass
{
static String s1 = "I am unique!";
public static void main(String args[])
{
String s2 = "I am unique!";
String s3 = new String(s1).intern();// if intern method
is removed then there will be difference
// String s3= new String("I am unique!").intern();
System.out.println("s1 hashcode -->"+s1.hashCode());
System.out.println("s3 hashcode -->"+s3.hashCode());
System.out.println("s2 hashcode -->"+s2.hashCode());
System.out.println(s1 == s2);
System.out.println("s1.equals(s2) -->"+s1.equals(s2));
/* System.out.println("s1.equals(s3) -->"+s1.equals(s3));
System.out.println(s1 == s3);
System.out.println(s3 == s1);
System.out.println("s3-->"+s3.hashCode());*/
// System.out.println(s3.equals(s1));
}
}
现在上述intern()
方法的作用是什么?
由于hashCodes()
是相同的,请解释intern()
方法的作用。
提前致谢。
答案 0 :(得分:1)
由于operator==
检查身份而不是相等,System.out.println(s1 == s3);
(已注释掉)仅在true
和s1
为s3
时才会生成intern()
完全相同的对象。
方法s1
确保发生这种情况,因为两个字符串 - s3
和intern()
相等,通过分配intern()
值,你确保它们实际上是相同的对象,而不是两个不同但对等的对象。
正如javadocs所说:
对于任何两个字符串s和t,s.intern()== t.intern() 当且仅当s.equals(t)为真时才为真。
P.S。你没有在s1
上调用s1 == s2
,因为它是String literal - 因此已经是规范的。
但是,它对intern()
没有影响,因为它们都是字符串文字,并且都没有调用{{1}}。
答案 1 :(得分:0)
此方法返回字符串对象的规范表示。因此,对于任何两个字符串s和t,当且仅当s.equals(t)为真时,s.intern()== t.intern()才为真。
返回字符串对象的规范表示。
参考http://www.tutorialspoint.com/java/java_string_intern.htm
如果调用此String对象的intern方法,
str = str.intern();
JVM将检查JVM维护的String池是否包含任何与str对象具有相同值的String对象,并且equals方法返回true。
如果JVM找到这样的对象,那么JVM将返回对String池中存在的该对象的引用。
如果字符串池中没有与当前对象相同的对象,则JVM会将此字符串添加到String池中,并返回对调用对象的引用。
JVM将对象添加到String池,以便下次当任何字符串对象调用intern方法时,如果这两个字符串的值相等,则可以进行空间优化。
您可以使用equals和==运算符检查实习方法的工作情况。
参考:http://java-antony.blogspot.in/2007/07/string-and-its-intern-method.html
答案 2 :(得分:0)
来自String.intern() Javadoc
字符串池(最初为空)由String类私有维护。
当调用intern方法时,如果池已经包含一个等于此String对象的字符串(由equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。
接下来,对于任何两个字符串s和t,当且仅当s.equals(t)为真时,s.intern()== t.intern()才为真。
所有文字字符串和字符串值常量表达式都是实体。字符串文字在The Java™Language Specification。的第3.10.5节中定义。
返回: 与此字符串具有相同内容的字符串,但保证来自唯一字符串池。
您是否有更具体的疑问,而Javadoc未涵盖这些疑问?
答案 3 :(得分:0)
.intern()确保只存储唯一String的一个副本。因此,对同一个interned String的多次引用将导致相同的hashCode(),因为哈希被应用于同一个String。
答案 4 :(得分:0)
String.intern()
规范化内部VM字符串池中的字符串。它确保每个不同的字符序列只有一个唯一的String对象。然后可以通过身份(使用运算符==
)来比较这些字符串,而不是相等(equals()
)。
例如:
public class Intern{
public static void main(String[]args){
System.out.println(args[0].equals("")); //True if no arguments
System.out.println(args[0] == ""); //false since there are not identical object
System.out.println(args[0].intern() == ""); //True (if there are not multiple string tables - possible in older jdk)
}
}
因此,如果两个字符串相等(s1.equals(s2)
为真),则s1.intern() == s2.intern()
为真。