非常にお勧めの記事:ようこそお気に入り の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
表されることができる文字の、範囲25
5、及びシンボルがあまりにも人間表現する、完全に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
、ある2394
0ヤードビットは、表すことができる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
インターフェイスダイレクトコールの方法、機構とSpring
AOP
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
必要なプライベートメンバを取得するために反射や反射法による。
- クラスの取得
Class
オブジェクトのインスタンスを
Class clz = Class.forName("com.zhenai.api.Apple");
Class
取得オブジェクトインスタンスのConstructor
オブジェクト
Constructor appConstructor = clz.getConstructor();
- 使用する
Constructor
オブジェクトnewInstance
の反射クラスのオブジェクトを取得する方法を
Object appleObj = appConstructor.newInstance();
- 取得方法
Method
オブジェクト
Method setPriceMethod = clz.getMethod("setPrice", int.class);
- 使用して
invoke
メソッド呼び出し方法を
setPriceMethod.invoke(appleObj, 14);
- することで
getFields()
得ることができClass
、クラスのプロパティを、しかし、私有財産を取得することはできません
そしてgetDeclaredFields()
、あなたは、すべてのプロパティを取得を含め、私有財産を含むことができます。Declared
方法なしに、プライベート反射法に変更することができるDeclared
、それが唯一のような公共の反射、その他を使用することができる方法の変形Annotation\Field\Constructor
十分。
11、Javaアノテーションのご理解について話
注釈が通っている@interface
唯一の前に、定義されたキーワード、形態およびインターフェイスへ@
たとえば、次のように:
public @interface TestAnnotation {
}
复制代码
あなたが使用している場合@TestAnnotation
、正しく動作するように注釈を作るために、を参照して、あなたはまた、メタアノテーションを使用する必要があり、ノートにコメントすることが可能であることを指摘しています。
メタタグは持っている@Retention @Documented @Target @Inherited @Repeatable
5種類
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
文字列の配列を保持する、String
のequals
再比較値の方法は等しいです。
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
。定数プール内のオブジェクトはコンパイル時に行われますが、実行時に知られている、オブジェクトは、実行時に行われます。JVM
String str="abc"
String str3=str1+str2
new
14、文字列はなぜ不変になるように設計すべきですか?
1)文字列の文字列定数プールは不変必要
のでString
不変として設計作成するときは、String
この値は、既に一定のプールに存在する場合、オブジェクト、文字列を、新しいオブジェクトを作成することはありませんが、参照されるオブジェクトはすでに存在しています。文字列変数が変更を許可する場合は、そのようなオブジェクトを変更するように論理エラー、各種のは別の独立したオブジェクトに影響を与えます起こします。
2)Stringオブジェクトはハッシュコードをキャッシュすることができます。
文字列の不変性を確保するためにhash
あなたがキャッシュできるので、コードの一意性をString
のhashCode
ため、必ずハッシュコードを再計算するために行っていません。文字列の比較を実行する、それが直接比較できるhashCode
性能比較を改善し、。
3)セキュリティ
String
多くの人にjava
カテゴリなどのパラメータとして使用url
アドレス、ファイルpath
パス、反射たいString
場合は、パラメータString
変数は、セキュリティ上のリスクが発生します。
間違った場所、あなたの提案や修正を歓迎している場合これまでのところ、本明細書に、これは、終了しました。同時に、あなたの注意を楽しみにして、お読みいただきありがとうございました、ありがとうございました!