java面試題基礎知識一:運算符操作以及一些基礎問題

1. java面試題基礎知識一:運算符操作以及一些基礎問題

1.1. 運算符

  1. 或運算|

將數字轉成二進制,全0位0,否則爲1

0xaa | 0x55 例如:0xaa轉成二進制爲:10101010 0x55轉爲二進制爲01010101 取或後爲11111111,十進制爲255,16進製爲0xFF

  1. 與運算&

將數字轉爲二級制,全1位1,其他爲0

15 等於1111 ,240等於 11110000,15前面用0補齊爲00001111 ,按位與之後爲 00000000 ,即結果爲0

  1. 異或運算^

將數字轉爲二級制,相同取0,不同取1.

1010 ^ 1100 =0110 , 十進制表示爲6,十六進制表示爲 0x06

  1. 帶符號右移>>

將數字轉爲二進制,在右移時,如果爲負數,補1,如果爲正數補0。

-2>>1

負數轉二進制的方法:正數取反,加1。因此2的二進制表示爲:0000 0000 0000 0000 0000 0000 0000 0010,取反加1爲:1111 1111 1111 1111 1111 1111 1111 1110 。即-2的二級製表示。

注: >> , << , >>> , 運算符只針對int型和long型,byte ,short ,char型需要轉換成Int型在進行操作。
所以: 帶符號右移之後爲 1111 1111 1111 1111 1111 1111 1111 1111 ,除符號位之外,減一取反,得到帶符號十進 制數爲 -1

  1. 無符號右移>>>

將數字轉爲二進制,無論正負數,右移之後都補0

-2 的二進制無符號右移一位之後爲 0111 1111 1111 1111 1111 1111 1111 1111,即 2^31 - 1,二的三十一次方減一。

1.2. 用最有效率的方法計算2乘以8

原理:將一個數左移n位,相當於乘以2的n次方,位運算是cpu直接支持的,所以效率高。
一個數右移n位,相當於這個數除以2的n次方。

常見的jdk源碼裏面HashMap的默認容量16

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;

1.3. 傳遞兩個非0的int數值進去,實現變量交換的方式,有幾種方式?

1、通過代碼的加減盡心交換。

private static void swap(int a,int b) {
    System.out.printf("a=%d,b=%d",a,b);
    a=a+b;
    b=a-b;
    a=a-b;
    System.out.printf("a=%d,b=%d",a,b);
}

2、通過異或運算解決。

**注意:**一個數與另一個數異或兩次是其本身,一個數與自身異或結果是0。

private static void swap2(int a,int b) {
    a=a^b;
    b=b^a;//b^a^b
    a=a^b;//a^b^a
    System.out.printf("a=%d,b=%d\n",a,b);
}

1.4. 數據類型分類:

基礎數據類型:byte(1),short(2),int(4),char(2),boolean(1),long(8),double(8),float(4)

引用類型:除了基礎類型,都是引用類型。

1.5. 返回值問題

如果int i=1;

return ++i和return i++有什麼區別?

前者i先自增1然後返回。後者先返回再自增1,故結果是2,1

1.6. ==和equals的區別

基本數據類型比較要用==來判斷是否相等。

引用數據類型比較用equals來判斷具體的內容是否相等。如果用==比較的是內存地址是否一樣。

1.7. try-catch-finally的返回值問題

問題:try-catch-finally語句裏面,try裏面有個return,finally裏面也有個return,結果會返回什麼?爲什麼?

public static int test1() {
    int a=1;
    try {
        System.out.println(a/0);
        a=2;
    } catch (Exception e) {
        //這裏確定了返回值是3,再執行finally,雖然finally裏面a=4,但是前面已經確定是3了,所以返回3.
        a=3;
        return a;

    }finally {
        a=4;
    }
    return a;
}
public static int test2() {
    int a=1;
    try {
        System.out.println(a/0);
        a=2;

    } catch (Exception e) {
        //catch裏面已經確定返回值爲3,然後執行finally,finally裏面a=4,但是有新的return,重新確定了返回值,所以是4
        a=3;
        return a;

    }finally {
        a=4;
        return a;
    }
}

在執行try-catch中的return之前,一定會執行finally中的代碼,如果finally中有return語句,就會直接執行finally中的return方法,所以finally中的return語句一定會被執行。

執行流程:finally執行前的代碼裏面包含return,會先確定return的返回值,然後再執行finally的代碼,最後再執行return語句。

1.8. 新版jdk代理IO流,編寫基礎代碼,從一個txt文本里面,拷貝里面的內容到另一個txt文本里面。

jdk7之後的寫法,jdk9進行了改良,需要關閉的資源只要繼承了java.lang.AutoCloseable,就可以自動關閉,try()可以定義多個資源,他們的關閉順序是最後在try裏面定義的最新關閉。

public static void test() {
    try(
        FileInputStream fis=new FileInputStream("/Users/xxx.xxx.txt");
        BufferedInputStream bis=new BufferedInputStream(fis);
        FileOutputStream fos=new FileOutputStream("/Users/xxxx/xxx.txt");
        BufferedOutputStream bos=new BufferedOutputStream(fos);
    ) {
        int size;
        byte[] buf=new byte[1024];
        while((size=bis.read(buf))!=-1) {
            bos.write(buf,0,size);
        }

    } catch (Exception e) {
        // TODO: handle exception
    }
}

1.9. 找出某目錄下的所有子目錄以及子文件並打印到控制檯

考察遞歸調用

private static void getAllFilePaths(File filePath,List<String> paths) {
    //列出所有的文件
    File[] files=filePath.listFiles();
    if(files==null) {
        return;
    }
    for(File f:files) {
        if(f.isDirectory()) {
            paths.add(f.getPath());
            getAllFilePaths(f, paths); 
        }else {
            paths.add(f.getPath());
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章