面経問題選のJava SE基礎部分


見たことのある問題を全部話して、内容が多くて、深く現実的ではありません.大まかに話して、少なくとも何が起こっているのか知っています.
Q 1:Javaの4種類の引用、強弱軟虚、使用するシーン.
1)強引用(StrongReference):
最も一般的な参照は、JVMがOutOfMemoryErrorを投げ出すよりも、強い参照されたオブジェクトをゴミ回収器に回収させることはありません.
2)ソフトリファレンス(SoftReference):
メモリが不足している場合にのみ、ゴミ回収器に回収されます.また、ごみ回収器は、長期間使用されていないソフト可及オブジェクトを優先的に回収します(可及性は後述).メモリに敏感なキャッシュを実現します.
3)弱引用(WeakReference):
発見されるとすぐに回収され、ソフトリファレンスよりもライフサイクルが短くなります.ただし,ごみ回収スレッドの優先度が低いため,必ずしも弱い対象をすぐに発見するとは限らない.
4)虚参照(PlantomReference):
なしと同等の参照がある場合は、参照キューReferenceQueueと連携して使用する必要があります.主な用途は、ReferenceQueueと連携して、虚の参照を持つオブジェクトが回収されたかどうかを追跡するために使用されます.
補足:
可及性:
同じオブジェクトに複数の参照があるか、または1つまたは複数の参照チェーンを介して到達し、単一のパスはそのパスの代表参照として最も弱い参照を取り、その後、複数のパスの比較では、そのオブジェクトの可及性として最も強い代表参照を取ります.
ReferenceQueueの役割:
1)リファレンスオブジェクトを失ったリファレンスの消去メカニズムを提供し、リファレンスオブジェクトを大量に失ったReferenceオブジェクトによるメモリ漏洩を防止する
2)対象のオブジェクトが回収されるかどうかを追跡できます(オブジェクトの弱い/ソフト/ダミー参照がキューに表示されている場合).
詳細学習リンク:http://zhangjunhd.blog.51cto.com/113473/53092/
Q 2:ArrayList、LinkedList、Vectorの違い
Listインタフェース、要素が整然としていて、重複コンテンツを許可する|---ARrayList:下層は配列を採用して実現し、非同期で、データは元の50%に増加した.
|----Vector:下位層は同様に配列で実現され、同期され、データは元の倍に増加した.
|        |--派生--Stack
|----Link edList:下位層は双方向チェーンテーブルで実現、非同期
比較:
ArrayListは非同期なので、スレッドのセキュリティを要求しない場合、スレッドのセキュリティを保証するオーバーヘッドを省くために、Vectorを使用するよりもArrayListを使用する方が効率的です.
ArrayListとVector 下位層は配列で実現されるため、任意の要素へのアクセスは効率的であるが、増加と削除の効率は低く(増加は要素の移動を招く)、下LinkedListに比べて下位層は双方向チェーンテーブルで実現され、アクセスは遅いが、増加削除は速い.
実際、「Practical Java」では、集合ではなく配列をできるだけ使用することを推奨しています.効率的なプログラムを要求する場合は、同期、追加のメソッド呼び出しをできるだけ回避し、データの増加によって追加の空間再割り当てのオーバーヘッドが発生します.
Q 3::HashMapとConcurrentHashMapの違い
HashMapはスレッドセキュリティではないことはよく知られていますが、ConcurrentHashMapはスレッドセキュリティです.
ConcurrentHashMapは同期を実現する上で,すべての方法にsychronizedを加えるのではなく(そうでなければHashTableになる)、セグメントロックの概念を導入した.1つのMapの内容を分割して複数のSegMentに格納し、hashCodeに基づいてどのSegMentに格納するかを決定し、複数のスレッドの読み取り/書き込みの部分が同じSegMentに属している場合にのみ、そのSegMentがブロックされ、残りの場合、異なるSegMentに属する読み取りと書き込みがブロックされず、スレッドの安全を提供することを前提として、より効率的である.
詳細学習リンク:http://blog.csdn.net/xuefeng0707/article/details/40834595
Q 4:TreeMap、HashMap、LinkedHashMapの違い
Mapインタフェース:LinkedHashMapを除き、要素は無秩序(挿入順序に関係なく遍歴された順序を指す)であり、重複キーは許可されず、重複コンテンツを許可する.
|
|---HashMap:非同期、底層は配列+チェーンテーブルとして実現し、nullをキー値として許可し、データ成長条件が0.75の配列容量が占有され、容量が倍増し、hashCodeは二次hashと計算され、より良いハッシュを得る
|          |          値
|          |
|          |---派生--LinkedHashMap:  通常はHashMapよりも遅いが、実際のデータ量が非常に少なく、容量が非常に大きい場合、LinkedHashMapは
|                                                 HashMapが速い
|
|---HashTable:同期,下位はHashMap,nullをキー値として許可せずDictionary抽象クラスを実現し,データ成長条件は同様に0.75の容量が占有され,容量は2倍になり+1,hashCode計算
|                    配列長を直接型抜きする                     
|     
|---TreeMap:非同期、空キーは許可されず、下層は赤と黒の木で、遍歴して取り出したのはソート後の結果である.
補足:HashMapが衝突を解決する方法はチェーンテーブル法です.
詳細学習リンク:
http://xiaolu123456.iteye.com/blog/1485349
http://blog.sina.com.cn/s/blog_7cf112e00100rk88.html
Q 5:Interfaceとabstractクラスの違い.
1)インタフェースのデータメンバーはpublic static finalである必要がありますが、抽象クラスには通常のメンバー変数があります.
2)インタフェース内のすべてのメソッドは抽象メソッドでなければならないが,抽象クラスは非抽象的な一般メソッドを持つことができる.
3)インタフェースの抽象メソッドはpublicタイプとしてのみ定義でき,デフォルトはpublicであり,実装時にはpublicまたはフレンドリーとしてのみ定義できる.抽象クラスの抽象メソッドはpublicまたはprotectedとして定義できます.
4)1つのクラスは1つの抽象クラスしか継承できないが,複数のインタフェースを実現できる.
5)個人的には、設計理念上、抽象クラスは「is-a」の関係を定義し、インタフェースは「behave like」の関係を定義している(インタフェースは「私のすべてのクラスを実現するには、私の今のように見える」と述べている.---<)
補足:
1.クラスに抽象的なメソッドが含まれていなくても、このクラスをabstractクラスとして宣言できます.このクラスのすべてのインスタンスを禁止したい場合は、このメソッドは非常に有効です.(Thinking in Javaより).
2.抽象クラスの設計モードでの応用:
テンプレートメソッドモード:操作中のアルゴリズムのスケルトンを定義し、ステップをサブクラスに遅延します.テンプレートメソッドにより、サブクラスは、アルゴリズムの構造を変更することなく、アルゴリズムの特定のステップを再定義することができる.
例:
あるプロジェクトのすべてのサーブレットクラスが同じ方法で権限判断、アクセスログの記録、異常の処理を行うと仮定すると、抽象的なベースクラスを定義し、すべてのサーブレットがこの抽象的なベースクラスを継承し、抽象的なベースクラスのサービスメソッドで権限判断、アクセスログの記録、異常を処理するコードを完了させることができる.各サブクラスでは、それぞれのビジネスロジックコードを完了するだけです.
詳細学習リンク:http://blog.163.com/wuqiwei_2010/blog/static/1625507782011215114150967/
Q6:
http://zhh9106.iteye.com/blog/2151791
Q 10:foreachと通常のforサイクル効率の比較
foreachの効率は通常のforサイクルよりやや低いが,配列を巡ると効率はほとんど変わらない.foreachは、異なるコンテナを巡る場合、コンパイル方法が異なります.配列以外の容器を遍歴する必要がある場合は、通常のforループを使用することが望ましい.
補足:
1)  foreachはキーワードではありません
2)ネット上で流布している多くのforeachについては値のみを取り,遍歴対象を修正できないという説は不正確だと思いますが,正確にはforeachを使って集合の要素を削除したり上書きしたりすることはできないはずですが,集合の要素の属性を修正することはできますが,これはやはりハンドルに対する理解によるものです.
import java.util.*;
class Apple{ 
    public int var;
}

public class See{
    public Apple[] ap = new Apple[2];

    public static void main(String[] args) {
        See ts = new See();
        /*Innitialization*/
        ts.ap[0] = new Apple();
        ts.ap[1] = new Apple();
        ts.ap[0].var = 10086;
        ts.ap[1].var = 11111;
        
        /*use foreach to change the properties of the entry */
        for(Apple x : ts.ap)
            x.var = 233;  

        for(int i=0; i<2; i++){
          System.out.println(ts.ap[i].var);
        }

        /*try to use foreach to change the entry*/
        for(Apple x : ts.ap)
            x = new Apple();
        
        /*If the entries were replaced, the out put should be 0*/
        for(int i=0; i<2; i++){
          System.out.println(ts.ap[i].var);
          /*however the out put is 233*/
        }
    }
}

詳細学習リンク:http://bbs.csdn.net/topics/340188487