Javaの一般的な面接の質問-part1

質問があれば、私を修正してください!

1. Javaの==とequalsとhashCodeの違い

  1. ==

    1. 処置:リレーションシップは2つのオペランドを比較するには、ブール値を返します。
    2. 特定のパフォーマンスは、2つのオペランドは、基本データ型(8種類)である場合、比較値が等しく、一方のオペランドが参照型である場合、比較は、同じメモリアドレスです。
  2. イコール

    1. Objectクラスのメソッド
    2. 役割:、参照アドレスが同じである比較するオブジェクトのクラスがある達成するために
    public boolean equals(Object obj) {
            return (this == obj);
    }
    
    1. などの文字列、整数、などの多くのクラスはequalsメソッドを書き換えています。メモリの同じブロックか否かを判断するだけ2つの基準点オブジェクト・クラスの方法に等しく、しかしであるため、現実、我々はしばしば2つのオブジェクトが論理的に等価であるかどうかを必要とする、など
    String s1 = "abc";
    String s2 = "abc";
    // 实际上对象 s1 和对象 s2 指向的是不一样的地址空间
    // 但是我们通常从逻辑上认为 s1 和 s2 是相等的,这种情况下就要重写 equals 方法,如下
    
    // java.lang.String
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
    
    1. 同じアドレスかどうかを判断する==底または参照を介して
  3. ハッシュコード

    1. ローカル・オブジェクト・クラス・メソッドは、オブジェクトのハッシュ値を返し、オブジェクトが高速パケットに対して区別するため
    public native int hashCode();
    
    1. 多くのクラスではhashCodeメソッドをオーバーライドします
    // java.lang.String
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;
    
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
    // 为什么使用 31
    // 一方面:产生更分散的散列,即不同字符串 hash 值一般也不同
    // 另外  :计算效率更高,31*h 与 32 * h - h 即(h << 5) - h 等价,
    // 可以使用更高效率的移位和减法操作代替乘法操作
    
  4. 違いとの関係

    1. = =底部または基準アドレスを使用して決意と等しくなるだけでなく、= =の値を決定するための操作の基本的な種類の数。
    2. このような状況は、すべての場合に、重複する要素を除去するために前のオブジェクトと比較する必要がある、オブジェクトにそれぞれ、複数の比較基準値が設定された設定では、例えば、同じである必要、発生した場合これは、比較するequalsメソッドを呼び出すことですので、効率が非常に低いです。この場合、ハッシュコードは便利です。ソリューションはこれです:あなたは、コントラストを必要とするたびに、ときに最初のコールのhashCode()アドレスは、他のオブジェクトに存在しない場合は、直接そのオブジェクト、ハッシュ値を計算し、その後、ハッシュ値に基づいて、現在のオブジェクトストアのアドレスを取得します追加しました。あなたはすでにオブジェクトを持っている場合は、この方法は、比較するのに等しく、それは偽を返す場合、このオブジェクトは、コレクション、ハッシュに存在しない、新しいアドレスはハッシュ内部にオブジェクトの後に計算されていることと思いますが、場合を使用し続けます真のリターンに等しい、オブジェクト内部の設定はされており、追加する必要はありません。
    3. それぞれhashCodeメソッドをオーバーライドする必要があり、クラスのequalsメソッドを書き換えます。
    4. 2つのオブジェクトがequalsメソッドによって比較的等しい場合、それから彼は確かに等しいのhashCodeです。
    5. 2つのオブジェクトがhashCodeメソッドを比較することにより等しい場合、彼の等号は必ずしも(ハッシュの衝突)と等しくありません。

2. int型と整数間の差

  1. INTは、整数intは、対応するパッケージである、基本的なデータ・タイプ(8型)です。インナーラッパークラスは、基本型の値を格納するためのインスタンス変数を有し、データを操作するためのいくつかの静的クラスメソッド、スタティックメソッド、インスタンス変数が存在します。
  2. 各ラッパー・クラスは、静的メソッドがありvalueOf()、基本的なタイプを参照型を返し、また、インスタンスメソッドたxxxValue()戻り、実質的種類に対応します。
  3. 推奨される静的にはvalueOf()新しい、新しいオブジェクトを作成するたびに、オブジェクトを作成しますが、フロート及びダブル、オブジェクトがキャッシュされているパッケージ外の他のパッケージに加えて、省スペース、あなたが作成する必要があるオブジェクトの数を削減し、パフォーマンスを向上させます。
  4. 共通のすべてのパッケージ
    1. 書き換え方法のオブジェクト
      1. イコール和のhashCode
    2. Comparableインタフェースを実装
    3. パッケージ化と文字列
      1. int a = Integer.parseInt("1") :文字列の基本的なタイプの値を返します。
      2. String a = Integer.toString(1) :基本的なタイプに基づいて、文字列値を返します。
    4. 一般的な変数
      1. Integer.MAX_VALUEの
      2. Double.POSITIVE_INFINITY
      1. これは、包装の6種類の共通の親クラス値であり、包装は実質的に任意の戻り値の型とすることができます
    5. 不変性
      1. すべてのラッパークラスは、最終的に宣言されて継承することはできません
      2. 内部の基本的なタイプは、プライベートであり、最後の文
      3. セッターメソッドが定義されていません。
      4. 不変の変更は、プログラムのシンプルで安全になります

3.抽象クラスの意義

  1. そのような動物、果実のようなオブジェクトに対応する特定のクラスありません;

  2. public abstract class Animal {
        // 其他代码
        public abstract void eat();	// 动物的抽象的动作
    }
    
  3. これは、抽象クラスのメソッドを抽象クラスとして宣言されなければならない定義し、抽象クラスは、抽象メソッドはできません。

  4. 抽象と具象クラスは、特定のメソッド、インスタンス変数などのように定義することができますが、新しいオブジェクトを作成するために使用することはできません。唯一の彼の特定のサブクラスでオブジェクトを作成します。

  5. 具体的なサブクラスを継承した後抽象クラスは、必要がありますオーバーライドする抽象メソッド抽象クラスを。

  6. 抽象クラスを意味

    1. 継承を使用するためには、
    2. いくつかのクラスとメソッドは、誤用を減らすために、それらの適切な使用でユーザーを導くために、抽象メソッドやクラスをご紹介します。達成するために行かなければならない親クラスのメソッドのサブクラスを教えてください。オブジェクトは、特定のサブカテゴリーを使用することを知って、そして不可能不完全な親を誤用しなければならない場合、ユーザーは、抽象クラスを使用して、クラスが作成されました。

4.抽象クラスとインターフェイスとの間の差

  1. どちらが多いと組み合わせて使用されているインタフェースの定義能力抽象クラスは、デフォルトの実装を提供します
  2. 抽象クラスとインタフェースオブジェクトを作成するために使用することができない、インタフェースメソッドは、実際には抽象メソッドです。
  3. インスタンス変数インタフェースで定義することができない、抽象クラス、クラスは複数のインタフェースを実装し、一つだけの親クラスの継承ができます。
  4. インターフェースは、多くの場合、対応する抽象クラスです。
  5. 実装クラスは抽象クラスでない限り、インタフェースを実装し、すべてのメソッドがインタフェースを書き換えなければ、抽象親クラス継承、あなたが必要性の選択肢を書き換えることができる方法があります。
  6. Javaバージョン9、インターフェース、
    1. メンバ変数が一定です、public static final 数据类型 常量名称 = 数据值;
    2. 開始のJava 8から、インタフェースを定義することを可能にするデフォルトの方法を、デフォルトの方法は、主に、界面に高機能を容易にするために、データ処理の需要関数に導入されpublic default 返回值类型 方法名(参数列表);
    3. 開始のJava 8から、インタフェースを定義することを可能にする静的メソッドをpublic static 返回值类型 方法名(参数列表){方法体};
    4. 開始ジャワ9から、独自のメソッドの定義を可能にする便利静的複数またはコードの再利用のデフォルト方法
      1. 通常のプライベートメソッド、private 返回值类型 方法名(参数列表){方法体};
      2. プライベート静的メソッド、private static 返回值类型 方法名(参数列表){方法体};
    5. インターフェイスは、コンストラクタを静的ブロックを持つことはできません

5.あなたは、変数オブジェクトを含む不変オブジェクトを作成することはできますか?

あなたは、変数オブジェクトを含む不変オブジェクトを作成することができます。限りないようにポールが基準が変更されないことを保証するために、オブジェクトに変数の参照を共有していない必要性が可変オブジェクトを変更する場合、それは元のオブジェクトのコピーを返します。

Javaの多型の理解約6話

  1. オブジェクト指向の三つの基本的な特性:カプセル化、継承、多態性とダイナミックな結合、または遅延バインディングを実行している結合:,も多型として知られています

    1. パッケージ:オブジェクトの隠蔽実装の詳細、及び、共通の方法で目的関数を露出させます。
    2. 継承:サブクラスは親クラス、サブクラスを継承する際に、ソフトウェアの再利用の基本的な手段は、特別な親クラス、親クラスの(修正親プライベートメソッドとプロパティを除く)直接の属性とメソッドとして、達成されます。
    3. ポリモーフィック:サブクラスのオブジェクトは、親クラス変数に直接割り当てることができますが、まだ実行されていることは特徴的な挙動のサブクラスを示し、実行中に同じ種類のオブジェクトが異なる行動特性を示すことができることを意味します。
  2. 参照変数:

    1. コンパイル時の型:変数の型によって決まるが宣言されたときに
    2. 実行時型:変数オブジェクトの決定に割り当てられた実際の
    3. 二つは矛盾している、それが多型表示される場合があります
    Father f = new Son();
    // 引用变量 f 的编译时类型为 Father,运行时类型为 Son
    
  3. ポリモーフィック:コンパイルは、親クラスを参照してくださいサブクラスを見て実行します。

    1. だから、変数の宣言がで使用されるときに、クラス参照変数のためにのみ、コンパイラが渡されていないので、何も実行もないでしょう、呼び出すことができます。
    2. サブクラスは親クラスを継承した後、それは独自の方法を拡張することが、これらの方法のどれもそう使用し、親クラスを拡張するための参照変数を宣言するために、親クラスを取得書かれ、サブクラスでこれらのメソッドを拡張することはできませんでしょうオブジェクトの異なるメソッドとインスタンス変数が多型を持っているので、インスタンス変数または親クラスを使用しません。
    public class Test {
        public static void main(String[] args) {
            Father f = new Son();
            f.father(); // 输出 “我是儿子,继承自Father。”
            System.out.println(f.fatherSay); // 输出 “我是爸爸” 而不是 “我是儿子”
            //f.eat(); // 编译器警告: Cant resolve method "eat()"
            // 如果使用类型转换
            ((Son) f).eat();	// 输出 “我爸没有这个方法”
        }
    }
    class Father {
        public String fatherSay = "我是爸爸";
        public void father() {
            System.out.println("我是爸爸");
        }
    }
    class Son extends Father {
        // 编译器提示  Filed 'fatherSay' never used 
        public String fatherSay = "我是儿子";
        @Override
        public void father() {
            System.out.println("我是儿子,继承自Father。");
        }
        public void eat() {
            System.out.println("我爸没有这个方法。");
        }
    }
    

7.文字列、StringBufferの、StringBuilderを区别

  1. 最後のクラスであり、継承できません。

  2. 文字列の不変、のStringBufferとStringBuilderの変数。プロデュース、新しいオブジェクトは、文字列のための新しいオブジェクトへのその後のポインタを変更します、とのStringBuilderとStringBufferのとがったオブジェクトの変更のための新しいオブジェクトを作成しないでください。

  3. StringBuilderはスレッドセーフではありません、StringBufferのは、スレッドセーフで、同時動作をサポートしています。StringBuilderのシングルスレッド環境より効率的に、マルチスレッド環境を選択して、より安全な選択肢のStringBuffer。

  4. オブジェクト作成の文字列型は、と呼ばれるメモリ内に配置された後に文字列定数プール共有領域。定数を通じて文字列形式を使用する場合、それは一定のプールに対応するString型の使用を目的とします。

    String hh = new String(new char[] {'h','e','l','l','o'});
    String s1 = hh;
    String s2 = hh;
    System.out.println( s1 == s2 );	// 输出 true
    
    
  5. 直接文字列+ + =演算子を使用することができると、Javaの底コンパイラは、典型的には、追記方式によって上記動作を達成するために、StringBuilderのに変換されます。

8.スーパーとの間の差は、ジェネリックを拡張します

  1. すべてのジェネリック医薬品のワイルドカード。

  2. 上限指定されたワイルドカード(拡張:アウトせずに共変を):上限は、ワイルドカードのみの要素のコレクションから取られ、指定されたセットは、要素は常に、あなたが追加することができない、種類を制限するために取られているため、コンパイラは要素のどのセットを決定することはできませんシードタイプ

    List<? extends Shape> list;	// 表泛型形参必须是 Shape 的子类
    
    
  3. (指定されたスーパーワイルドカードの下限:いないのみにインバータ):添加元素のみ、撮影したオブジェクトタイプの処理要素は鋳造することができる場合に、取ることができません

    List<? super Bar> list;	// 泛型形参是 Bar 的父类
    
    

9.プロセスとスレッドの違い

どちらも、異なるオペレーティング・システム・リソース管理されています。

  1. プロセス:リソース割り当ての基本単位
  2. スレッド:プログラムの実行の基本単位
  3. コルーチン:また、マイクロスレッドとして知られているが、「サブルーチンは特殊なケースでコルーチンです。」
    1. 高性能
    2. あなたは、マルチスレッドロック機構を必要としません
  4. 違い
    1. 私たちは、リソースを持っています
      1. プロセスは別々のアドレス空間を持っています
      2. プロセス内の実行パスのちょうど別のスレッド
      3. 資源保護の要件については、高いプロセス、高コスト、比較的低効率、省資源・スレッドは聞かないが、オーバーヘッドは小型、高効率、頻繁な切り替えです。
    2. 派遣
    3. オーバーヘッド
      1. スレッドの実行はオーバーヘッドそれが資源管理と保全に資するものである、小さいです
      2. 代わりに、プロセス
      3. CPUスレッド切り替えオーバーヘッド切替処理よりも小さいです
    4. コミュニケーション
      1. 同じプロセス下のスレッドとの間のより便利な通信は、グローバル変数、静的変数、プロセス間の通信は、方法で行う(IPC)通信共有スレッドデータ、ハンドル同期と相互排他に(しかし、マルチスレッドプログラムが困難です)

違い10.final、最終的には、確定

  1. クラスやメソッドの最終的な変更は、または拡張を許可しない方法は、クラスを表します。修飾されたクラスがクラスが継承することができない表し、この方法は変更することができないアプローチは、サブクラスによってオーバーライド表します。この変数は、変数が定数で修飾されています。

    public final class String extends Object implements Serializable, Comparable<String>, CharSequence
    public final void say() {}
    public static final int MAX_VALUE = 0x7fffffff;
    
    
  2. 最後に:リソースを閉じるためのJava例外システムを使用

  3. ファイナライズ:一部のオブジェクト指向プログラミング言語、例えばC ++、ディスプレイのがデストラクタ方法であって、前記オブジェクトがもはやデストラクタで実行するために使用されるクリーンアップコード番号を確定するように、最も一般的な操作は、割り当てられた回収することです収納空間オブジェクト。Javaの自動ガベージコレクタは、デストラクタをサポートしていません。

    1. オブジェクトが外部のリソースが不要になったメモリ、その他のリソースの数を使用している場合しかし、回復し、再利用することが重要です。
    2. これは、クラスのいずれかに添加することができるガベージコレクタがファイナライズメソッドを呼び出す前に、オブジェクトが削除され、過度に依存することなく、。

質問があれば、私を修正してください!

公開された16元の記事 ウォンの賞賛2 ビュー1280

おすすめ

転載: blog.csdn.net/yx185/article/details/103281492