深さでソースレベルのJava面接の質問

非常にお勧めの記事:ようこそお気に入り のAndroidドライシェア

5分、毎日10時、あなたと生涯学習を読んで、ここでのAndroidのプログラマです

1、どのような状況下で、オブジェクトがガベージコレクションに処分されるのですか?

到達可能性解析アルゴリズムを使用して、仮想マシンがオブジェクトの数として定義されてGC Rootsから、GC Rootsオブジェクトができない場合は、スタートは参照のチェーンに沿って見下ろしているGC Roots仮想マシンは、オブジェクトが出てリサイクルすることができると考えて見つけます。

GCのルーツとしてそれを見ることができるオブジェクト1.1?
  • 1)ターゲット仮想マシンスタック(ローカル変数テーブル・スタック・フレーム)参照します。
  • 2)メソッドクラス静的プロパティ、一定の基準オブジェクトを参照するオブジェクト領域と、
  • 3)ネイティブメソッドスタックJNI(Native方法)オブジェクト参照。
1.2到達不能オブジェクトは、ごみはそれを収集するのでしょうか?

さえ到達でき、オブジェクトは必ずしもガベージコレクタはオブジェクトが行う必要があるかどうかを決定するために)1を再利用できませんfinalize()方法を、オブジェクトがオーバーライドしなければならないfinalize()方法を、実行されていません。2)必要に応じて実行した場合、オブジェクトは、キューに入れますJVMそれらを回復するために、スレッドを開きます、これは、オブジェクトがクリーン逃げることができる最後のチャンスです。

2、一般的なコーディングについて話?

コード化された意味:

最小単位は、コンピュータすなわちに格納されたバイトで8bit表されることができる文字の、範囲255、及びシンボルがあまりにも人間表現する、完全に1バイト、シンボルを符号化する固体ニーズ、様々な言語で表現できません言語を理解することができ、コンピュータに翻訳。

1)ASCIIコード:

合計128、下位バイトの7ビット、0〜31車が交換を削除などの制御文字、32~126印刷文字は、キーボードを介して入力して表示することができます。

2)ISO-8859-1

拡張するために使用されるASCIIコード、256文字を、それはほとんどの西ヨーロッパ言語の文字をカバーしています。

3)GB2312

ダブルバイトコード化、符号化範囲が常にA1-A7,A1-A9あってシンボル領域682の文字、B0-B7含む中国の文字領域、6763文字が。

4)GBK

拡大するためにGB2312、複数の文字を追加して、符号化範囲を8140~FEFE、ある23940ヤードビットは、表すことができる21003文字。

5)UTF-16

ISO新しい超言語辞書を作成しようとした、世界のすべての言語は辞書から入手できますUnicodeお互いを翻訳し、ためにUTF-16定義Unicode表すために2つのバイトを使用して、コンピュータへのアクセス方法で文字をUnicode変換するフォーマットを。かかわらず、どのような文字の2バイト、すなわち利用可能な16bit、固体のコールUTF-16

6)UTF-8:

UTF-16均一な2バイト文字のアプリケーションが、いくつかの文字が1バイトで表現することができ、記憶スペースが浪費され、UTF-8可変長技術の使用は、各コード領域は、異なる符号語長を有します。文字の異なるタイプの1〜6バイトで構成されてもよいです。

図3は、UTF-8中国語でエンコードされたが、数バイトを占め; int型の数バイトを入力しますか?

utf-8可変長符号化技術、utf-8中国の不確実で占めるバイトをコーディング、おそらく2、3、4、intタイプが占め4バイト。

4、静的および動的プロキシエージェントとの違いは、どのような場面使用するには?

演技は、一般的なデザインパターンです、

目的は次のとおりです。

オブジェクトへのアクセスを制御するプロキシを提供し、他のオブジェクトとの関係の二つのクラスの分離。Proxyクラスとデリゲートクラスが同じインタフェースを実装する必要があり、コールはプロキシメソッドの委譲クラスので、本物です。

違い:
  • 1)帯電防止剤:

プログラマによって作成された、または特定のツールによって生成され、コードは、エージェントクラスは、静的なプロキシであるかを決定するためにコンパイルされます。通常、静的なプロキシクラスの、

  • 2)動的エージェント:

コード中に動的に生成を作成するためにリフレクションを使用して、実行されます。動的プロキシエージェントは、複数のインターフェース・クラスで達成されます。

実装手順:
  • 。の実現InvocationHandler、独自のコールプロセッサを作成するためのインタフェース。
  • 。にB Proxyクラスを提供ClassLoaderし、インターフェイスタイプアレイは動的プロキシプロキシクラスを作成します。
  • 。Cは、動的プロキシクラスのコンストラクタの反射を使用して得られました。
  • 。D動的プロキシクラスオブジェクトは、コンストラクタ動的プロキシクラスを使用して作成されました。
使用シナリオ:

Retrofitインターフェイスダイレクトコールの方法、機構とSpringAOP

5、Java例外システム

JavaではThrowableすべての例外やエラーのスーパークラス、サブクラスは、2つの直接あるError(错误)Exception(异常)

1)エラーが発生し、JVMによってスローされ、プログラムのエラーを処理することはできませんです

などOOM、ThreadDeathなど。これらの例外が発生した場合、JVM一般的には、プログラムを終了することを選択します。

2)例外が異常なプロセス自体のことが可能です

ランタイムに分け異常(RuntimeException)(也叫Checked Eception)と非実行時例外(不检查异常Unchecked Exception)

ランタイム例外

そこNullPointerException\IndexOutOfBoundsException、一般的に論理エラーによって引き起こされるこれらの異常は、可能な限り避けるべきです。

非操作例外があるIOException\SQLException\FileNotFoundExceptionユーザによって明確に定義されたException異常。

6、分析及び派遣のご理解について話しています。

解決

コンパイル時に見られること、実行する前に、この方法を指し、特定のバージョンの動作中に変更されることはありませんがあります。解像度が静的であり、基準シンボルが直接クラスローディング解析相に組み込むことができます。

割り当て

静的オーバーロードをディスパッチ、静的および動的割り当てディスパッチに分けることができ、それは動的割当て被覆です。静的割り当て決意が過負荷場合基礎として、コンパイル時に、コンパイラは、静的な型静的型ではなく、実際の型パラメータのパラメータに応じて、重負荷のバージョンを決定することができることを意味します。動的な割り当ては、実際の型に基づいて適切なメソッドを呼び出すために必要とされます。

7、Aは、メソッドシグネチャに等しいオブジェクトを変更し、メソッド呼び出しに等しい、オブジェクト・インスタンスを格納する時間HashMapを使用しますか?

オブジェクトの呼び出しますequalsのオブジェクト場合、メソッドをequalsメソッドがオーバーライドされていないequals方法、および==ローカル変数のアドレス値が等しいヒープメモリへのスタックポインタで複数のテーブルです。

8、Javaの多型がある実装するためのメカニズムとは何ですか?

多型は、プログラムで定義された特定の参照可変型が参照変数とコンパイル時の不確定性に発行されたメソッド呼び出しが指すことを意味し、それは、動作中に、クラスのインスタンスは、最終的に指し示すことになる基準変数を決定されます。あなたがソースコードを変更できないように、あなたは参照変数は、異なるクラスの多様性を達成するためにバインドされていることを確認することができます。

Java実装の多型は3つの必要な条件を持っています

参照のみが親クラスのメソッドは、メソッドおよびサブクラスを含む呼び出すことができるようになるように継承は、再変換アップは、親オブジェクトへの参照多型サブクラスによって割り当てられる必要があります。

9、どのようにファイルへのJavaオブジェクトのシリアライズ?

ObjectOutputStream.writeObject()指定されたストリームを作成するための責任があるObjectInputStream.readObject()指定されたシリアル化されたデータストリームから読み込まれます。

//写入
try {
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("D:/student.txt"));
    os.writeObject(studentList);
    os.close();
} catch(FileNotFoundException e) {
    e.printStackTrace();
} catch(IOException e) {
    e.printStackTrace();
}
复制代码

10、Javaリフレクションのご理解について話

運転状態では、任意のクラスのために、そのメソッドとプロパティのいずれかを呼び出すことができる任意のオブジェクトのすべてのプロパティとメソッドそのクラスのを知ることができます。この情報は、動的に取得することができ、動的な機能は、反射Java言語と呼ばれるオブジェクトのメソッドを呼び出します。

反射作用:

開発プロセス、多くの場合、クラス、メソッドやプロパティのメンバ変数がプライベートで発生した、またはあなただけの利点を取ることができ、オープンシステムのアプリケーション、上のjava必要なプライベートメンバを取得するために反射や反射法による。

  1. クラスの取得Classオブジェクトのインスタンスを

Class clz = Class.forName("com.zhenai.api.Apple");

  1. Class取得オブジェクトインスタンスのConstructorオブジェクト

Constructor appConstructor = clz.getConstructor();

  1. 使用するConstructorオブジェクトnewInstanceの反射クラスのオブジェクトを取得する方法を

Object appleObj = appConstructor.newInstance();

  1. 取得方法Methodオブジェクト

Method setPriceMethod = clz.getMethod("setPrice", int.class);

  1. 使用してinvokeメソッド呼び出し方法を

setPriceMethod.invoke(appleObj, 14);

  1. することでgetFields()得ることができClass、クラスのプロパティを、しかし、私有財産を取得することはできません

そしてgetDeclaredFields()、あなたは、すべてのプロパティを取得を含め、私有財産を含むことができます。Declared方法なしに、プライベート反射法に変更することができるDeclared、それが唯一のような公共の反射、その他を使用することができる方法の変形Annotation\Field\Constructor十分。

11、Javaアノテーションのご理解について話

注釈が通っている@interface唯一の前に、定義されたキーワード、形態およびインターフェイスへ@

たとえば、次のように:

public @interface TestAnnotation {

}
复制代码

あなたが使用している場合@TestAnnotation、正しく動作するように注釈を作るために、を参照して、あなたはまた、メタアノテーションを使用する必要があり、ノートにコメントすることが可能であることを指摘しています。

メタタグは持っている@Retention @Documented @Target @Inherited @Repeatable5種類

1. @Retention

DESCRIPTION注釈生存時間値が持っているRetentionPolicy.SOURCE注釈は、ソース相においてのみ保持、コンパイル時にコンパイラによって破棄され、RetentionPolicy.CLASS 注解只保留到编译进行的时候,并不会被加载到JVM 中。RetentionPolicy.RUNTIME 可以留到程序运行的时候,它会被加载进入到それらが取得できるようにJVM`、プログラムが実行されます。

2. @文書化

要素は注釈を含んでjavadoc行きます

ターゲット@ 3.

定義されたアプリケーションシナリオ注釈、ElementType.FIELD属性に注釈を付けるために、ElementType.LOCAL_VARIABLEローカル変数に注釈を付けることができ、ElementType.METHOD方法に注釈を付けることができ、ElementType.PACKAGEパケットを与えるが、そのようなクラス、インタフェース、列挙として、ElementType.TYPEタイプをコメントする注釈を付けることができます

4. @Inherited

スーパークラスがされている場合は@Inherited、注釈付きのノートを注釈を付け、そのサブクラスではない場合、サブクラスはスーパークラスを継承する任意のコメントアプリケーションをコメントすることができます。

役割ノート:
  • コンパイラはエラーや警告メッセージを検出するために注釈を使用することができます:1)コンパイラに情報を提供
  • 2)相をコンパイル:注釈ソフトウェアツールは、コード情報、HTML文書を生成したり、他の適切な処理を実行するために使用することができます。
  • 3)運用段階:コードは、注釈ランタイムを使用して抽出することができます

注釈は、によって、反射して得られるClassオブジェクトisAnnotationPresent()を介して、それが注釈から適用されるかどうかの決意方法getAnnotation()得るための方法Annotationのオブジェクトを

12は、一般的な原理と例についての話します

ジェネリック型パラメータに渡され、このような多様なタイプのデカップリングを達成するために使用することができます。JavaジェネリックはJava1.5、一般的な実装消去の方法を使用して、以前のバージョンとの互換性を維持するために、後に現れます。ある程度型パラメータを無視する手段を消去Tから直接、TスタートアップクラスのT親クラスのこのような同様の宣言で行われていない場合、内部メソッドに型パラメータTを通過する、ジェネリックメソッドを呼び出すように、消去します

public T methodName(T extends Father t){}
复制代码

Java上方消去タイプ、直接パラメータ進行tとしてObject扱い、そしてにおける通過しないようにクラスをTこれは、任意のクラスや内部の一般的な方法では、消去、彼らの一般的なパラメータを知っていると、変換クラスやメソッドを入力するときに消去されるパラメータを渡すこと、境界が発生した上でですが、することはできません彼らは私たちのセットになっていたときに出てきますTまたは任意の特定のタイプを含む一般的なクラスメソッドに(すなわち、サブクラス消去のタイプ)動作はこのように、行うことができるnew T()、またはT.play()(play为某子类的方法而不是擦除后的类的方法)

13、Javaで文字列の理解

  • 1)Stringクラスはfinal、固体、タイプStringクラスを継承することができない、そのメンバーはまた、既定の方法であるfinal方法。Stringオブジェクトが固定に作成されたら、上のStringオブジェクトの変更変更関連の操作は新しい生成され、元のオブジェクトには影響しませんStringオブジェクトを。
  • 2)Stringによるクラスchar文字列の配列を保持する、Stringequals再比較値の方法は等しいです。
String a = "test"; 
String b = "test"; 
String c = new String("test");
复制代码

a、bそして文字通りtestへのすべてのポイントJVMの文字列定数プール"test"のオブジェクトは、それらは同じオブジェクトを指します。newオブジェクトを生成しますキーワードはtest、オブジェクトは、ヒープ上に格納されています。だから、new String("test")それはスタックに保存されている2つのオブジェクトを、生成cし、スタックに保存されていますtestそして、それはJavaで2つの完全に同じ文字列オブジェクトは存在しませんでしたので、ヒープはtest引用符で囲まれた文字列定数プールでなければなりませんtest

String str1 = "abc"; //栈中开辟一块空间存放引用str1,str1指向池中String常量"abc"
String str2 = "def"; //栈中开辟一块空间存放引用str2,str2指向池中String常量"def"
String str3 = str1 + str2;//栈中开辟一块空间存放引用str3
//str1+str2通过StringBuilder的最后一步toString()方法返回一个新的String对象"abcdef"
//会在堆中开辟一块空间存放此对象,引用str3指向堆中的(str1+str2)所返回的新String对象。
System.out.println(str3 == "abcdef");//返回false
复制代码

なぜならstr3点ヒープ"abcdef"オブジェクト、および"abcdef"プール内の文字のオブジェクト、その結果ですfalse定数プール内のオブジェクトはコンパイル時に行われますが、実行時に知られている、オブジェクトは、実行時に行われます。JVMString str="abc"String str3=str1+str2new

14、文字列はなぜ不変になるように設計すべきですか?

1)文字列の文字列定数プールは不変必要

のでString不変として設計作成するときは、Stringこの値は、既に一定のプールに存在する場合、オブジェクト、文字列を、新しいオブジェクトを作成することはありませんが、参照されるオブジェクトはすでに存在しています。文字列変数が変更を許可する場合は、そのようなオブジェクトを変更するように論理エラー、各種のは別の独立したオブジェクトに影響を与えます起こします。

2)Stringオブジェクトはハッシュコードをキャッシュすることができます。

文字列の不変性を確保するためにhashあなたがキャッシュできるので、コードの一意性をStringhashCodeため、必ずハッシュコードを再計算するために行っていません。文字列の比較を実行する、それが直接比較できるhashCode性能比較を改善し、。

3)セキュリティ

String多くの人にjavaカテゴリなどのパラメータとして使用urlアドレス、ファイルpathパス、反射たいString場合は、パラメータString変数は、セキュリティ上のリスクが発生します。

間違った場所、あなたの提案や修正を歓迎している場合これまでのところ、本明細書に、これは、終了しました。同時に、あなたの注意を楽しみにして、お読みいただきありがとうございました、ありがとうございました!

マイクロチャネル国民の関心番号:プログラマーアンドロイド、福祉を受けます

おすすめ

転載: juejin.im/post/5d69dc2ae51d4561ba48fe21