Java筆記試験の面接問題(一)

4831 ワード

毎日一言:一労永逸の幸福がなくて、先に苦くて甘い努力しかありません!がんばって!
            java                 ,        ,               ,    ,    。      ,    10+   ,            。

第一部分:基礎部分
           :    ,       ,   、  、  、  、  、IO、   、  。

1.Javaソースファイルに複数のクラス(内部クラスではない)を含めることができますか?どんな制限がありますか.複数ありますが、publicのクラスは1つしかありません.publicのクラス名はファイル名と一致する必要があります.
2 Javaはgotoがありますか?gotoはJavaのリザーブワードに属し、現在は使用されていません.
3&と&&の違い&と&&は論理と演算子として、論理と(and)を表し、演算子の両方の式の結果がtrueの場合、演算結果全体がtrueになります.そうしないと、一方がfalseであれば、最終結果はfalseになります.短絡機能を備えている.すなわち、第1の式がfalseの場合、第2の式は計算されなくなる.例えばif(str!=null&&!str.equals("""))式の場合、strがnullの場合、後の式は実行されないので、例外は放出されず、&&を&に変更するとNull PointerException例外が放出される.if(x=3&++y>0)式の場合、x=3が成立しなければyは自己加算され、if(x=3&&++y)式の場合、x=3が成立しなければyは自己増加しません.&ビット演算子としても使用できます.&オペレータの両方の式がbooleanタイプではない場合、&はビットと操作を表します.私たちは通常0 x 0 fを使用して1つの整数と&演算を行い、この整数の最低4ビットビットを取得します.例えば、0 x 31&0 x 01の結果は0 x 01です.備考:この問題はまず両者の共通点を話して、&&と&の特殊なところを話して、そしていくつかの経典の例を列挙して自分の理解が深くて、実際の経験が豊富であることを表明します.
4 Javaで現在の多重ネストループからどのようにジャンプしますか?Javaで多重ループを飛び出すには、外のループ文の前にラベルを定義し、奥層ループ体のコードにラベル付きbreak文を使用すると、外層ループから飛び出すことができます.例:
ok:
for(int i=0; i<10; i++){
    for(int j=0; j<10; j++){
        System.out.println("i=" + i + ",j=" + j);
        if(j == 5) break ok;
    }
}

個人的には、ラベルを使用するのではなく、外層サイクル条件式の結果を内層サイクルコードで制御できます.たとえば、2 D配列で数値を検索するには、次のようにします.
int arr[][] = {{1,2,3}, {4,5,6,7}, {9}};
boolean found = false;
for(int i=0; i

5 switch文はbyteに作用しますか?longに作用しますか?Stringに作用しますか?switch(exprl)では、exprlは整数式または列挙定数のみです.整数式はintベースタイプまたはIntegerパッケージタイプであってもよく、byte、short、charはintに暗黙的に変換できるため、これらのタイプおよびこれらのタイプのパッケージタイプも可能である.明らかに、longタイプとStringタイプはswitchの構文規定に合致せず、intタイプに暗黙的に変換できないため、switch文には使用できません.
6 short s1 = 1;s1 = s1 + 1;何が悪いの?short s1 = 1;s1 += 1;何が悪いの?short s 1=1の場合.s1 = s1 + 1;s 1+1演算時に式のタイプが自動的に昇格するため、結果はint型であり、shortタイプs 1に値を割り当てると、コンパイラは強制変換タイプが必要なエラーを報告する.short s 1=1の場合.s1 += 1;+=はjava言語で規定された演算子であるため、javaコンパイラは特殊な処理を行うため、正しくコンパイルできます.
7 char型変数に中国語の漢字を1つ保存できますか?どうして?char型変数はUnicode符号化文字を格納するためのものであり、Unicode符号化文字セットには漢字が含まれているので、char型変数には当然漢字を格納することができる.ただし,Unicode符号化文字セットに特殊な漢字が含まれていなければ,charタイプ変数にはこの漢字を格納できない.補足:Unicode符号化は2バイトを占めるため、char型変数も2バイトを占める.
8最も有効な方法で2に8を掛けると数に等しいと計算した.答え:2<<3は1つの数を左にシフトするnビットを言うので、2を乗じたn次方に相当します.では、1つの数に8を乗じて3ビットを左にシフトするだけでいいですが、ビット演算はCPUが直接サポートし、効率が最も高いです.
9 100億を計算できる計算機を設計してください.まず、この問題の考察点が何なのかを理解しなければならない.一つは、まずコンピュータの原理の底の細部を明らかにしなければならない.加減法のビット演算原理とコンピュータの算術演算が境界を越えることを知っていること、二つ目は、一定の対象向けの設計思想を備えなければならない.まず、計算機には固定数の数バイトで数値を格納するので、計算機で表すことができる数値には一定の範囲があり、説明と理解を容易にするために、まずbyteタイプの整数を例にとると、1バイトで格納され、最大数値範囲は-128から+127である.-1メモリに対応するバイナリは11111111であり、2つの-1を加算するとjava演算時のタイプアップを考慮せずに演算後にキャリーが発生し、バイナリ結果は111111110であり、キャリー後にbyteタイプの記憶空間を超えたため、キャリー部分は捨てられ、すなわち最終結の結果は11111110、すなわち-2である.これはちょうどオーバーフロー方式を利用して負数の演算を実現した.-128メモリに対応するバイナリは1000000であり、2つの-128が加算されるとjavaを考慮しないと演算後にキャリーが発生し、バイナリ結果は1000000でbyteの範囲を超え、キャリー部分は捨てられ、最終結果は00000000、すなわち0であるという結果は明らかに正しくない.これはコンピュータにおける算術演算が境界を越えていることを示している.2つの数値の演算結果は、コンピュータ内のこのタイプの数値範囲を超えてはいけません.Javaで式演算を設計する際のタイプが自動的に向上するため、byteタイプでこのような問題の和現象を実証する実験はできません.整数を使って体験してみてください.
int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;
int sum = a + b;
System.out.println("sum=" + sum);
                long  ,  int       231,          2*1000*1000*1000,   20    ,  ,     100     ,                     ,                      ,      :

(1)このクラスの内部には2つのメンバー変数があり、1つはシンボルを表し、1つはバイト配列で数値のバイナリ数を表す.(2)複数の数値を含む文字列を内部のシンボルとバイト配列に変換する構造方法がある.(3)加減乗除機能を提供する.
public class BigInteger{
    int sign;
    byte[] val;
    public BigInteger(String val){
        sign =  ;
        val =  ;
    }
    public BigInteger add(BigInteger other){}
    public BigInteger subtract(BigInteger other){}
    public BigInteger multiply(BigInteger other){}
    public BigInteger divide(BigInteger other){}
}
              :           ,      ,                 ,         jdk    java.math.Biginteger    。

10 finalキーワードを使用して変数を修飾する場合、参照は変更できませんか?それとも適用するオブジェクトは変更できませんか?finalキーワードを使用して変数を修飾する場合、参照変数が変化しないこと、参照変数が指すオブジェクトの内容が変化することができることを意味します.例えば、final StringBuffer a = new StringBuffer(“immutable”);実行文はコンパイルエラーを報告する:a = new StringBuffer(“”);しかし、以下のように実行することでコンパイル:a.append(“broken!”);誰かが方法のパラメータを定義している場合、方法の内部修正が伝わるパラメータオブジェクトを阻止するために以下の形式を採用したい場合がある:public void method(final StringBuffer param){}実際には、これはできません.この方法の内部では、パラメータオブジェクトを修正するために、任意に次のコードを追加することができる:param.append(“aaa”);