1. java面試題基礎知識一:運算符操作以及一些基礎問題
文章目錄
1.1. 運算符
- 或運算|
將數字轉成二進制,全0位0,否則爲1
0xaa | 0x55 例如:0xaa轉成二進制爲:10101010 0x55轉爲二進制爲01010101 取或後爲11111111,十進制爲255,16進製爲0xFF
- 與運算&
將數字轉爲二級制,全1位1,其他爲0
15 等於1111 ,240等於 11110000,15前面用0補齊爲00001111 ,按位與之後爲 00000000 ,即結果爲0
- 異或運算^
將數字轉爲二級制,相同取0,不同取1.
1010 ^ 1100 =0110 , 十進制表示爲6,十六進制表示爲 0x06
- 帶符號右移>>
將數字轉爲二進制,在右移時,如果爲負數,補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
- 無符號右移>>>
將數字轉爲二進制,無論正負數,右移之後都補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());
}
}
}