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

このメソッドintern()は、2 つの文字列がs1互いにs3 等しいため、それらの値を割り当てることで、intern()それらが実際には同じオブジェクトであり、2 つの異なるオブジェクトであるが等しいオブジェクトではないことを確認します。

javadocsが言うように:

したがって、任意の 2 つの文字列 s および t について、s.intern() == t.intern() は、s.equals(t) が true である場合にのみ true になります。

ps は文字列リテラルであるため、intern()onを呼び出しません。したがって、すでに正規化されています。s1

ただし、s1 == s2どちらも文字列リテラルであり、intern()どちらでも呼び出されないため、 には影響しません。

于 2012-05-01T07:36:07.810 に答える
0

String.intern() Javadocから

最初は空の文字列のプールは、Stringクラスによってプライベートに維持されます。

インターンメソッドが呼び出されたときに、equals(Object)メソッドによって決定されたこのStringオブジェクトに等しい文字列がプールにすでに含まれている場合、プールからの文字列が返されます。それ以外の場合、このStringオブジェクトはプールに追加され、このStringオブジェクトへの参照が返されます。

したがって、任意の2つの文字列sおよびtについて、s.equals(t)が真である場合に限り、s.intern()== t.intern()が真になります。

すべてのリテラル文字列と文字列値の定数式がインターンされます。文字列リテラルは、Java™言語仕様のセクション3.10.5で定義されています。

戻り値:この文字列と同じ内容の文字列ですが、一意の文字列のプールからのものであることが保証されています。

Javadocでカバーされていないより具体的な疑問がありますか?

于 2012-05-01T07:37:27.927 に答える
0

.intern()は、一意の文字列のコピーが1つだけ保存されるようにします。したがって、同じインターンされた文字列への複数の参照は、ハッシュが同じ文字列に適用されているのと同じhashCode()になります。

于 2012-05-01T07:38:13.567 に答える
0

このメソッドは、文字列オブジェクトの正規表現を返します。したがって、任意の 2 つの文字列 s および t について、s.intern() == t.intern() は、s.equals(t) が true である場合にのみ true になります。

文字列オブジェクトの正規表現を返します。

http://www.tutorialspoint.com/java/java_string_intern.htmを参照してください。

この String オブジェクトの intern メソッドを呼び出すと、

str = str.intern();

JVM は、JVM によって維持される String プールに、true を返す equals メソッドを持つ str オブジェクトと同じ値を持つ String オブジェクトが含まれているかどうかをチェックします。

JVM がそのようなオブジェクトを見つけた場合、JVM は String プールに存在するそのオブジェクトへの参照を返します。

現在のオブジェクトと等しいオブジェクトが文字列プールに存在しない場合、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()内部 VM 文字列プール内の文字列を正規化します。異なる文字シーケンスごとに一意の String オブジェクトが 1 つだけ存在するようにします。次に、これらの文字列は、等式 ( ) ではなく、同一性( operator を使用) で比較できます。==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)
    }
}

したがって、2 つの文字列が等しい (s1.equals(s2)が true) 場合、s1.intern() == s2.intern()は true です。

于 2012-05-01T08:04:48.917 に答える