1. 程式人生 > >Java基礎面試題涉及的知識點-部分(後續會不斷更新)

Java基礎面試題涉及的知識點-部分(後續會不斷更新)

二進位制與十進位制的轉換

二進位制是01表示數字的數制,基數是2,逢2進1。
Java十進位制及二進位制表示對比:

十進位制:0 1 2 3 4 5 6 7 8 9

二進位制:0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
**規律:**除2取餘並倒著寫,直到被除數小於權值。比如 7 0111
十進位制轉換為二進位制:位數上的數字*2的位數次方的和,比如 9 = 1X2的0次方+0X2的1次方+0X2的2次方+1X2的3次方 = 1+8 = 9;
程式實現如下:

public class DecimalUtils{
	  /**
     * 十進位制轉換為二進位制
     * 正數:數字除2 取餘倒著寫,直到商為0
     * 負數:正數的二進位制取反 0-1 1-0 ,然後+1
     *
     * @return
     */
   public static String decimal2Binary(int decimal){
    	  String result = "";
    	  if(decimal == 0){
              return "0000";
    	  }
    	  
    	  if(decimal>0){
              while(decimal!=0){
                  int i = decimal %2;
                  result = i+result;
                  decimal = decimal/2;
              }
    	  }
    	  return result;
    }
    
    /**
     * 二進位制轉化為十進位制: 每個位數上的數字 * 2的(該位數-1)次方 ,也可以使用字串實現
     * 使用 字串實現可以避免int型別的限制
     * @param binary
     * @return
     */
   public static int binary2Decimal(int binary){
       int decimal = 0;
       int i = 0;  //位數
       while(true){
           int temp = binary % 10;
           decimal = temp * Math.pow(2,p);
           binary = binary/2;
           p++;
       }
       return decimal;
   }
}

//Test
public class Test{
    public static void main(String[] agrs){
        System.out.println("二進位制轉換為十進位制結果是:"+DecimalUtils.decimal2Binary(123));  //1111011
        System.out.print("十進位制轉換為二進位制結果是:"+DecimalUtils.binary2decimal(1111));//15
    }
}  

特殊的運算子記錄:

<< 左移:向左移動兩位 5<<2=20。 5:0101==》左移兩位:10100==>20. >> 右移:向右移動兩位 5>>2=1。 右移兩位 0001===》1

:無符號移動兩位(不區分正負),只對int型別有用。 5>>>2 = 1;

位運算子:應用於int long char short byte

& :如果對應的數字都為1 則是 1 ,否則是 0 例: 6 & 2 = 2 6: 0110 2: 0010;=》0010

| :如果對應的數字都是0

,則是0 ,否則是1。例: 6|2 = 4

^ : 如果對應的數字相同則是0 ,否則是 1。 例:6^2 = 4

~:按位反轉,即 0 變 1 ,1變 0 。 例:~6 = -7 0000 0000 0000 0110 ==》反轉:1111 1111 1111 1001 高位 = 1 是負數。

  1. int 裝箱拆箱的特殊性
public static void main(int args){
  Integer i2 = new Integer(0);

       int j = i2.intValue();

       j+=3;

       Integer b = new Integer(j);

       System.out.print(b.intValue());
}

new Integer() 是物件地址,兩個Integer物件不相等

Integer i1= new Integer(100);

Integer i2 = new Integer(100); i1=i2 -->false

int i3 = 100; i1=i3—>true ,i1 會自動拆箱,兩個int比較

Integer i4= 100; i1 = i4 —>false,i1指向的是堆中的資料,i4指向的是常量池。

Integer i5 = 100; i4 = i5 —>true

但是如果是:

Integer i6 = 128 ;

Integer i7 = 128 ; i6=i7;—>false. 原始碼中 (超出 -127-128 )後拆箱操作會重新new 一個Integer,地址不一致。

  1. 常量池相等問題: String s1 = “hello”; String s2 = s1; String s3 = “hello”; s1=s2 —> true s1=s3–> true ,都是指向的常量池 。但是如果是 String s3 = new String(“hello”); 則為false. String s3 = new String(“hello”);建立的物件數量是 1個或2個,在堆中 建立s3 ,如果常量池有 “hello”則不建立,否則建立。

  2. run()和start()方法的區別?如果在run()方法上加上synchronized呼叫順序有什麼變化?

Start()方法啟動一個執行緒,使執行緒處於就緒狀態,並沒有執行,呼叫start()方法後不用等run方法執行完成即可繼續執行下面程式碼。

run()方法,執行緒處於執行狀態,等run()方法執行完畢後才可繼續執行下面的程式碼。

在run()方法增加synchronize之後是防止多個執行緒爭奪資源。

hashmap及hashtable的區別?
見連結:https://blog.csdn.net/MarinaTsang/article/details/84032109

finalfinallyfinalize 的區別?一個變數被 final 修飾,變數的初始化在該類的建構函式裡面,這樣寫對嗎?

  • final:是一個修飾符,用於控制控制一個成員、方法或一個類是否被修改、重寫或繼承等功能。一個類被final宣告時無法派生子類,不能被作為父類被繼承。一個方法使用final修飾改方法無法被重寫,一個成員使用final修飾。其初始化只能在兩個地方,一是定義的時候,在定義的時候同時賦值,二是在建構函式的時候,二者只能選其一,在定義的時候沒有賦值,可以在建構函式中賦值,但之後引用該成員變數,只能讀取,不能修改。
  • finally:一般用於異常處理,一般在異常處理中,使用finally進行補充,實現清除操作。finally塊的程式碼一定會被執行,不管有沒有異常,所以finally可以維護物件的內部狀態,並可以清理非記憶體資源。finally在try{}catch{}中可有可無,一般用於關閉檔案流操作時,關閉資料庫操作。
  • finalize:是一個方法,在Java中,允許使用finalize()方法在垃圾回收器清理物件之前做清理工作。這個方法是有垃圾回收器在確定一個物件沒有引用時對這個物件呼叫。它是在object內定義的類,可以被所有類重寫。