インタビューに基づいて、インタビュアーは常に、なぜ文字列をお願いしたいですか?

面接の基本ですが、それを明確にすることができない子供の靴がたくさんあるJavaのString、について、この資料では、文字列を混乱させることシンプルかつ徹底的に説明します

Javaでは、私たちは、文字列を作成する2つの方法があります

String x = "abc";
String y = new String("abc");

一般的な、多くの場合、2番目のはまれで、最初の書き込みが、インタビューでも、常に最後に作成するためのコンストラクタを、このような質問をして、二重引用符文字列の二つの形式が違いは何がありますか?

例を参照してください。

例1

String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True

a == b点AとBため、結果は、真である方式エリア(方法エリア)メモリ参照が同じで、文字列リテラルと

ときに繰り返し、各異なる文字列値の同じ文字列リテラル、店舗のみのコピーを作成します。これは、呼び出された文字列の存在/保持、Javaは、すべての文字列定数は自動的に存在しているコンパイル

例2

String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True

c==dそれはへの参照として虚偽、CとDに評価スタック異なるオブジェクトを、不同的对象肯定有不同的内存引用

2つの例を引用し、テキスト記述は愚かなビット?私たちは、グラフィカルに上記の2例を理解しようとすると:

おそらく、あなたが持っている、1つを見て方法区、1はであり、JVMのモデルを、これらのチャートを見て、多分あなたは、多くの場合、インタビューの中で、それについて尋ねている2つの異なる領域は、以下のとおりです。

後であなたがよく区別さになるように、ここでもリマインダは、すべての新しいオブジェクトは、ヒープになります

実行文字列のプレゼンス

上記のコンパイル時に文字列の存在である、あなたはそれを実行することができます言いましたか?答えはイエス、私たちがお手伝いする機能を必要としています

String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println(c == d);  // Now true
System.out.println(c.equals(d)); // True

参照c == d領域に拘留の方法を作成するために、同じ文字列のように、インターン()メソッドを呼び出すことにより、役割の(英語が拘留、自宅軟禁を意味している)あなたがインターンを理解する必要があり、TRUEと評価を

インタビューの中であなたも次のコードは、複数のオブジェクトを作成し、あなたを求めることがあります。

String d = new String("abcd")
  1. メソッド領域は、すでに「ABCD」を存在する場合、唯一の新しいStringのオブジェクトを作成します
  2. メソッド領域が「ABCD」でない場合、ヒープに、地域に二つのオブジェクト、メソッドを作成します

だから、通常、次の我々は、これは余分な無用のオブジェクトを持っている可能性があるとして、コンストラクタを使用してオブジェクトを作成する必要はありませんが、例外がああありますが、私たちは次のように言いました

String s = "abcd";
s = s.concat("ef");

私たちは時に文字列sモザイク「EF」バック考えるとき、原因Stringオブジェクトの作成に、作成した新しいオブジェクトsのヒープ内の新しいオブジェクトを作成し、基準点になる不変なので、Stringクラスすべてのメソッドは、(高速動作列の各方法は、最終的には新しい文字列の単語を返すが返却されているかどうかを確認するために、あなたのIDEを開く)自体を変更するが、新しい文字列を返しません、ここであなたも理解しておく必要があり真実:

我々は変更される文字列が必要な場合は、私たちはより良い新しいオブジェクトを作成し、古いオブジェクトがそれに基準点を持っていないので、我々は、ガベージコレクションの多くを無駄よ起因する各文字列の操作に、そうでない場合は、StringBufferのかのStringBuilderを使用していました時間

文字列が設定され、なぜあなたは最終的に製造/疑問に思っている、ここで終わりではありませんか?

なぜ、Stringクラスは、最終的な変更であります

我々はいくつかの押し下げや相互拘束が思考を考える必要があります質問に目を向けます

文字列プールのニーズ

文字列プール(文字列インターンプール)記憶領域が特殊領域法です。あなたは、文字列を作成すると、文字列がすでにプール内に存在する場合は、その後、むしろ新しいオブジェクトを作成するよりも、文字列に既存の参照に戻ります。文字列が変数であれば、その後、間違った値を取得元の値に基準点になります参照の値を変更

キャッシュのハッシュコード

ハッシュコードの文字列は、多くの場合、Javaで使用されています。たとえば、HashSetのかHashMapのインチ 不変あなたは変化を恐れず、それを現金ことができるように、ハッシュコードは常に同じであることを確認してください。これは、それがハッシュコードを使用して計算されるたびに必要とされていないことを意味します。これは、より効率的です。だから、Stringクラスに次のメンバ変数の定義が表示されます。

/** Cache the hash code for the string */
private int hash; // Default to 0

セキュリティ

文字列は広く、そのようなネットワーク接続、開いているファイルなどのJavaクラスの多くのパラメータとして使用されています。文字列は不変でない場合は、接続やファイルは、深刻なセキュリティ上の脅威につながる可能性があり、変更されます。それがマシンに接続されている方法が、それはしていません。パラメータは文字列であるので、変数の文字列も、反射におけるセキュリティ上の問題につながる可能性

不変オブジェクトは本質的にスレッドセーフです

不変オブジェクトを変更することはできませんので、ので、彼らは自由に複数のスレッド間で共有することができます。これは、同期する必要がなくなります。

要するに、効率および安全性の理由のために、文字列は不変であるように設計されています。、一般的には、不変クラスは選択の原因があるのはこのためです。

追加情報

不変オブジェクトと不変の参照について、常にいくつかの学生混乱しています

final User user = new User();

上記のコードは別のアドレスのメモリを指すように変更することができないユーザ基準を指すが、ユーザーが変数のオブジェクトであるため、我々は、そのプロパティを変更するユーザのセッターメソッドを呼び出すことができ

多くの知識は、インタビュアーが尋ねなぜ私は文字列を好きな理由は主、あなたの基本的なスキルに、あるJVMモデルのご理解、を含む、Stringクラスに含ま

ソウルの質問

  1. そのような整数やロングなどの文字列とプリミティブラッパークラスが最終的に変更されますが、引数同期シンクブロックは、それを適用すると、なぜ推奨されていませんか?
  2. あなたは何が起こったか知っている自動包装の基本的なタイプ?および関連問題について

生産性ツールを改善

材質テーマUI

これは、インストール後に、テーマIDEAプラグインで、選択しMaterial Palenightたテーマを、次の設定をしながら

設定した後、あなたのアイデアは、極端な快適さを引き起こすこの、あります


推奨読書


継続的な社会的関心番号へようこそ:「アーチ日の兵士」

  • ドライ最先端のJavaテクノロジーの共有
  • 生産性ツールの概要|返信「ツール」
  • 面接の質問と回答の分析
  • テクニカルデータ収集|返信する「情報」

複雑な問題、問題プログレッシブ技術的な問題の原則の具体的な抽象的でグラフィカルな分解の簡素化に合わせて、楽しい学習のJavaテクノロジー・スタック関連の知識を考え探偵小説を読みやすい、技術を更新し続け、ご期待ください......

おすすめ

転載: www.cnblogs.com/FraserYu/p/11462859.html