关于intern()方法的作用

时间:2012-05-01 07:32:25

标签: java

我已经编写了代码,但是请告诉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()方法的作用。

提前致谢。

5 个答案:

答案 0 :(得分:1)

由于operator==检查身份而不是相等,System.out.println(s1 == s3);(已注释掉)仅在trues1s3时才会生成intern() 完全相同的对象

方法s1确保发生这种情况,因为两个字符串 - s3intern() 相等,通过分配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()为真。