2021春の募集に必要なJava面接問題大全(四)Java-string文字列部分の継続的な更新


  • 文字型定数と文字列定数の違い
  • 形式:文字定数は、単一引用符による文字列定数です.二重引用符による文字
  • です.
  • は、文字定数が1つの整形値(ASCII値)に相当することを意味し、式演算に参加できる文字列定数はアドレス値(メモリに格納された位置)
  • を表す.
  • メモリサイズ文字定数が1バイトのみを占める文字列定数が数バイト(少なくとも1文字の終了フラグ)
  • を占める.
    文字列はjdk 8の前に最下位でcharの配列を使用し、jdk 8の後にbyteの配列を使用します.
  • 文字列定数プールとは?

  • 文字列定数プールはスタックメモリにあり、文字列定数を格納するために使用され、メモリの使用率を高めることができ、同じ文字列を格納する複数の空間を開くことを避けることができ、文字列を作成する際にJVMはまず文字列定数プールをチェックし、その文字列がすでにプールに存在する場合、その参照を返し、存在しない場合、1つの文字列をプールにインスタンス化します.参照を返します.
  • Stringの特徴
  • 不変性:String文字列は読み取り専用文字列であり、実際には新しいオブジェクトを作成し、参照をオブジェクトに向けます.不変モードの主な役割は、1つのオブジェクトがマルチスレッドで共有され、頻繁にアクセスする必要がある場合に、データの一貫性を保証することです.
  • Stringはなぜ可変ではないのですか?

  • 簡単に言えばStringクラスがfinal修飾を利用したcharタイプ配列格納文字
    /** The value is used for character storage. */
    private final char value[];
    

    Stringの内容は変わらないが、strが元の「Hello」を指すメモリアドレスから「Hello World」を指すメモリアドレスに変わっただけで、つまり「Hello World」文字列にメモリ領域を1つ多く開いた.
    反射は不変性を破壊することもできます
  • String s = new String(“xyz”);いくつかの文字列オブジェクト
  • が作成されました
    静的領域の「xyz」とnewでスタックに作成されたオブジェクトの2つのオブジェクト.
  • Stringクラスの一般的な方法はどれらがありますか?
  • charAt(i)は、I-1番目の下付き要素
  • を返す.
  • subString(a,b)は、a番目の位置からb個の要素
  • を返す.
  • indexOf(); インデックスを作成する文字
  • を返します.
  • replace()文字列置換
  • trim()です.文字列の両側の空白部分
  • を取り除きます.
  • split()は、1つの文字列をある記号に従って1つの配列
  • に分割する.
  • getBytes()は、文字列のbyte配列
  • を返します.
  • toLowerCase()です.小文字
  • toUpperCase()大文字
  • length()取得長
  • HashMapを使うとき、Stringでkeyを作るメリットは何ですか?

  • HashMap内部インプリメンテーションは、keyのhashcodeによってvalueの格納場所を決定します.文字列は可変であるため、文字列を作成するとhashcodeがキャッシュされ、再計算する必要がないため、他のオブジェクトよりも高速です.
  • StringとStringBuffer、StringBuilderの違いは何ですか?Stringはなぜ可変ではないのか
  • 可変性:Stringクラスでは文字配列を使用して文字列を保存し、private final char value[]なのでstringオブジェクトは可変ではありません.StringBuilderとStringBufferはAbstractStringBuilderクラスから継承され、AbstractStringBuilderでも文字配列を使用して文字列を保存します.char[]valueでは、両方のオブジェクトが可変です.
  • スレッドセキュリティ:Stringのオブジェクトは可変ではなく、定数、スレッドセキュリティと理解できます.AbstractStringBuilderはStringBuilderとStringBufferの共通の親であり、expandCapacity、append、insert、indexOfなどの共通のメソッドなどの文字列の基本的な操作を定義しています.StringBufferはメソッドに同期ロックを追加したり、呼び出しのメソッドに同期ロックを追加したりするので、スレッドは安全です.StringBuilderはメソッドに同期ロックをかけていないので、スレッド以外は安全です.
  • パフォーマンス:Stringタイプが変更されるたびに、新しいStringオブジェクトが生成され、新しいStringオブジェクトにポインタが向けられます.StringBufferは、新しいオブジェクトを生成してオブジェクト参照を変更するのではなく、StringBufferオブジェクト自体を毎回操作します.同じ場合、StirngBuilderを使用するとStringBufferを使用するよりも10%~15%程度のパフォーマンス向上しか得られませんが、マルチスレッドが安全ではないリスクを冒す必要があります.
  • まとめ:少量のデータを操作する場合=Stringシングルスレッド操作文字列バッファで大量のデータを操作=StringBuilderマルチスレッド操作文字列バッファで大量のデータを操作=StringBuffer
  • Integer a=127とInteger b=127は等しいですか
  • public static void main(String[] args) {
          Integer a = new Integer(3);
    	Integer b = 3; //  3     Integer   int c = 3;
    	System.out.println(a == b); // false              System.out.println(a == c); // true a     int    c   System.out.println(b == c); // true
    	Integer a1 = 128;
    	Integer b1 = 128; System.out.println(a1 == b1); // false
    	Integer a2 = 127;
    	Integer b2 = 127; System.out.println(a2 == b2); // true
    }
    

    整数字面量の値が-128から127の間であれば、自動梱包時にnewの新しいIntegerオブジェクトではなく、定数プール内のIntegerオブジェクトを直接参照し、範囲a 1=b 1を超える結果はfalseである.
  • jdk 165以降のStringBufferおよびロックのいくつかの最適化
  • ロック粗化lock eliminate
  • ロック消去挿入データの1サイクルにおいてずっとデータを挿入すると、StringBufferは重複加入を回避するロック消去機構があり、効率
  • に影響を与える.