1

我已经编写了代码,但请告诉intern()String 类的方法的功能,它是否试图将池对象地址和内存地址放在同一页面上?

我开发了以下代码:

    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()方法的作用。

提前致谢。

4

5 回答 5

1

由于operator==检查身份而不是相等性System.out.println(s1 == s3);(已被注释掉)true仅当s1s3完全相同的 objects时才会产生。

该方法intern()确保发生这种情况,因为两个字符串 -s1并且彼此s3 相等intern(),通过分配它们的值,您可以确保它们实际上是相同的对象,而不是两个不同但相等的对象。

正如javadocs所说:

由此可见,对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为真时,s.intern() == t.intern() 才为真。

ps 你不调用intern()on s1,因为它是一个字符串文字- 因此已经是规范的。

但是,它对 没有影响s1 == s2,因为它们都是字符串文字,并且intern()都不会在它们上调用。

于 2012-05-01T07:36:07.810 回答
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()则为真。

于 2012-05-01T08:04:48.917 回答
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 将返回对存在于字符串池中的该对象的引用。

如果字符串池中不存在与当前对象相等的对象,则 JVM 将此字符串添加到字符串池中,并将其对调用对象的引用返回。

JVM将该对象添加到String池中,这样下次任何字符串对象调用intern方法时,如果这两个字符串的值相等,就可以进行空间优化。

您可以使用 equals 和 == 运算符检查实习生方法的工作情况。

参考:http: //java-antony.blogspot.in/2007/07/string-and-its-intern-method.html

于 2012-05-01T07:36:11.367 回答
0

来自String.intern() Javadoc

一个字符串池,最初是空的,由 String 类私下维护。

当调用 intern 方法时,如果池中已经包含一个等于该 String 对象的字符串,由 equals(Object) 方法确定,则返回池中的字符串。否则,将此 String 对象添加到池中并返回对该 String 对象的引用。

由此可见,对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为真时,s.intern() == t.intern() 才为真。

所有文字字符串和字符串值的常量表达式都是实习的。字符串文字在 Java™ 语言规范的第 3.10.5 节中定义。

返回: 与此字符串具有相同内容的字符串,但保证来自唯一字符串池。

您是否有 Javadoc 未涵盖的更具体的疑问?

于 2012-05-01T07:37:27.927 回答
0

.intern() 确保仅存储唯一 String 的一份副本。因此,对同一实习字符串的多次引用将导致相同的 hashCode(),因为散列应用于同一字符串。

于 2012-05-01T07:38:13.567 回答