JAva面接のショック後に帰ってきて深く分析します

4347 ワード

1、StringとStringBuffer問題:面接管:Stringとオペレータ「+」で接続すればいいのに、どうしてStringBufferを使うの?私:愚か............検討:for Example:String result="aaa"+"bbb"+"ccc";vs String result = new StringBuffer.append(“aaa”).append(“bbb”).append(“ccc”).toString();
Stringタイプについては、メモリ定数領域に格納されており、soはGcに格納されず、常に存在すると考えられ、Stringタイプの+操作は1回行うたびに定数領域に保存されるが、最後の+操作の数値を実行するだけで、多くのメモリを浪費している.StringBufferの場合、newは1つ後にスタックメモリに格納され、1つしかなく、append操作はこのオブジェクトのみを操作し、toStirng()後に定数領域(1つの格納のみ)に保存され、その後、StringBufferオブジェクトはGCされる.
2、hashCodeの役割:hashCodeはHashMap、Hashtable、HashSetがデータを格納するときに異なるオブジェクトを識別するためにのみ使用されます.クラスをカスタマイズするときは、equals()メソッドを書き換える必要があります.hashCode()メソッド(hashタイプの格納に使用される場合)を一緒に書き換えることが望ましいです.for example:
Newクラス:次のように、クラスが等しい条件が2つのFujianオブジェクトのnameが等しい場合、下のequals()メソッド(Objectのデフォルトequals()と比較して2つのオブジェクトのメモリアドレス)のみを書き換えることができます.しかし、もし私が2つのnew FujianオブジェクトをHashSetに保存するとしたら?hashCode()メソッドを書き換えなければ、デフォルトではオブジェクトのメモリアドレスの対比となり、2つのnewから出てくるオブジェクトはメモリにアドレスが異なるに違いない.hashCode()を書き換えなければequals(equals()メソッドは書き換えられているが)hashCodeは異なるだろう.このようにHashSetに格納すれば2つの異なるオブジェクトになるが、考えてみれば矛盾している.2つのオブジェクトequalsは格納が異なるオブジェクトであり,so書き換えequalsメソッドもhashCodeメソッドを書き換える.
class Fujian{

    String name= "linfujian";

    int age;
    public void setAge(int age){
        this.age=age;

    }
    public int getAge(){
        return age;
    }
    public String toString(){
        return this.name;
    }
    public boolean equals(Object obj){
        if(obj instanceof Fujian){
            Fujian fujian = (Fujian)obj;
            return (name.equals(fujian.name));
        }
        return super.equals(obj);
    }

    public int hashCode(){
        return name.hashCode();
    }

}

3、catch文とfinally文は同時にreturnが存在し、どちらが役に立つか
    public static void main(String[] args){
        System.out.println(foo());
    }

    public static int foo(){
        int result;
        try {
            result = 10;
            result = result/0;
        } catch (Exception e) {
            System.out.println("Exception");
            result = -1;
            return result;
        } finally {
            result = 100;
            System.out.println("it alaways do!");
            return result;
        }
    }

少しマスターするだけ:finall文はいつも実行しなければならないので、catch文がrenturnに実行される前にfinall文が実行しなければなりません.そうしないと、catch文がrenturnになるとfinally文は実行する機会がありません.so catch文とfinally文が同時にreturnがある場合、catch文はreturnに実行される前にfinallyを実行します.finallyにはreturnがあります.catchのreturnは実行する機会がありません.答えは次のとおりです.
Exception
it alaways do!
100