JAva面接問題整理(一)


1、1つの「.java」ソースファイルに複数のクラス(内部クラスではない)を含めることができますか?どんな制限がありますか. 
複数のクラスを持つことができますが、publicのクラスは1つしかありません.publicのクラス名はファイル名と一致する必要があります.
2、Javaはgotoがありますか? 
JAvaのリザーブワードは、javaでは使用されていません.
3、&と&&の違い. 
&と&&は論理和の演算子として使用でき、論理和(and)を表し、演算子の両方の式の結果がtrueの場合、演算結果全体がtrueになります.そうしないと、一方がfalseの場合、結果はfalseになります.
&&はまた、最初の式がfalseの場合、if(str)のような2番目の式は計算されません. != null && !str.equals(""))式は、strがnullの場合、後の式は実行されないため、Null PointerExceptionが&&を&に変更するとNull PointerException異常が放出されます.If(x==33 & ++y>0) yは成長し、If(x=33 && ++y>0)成長しない
&ビット演算子としても使用できます.&オペレータの両方の式がbooleanタイプでない場合、&ビットと操作を表します.通常、0 x 0 fを使用して1つの整数と&演算を行い、この整数の最低4ビット、例えば0 x 31を取得します. & 0 x 0 fの結果は0 x 01です. 
4、JAVAで現在の多重ネストループからどのように飛び出しますか? 
Javaでは、マルチループをスキップするには、外のループ文の前にラベルを定義し、裏レイヤループのコードにラベル付きbreakを使用します. 文は、外層ループから飛び出すことができます(これはCのgoto文によく似ています).例:
  • 1-1 break文現在のループから飛び出した例
  • 
      
      
      
      
    1. ok: 
    2. for(int i=0;i<10;i++) 
    3.     for(int j=0;j<10;j++) 
    4.     { 
    5.         System.out.println(“i=” + i + “,j=” + j); 
    6.         if(j == 5)  
    7.                          break ok; 
    8.     } 
    9. }  

    コード1−1は、多重ネストされたループから飛び出すことができるが、外層のループ条件式の結果を、例えば、2次元配列で数値を検索するように、内層ループ体コードによって制御することが望ましい.
  • -2内層循環制御外層循環により多重ネスト循環
  • から飛び出す.
    
       
       
       
       
    1. int arr[][] = {{1,2,3},{4,5,6,7},{9}}; 
    2. boolean found = false
    3. for(int i=0;i<arr.length && !found;i++) 
    4.      for(int j=0;j<arr[i].length;j++) 
    5.      { 
    6.         System.out.println(“i=” + i + “,j=” + j); 
    7.          if(arr[i][j]  == 5)  
    8.          { 
    9.             found = true;
    10.             break
    11.          } 
    12.       } 
    13. }  

    5、switch文はbyteに作用できるか、longに作用できるか、Stringに作用できるか. 
    switch(expr 1)では、expr 1は1つの整数式または列挙定数のみであり、整数式はint基本タイプまたはInteger包装タイプであってもよく、byte、short、charはいずれもintに変換することを暗黙的に含んでいるため、これらのタイプおよびこれらのタイプの包装タイプも可能である.明らかに、longタイプとStringタイプはswitchの構文規定に合致せず、intタイプに暗黙的に変換できないため、switch文には作用しません. 
    6、char型変数に中国語の漢字を1つ保存できますか?どうして? 
    char型変数はUnicode符号化文字を格納するためのものであり、unicode符号化文字セットには漢字が含まれているので、char型変数には当然漢字を格納することができる.しかし、ある特殊な漢字がunicode符号化文字セットに含まれていない場合、このchar型変数にはこの特殊な漢字が格納されない.
    説明:unicode符号化は2バイトを占有するため、charタイプの変数も2バイトを占有する.
    7、最も効率的な方法で2に8を乗じて計算するのは何ですか. 
    2 << 3,
    1つの数をnビット左にシフトすることは、2を乗じたn次方に相当するので、1つの数に8を乗じて3ビット左にシフトすればよいが、ビット演算cpuは直接サポートされ、効率が最も高いため、2に8を乗じて数に等しい最も効率的な方法は2である << 3.
    8、finalキーワードを使用して変数を修飾する場合、参照は変更できませんか、それとも参照のオブジェクトは変更できませんか. 
    finalキーワードを使用して変数を修飾する場合、参照変数は変更できませんが、参照変数が指すオブジェクトの内容は変更できます.たとえば、次の文について説明します.
    
      
      
      
      
    1. final StringBuffer a=new StringBuffer("immutable"); 

    次の文を実行すると、コンパイルエラーがレポートされます.
    
      
      
      
      
    1. a=new StringBuffer(""); 

    ただし、次の文を実行するとコンパイルできます.
    
      
      
      
      
    1. a.append(" broken!");  

    9、"=="とequalsメソッドの違いは何ですか?
    ==オペレータは、2つの変数の値が等しいかどうか、すなわち、変数が対応するメモリに格納されている値が同じかどうかを比較するために使用されます.2つの基本タイプのデータまたは2つの参照変数が等しいかどうかを比較するには、==オペレータのみを使用します.
    1つの変数が指すデータがオブジェクトタイプである場合、オブジェクト自体が1つのメモリ(スタックメモリ)を占有し、変数もObjetなどのメモリを占有する2つのメモリに関連します. obj = new Object();変数objはメモリですnew Object()は別のメモリであり、この場合、変数objに対応するメモリに格納される数値は、オブジェクトが占有するメモリのヘッダアドレスである.オブジェクトタイプを指す変数について、2つの変数が同じオブジェクトを指すかどうかを比較する場合、すなわち、2つの変数に対応するメモリの数値が等しいかどうかを確認するには、==オペレータで比較する必要があります.
    equalsメソッドは、2つの独立したオブジェクトの内容が同じかどうかを比較するために使用されます.たとえば、2人の顔が同じかどうかを比較するように、2つのオブジェクトが独立しています.たとえば、次のコードについて説明します.
    
      
      
      
      
    1. String a=new String("god"); 
    2. String b=new String("god"); 

    2つのnew文は、2つのオブジェクトを作成し、a,bの2つの変数でそれぞれ1つのオブジェクトを指します.これは2つの異なるオブジェクトで、最初のアドレスが異なる、すなわち、aとbに格納されている数値が異なるため、式a=bはfalseを返し、この2つのオブジェクトの内容は同じであるため、式a.equals(b)はtrueを返します.
    実際の開発では、伝達された文字列の内容などを比較することがよくあります.例えば、次のようにします.
    
      
      
      
      
    1. String input = …;//  
    2. input.equals(“quit”); 

    多くの人が注意せずに==を使って比較したのは間違いです.文字列の比較は基本的にequalsメソッドを使用していることを覚えておいてください.
    クラスが独自にequalsメソッドを定義していない場合、Objectクラスのequalsメソッドが継承されます.Objectクラスのequalsメソッドの実装コードは次のとおりです.
    
      
      
      
      
    1. boolean equals(Object o){ 
    2.  return this==o; 

    これは、クラスが独自にequalsメソッドを定義していない場合、デフォルトのequalsメソッド(Objectから クラスが継承する)は==オペレータを使用することであり、2つの変数が指すオブジェクトが同じオブジェクトであるかどうかを比較する場合でも、equalsと==を使用すると同じ結果が得られ、2つの独立したオブジェクトを比較するとfalseが返されます.作成したクラスがクラスで作成した2つのインスタンスオブジェクトの内容が同じかどうかを比較したい場合は、equalsメソッドを上書きし、2つのオブジェクトの内容が同じと判断できるようにコードを自分で書く必要があります.
    10、静的変数とインスタンス変数の違いは? 
    構文定義の違い:静的変数の前にstaticキーワードを追加し、インスタンス変数の前に追加しません.
    プログラム実行時の違い:インスタンス変数はオブジェクトのプロパティに属し、このインスタンス変数を使用するには、インスタンスオブジェクトを作成する必要があります.静的変数はインスタンスオブジェクトではなくクラスに属するため、クラス変数とも呼ばれ、プログラムがクラスのバイトコードをロードすれば、インスタンスオブジェクトを作成する必要がなく、静的変数が空間を割り当てられ、静的変数が使用されます.要するに、インスタンス変数はオブジェクトを作成してから使用する必要があります.静的変数はクラス名で直接参照できます.
    たとえば、次のプログラムでは、複数のインスタンスオブジェクトを作成しても、staticVar変数が1つしか割り当てられず、インスタンスオブジェクトを作成するたびに1が加算されます.ただし、インスタンスオブジェクトを作成するたびに、1つのinstanceVarが割り当てられます.すなわち、複数のinstanceVarが割り当てられ、各instanceVarの値は1回しか加算されません.
  • -3静的変数とインスタンス変数の違いの例
  • 
       
       
       
       
    1. public class VariantTest 
    2.         public static int staticVar = 0;//   
    3.         public int instanceVar = 0;//   
    4.         public VariantTest() 
    5.         { 
    6.             staticVar++; 
    7.             instanceVar++; 
    8.             System.out.println(“staticVar=” + staticVar + 
    9. ”,instanceVar=” + instanceVar); 
    10.         }