Javaでの文字列の詳細な説明

Java文字列の詳細な
文字列:文字列定数プール

インタビューの質問(ステーションbのビデオを見てください)

1. Stringでvolatileを使用できませんか?

2.なぜこれらの2つの方法があるのですか?保管場所が異なるため

3. Stringの最下層は、char型の配列です。

1.ストリングの3つの特徴

1.1。不変性

1.1.1。文字列は不変モードのオブジェクトです。不変モードの主な機能は、オブジェクトを複数のスレッドで共有して頻繁にアクセスする必要がある場合に、データの整合性を確保することです。

1.2、一定のプールの最適化

1.2.1。Stringオブジェクトが作成された後、それは文字列定数プールにキャッシュされ、同じオブジェクトが次に作成されるときに、キャッシュされた参照が直接返されます。

1.3、最終

1.3.1。Stringクラスを継承できないため、システムのセキュリティが向上します。

2. String()をインスタンス化する方法は3つあります。

2.1、直接割り当て

2.2。コンストラクターを介して、文字列の値を直接渡すことも、char配列をに渡すこともできます。

2.3。コンストラクターを介して、char型の配列を直接渡すことができます。

2つの違い(ストレージ領域):直接割り当ては文字列定数プールに格納され、インスタンスを構築することにより、ヒープに格納されます。

3.面接テストサイトの概要

3.1、文字列は基本的なデータ型ではありません

Stringの最下層は、実際にはchar型の配列です。

3.2、文字列のインスタンス化

3.3、メソッドに等しい

public boolean equals(Object anObject) {
    
        
if (this == anObject) {
    
           
    return true;   
 }   
 if (anObject instanceof String) {
    
          
   String aString = (String)anObject;      
     if (coder() == aString.coder()) {
    
             
        return isLatin1() ? StringLatin1.equals(value, aString.value) : 			           					  
                            StringUTF16.equals(value, aString.value);       
    }    }   
     return false; 
     }

3.3.1.Objectのequalsメソッドは "=="と同じです。

3.3.2。文字列はオブジェクトのequalメソッドを書き換えます。比較はアドレス値ではなく、その値()です。

3.4、文字列は不変です

3.4.1。Stringの値が変更されている限り、それは新しいオブジェクトになります

3.5、intern()メソッド

3.5.1。Stringオブジェクトがintern()メソッドを呼び出すと、文字列定数プールに移動して値が検索されます。値が存在する場合は、値への参照が返されます。存在しない場合は、新しい1つは文字列定数プールのアドレス値に作成され、戻ります。

4つの一般的に使用される方法

ここに画像の説明を挿入

4.1、ストリングカット

4.1.1、split()メソッドは正規表現をサポートします

5、古典的な質問にインタビューする

5.1 ==とequalsの違いは何ですか?

5.1.1。 "=="はデータ型分類から比較され、基本データ型が比較される場合は比較値です。参照データ型が比較される場合はメモリ内のアドレス値です。

5.1.2、equalsはObjectによって提供されるメソッドであり、 "=="は同じですが、Stringはそれを書き換え、メモリ内のアドレス値ではなく、その値を比較します。

5.2。次のコードを実行した結果は次のとおりです。

String str1 = "Hello World"; 
String str2 = "Hello"; 
str2 += " World"; 
System.out.println(str1 == str2);

コマンドjavap-c xx.classを使用して、実行順序を確認できます。プロセスには、新しいStringBuilder();メソッドappendがあるため、str2がヒープに表示され、結果はfalseになります。

ここに画像の説明を挿入

5.3。次のコードを実行した結果は次のとおりです。

        String str1 = "Hello World";
        final String str2 = " World";
        String str3 = "Hello" + str2;
        System.out.println(str1 == str3);

結果がtrueの場合、最終的な変更は明示的な値に直接コンパイルされ、最終的な変更は明示的な値にコンパイルされません。
参照:Javaでの最終的に変更された文字列変数と変更されていない文字列変数の違い

5.4。次のコードを実行した結果は次のとおりです。

String str1 = "Hello World"; 
final String str2 = new String(" World"); 
String str3 = "Hello"+str2; 
System.out.println(str1 == str3);

結果がfalseの場合、finalによって変更されますが、最初はヒープメモリに作成されたため、finalによって変更されたかどうかに関係なく、常にヒープメモリにあります。

ここに画像の説明を挿入

5.5。次のコードを実行した結果は次のとおりです。

        String str1 = "Hello World";
        String str2 = "Hello";
        String str3 = " World";
        String str4 = str2 + str3;
        System.out.println(str4 == str1);
        System.out.println(str4.intern() == str1);

結果は次のとおりです。false、true。Stringのintern();メソッドは最初に文字列定数プールを検索するため、参照がある場合は参照を返し、ない場合は定数プールに作成します。

5.6、文字列定数プールの役割

複数の同一の値が1つのアドレス値を共有できます。メモリ消費を減らすことができます。

5.7。文字列スレッドは安全ですか?

はい、値は不変です。値が変更される限り、それは新しいアドレス値です。

5.8。HashMapを使用するときに文字列をキーとして使用する利点は何ですか?

HashMapはキーのハッシュコードに従って値を見つけるため、文字列は作成時にキャッシュされます。したがって、HashMapでは、ハッシュコードを計算する必要はなく、キャッシュ内にあり、効率は他のオブジェクトよりも高くなります。

おすすめ

転載: blog.csdn.net/weixin_43983411/article/details/108569701