持續整理中...java
1.下面哪一個不是Object類所定義的public method?( )
A.finalize() B.clone() C.wait() C.sleep()程序員
1.下面給出的Java中ClassLoader的描述,哪些是正確的?( )
A.ClassLoader沒有層次關係
B.全部類中的ClassLoader都是AppClassLoader
C.經過Class.forName(String className)可以動態加載一個類
D.不一樣的ClassLoader加載同一個Class文件,所得的類是相同的面試
2.Which characters does JVM use?(JVM使用哪一種字符編碼格式?)( )
A.ASCII characters B.Unicode characters
C.Cp1252 D.UTF-8算法
1.如下代碼的執行結果是____編程
public static void main(String[] args) { int i = 0; int x = i++; int y = ++i; int z = i++ + ++i; System.out.println(x); System.out.println(y); System.out.println(z); }
2.下列程序的輸出結果是( )數組
public static void main(String[] args) { int j = 0; for (int i = 0; i < 100; i++) { j = j++; } System.out.println(j); }
A.0 B.99 C.100 D.101app
3.下列程序的輸出結果是( )函數
public static void main(String[] args) { int a = 5, b = 3; if(!(a == b) && (a == 1 + b++)){}; System.out.println(a + "," + b); }
A.5,3 B.0,1 C.0,3 D.5,4測試
4.如下代碼的執行結果是____ui
public static void main(String[] args) { int i = 0; i = i++ + ++i; int j = 0; j = ++j + j++ + j++ + j++; int k = 0; k = k++ + k++ + k++ + ++k; int h = 0; h = ++h + ++h; int p1 = 0, p2 = 0, q1 = 0, q2 = 0; q1 = ++p1; q2 = p2++; System.out.println(i); System.out.println(j); System.out.println(k); System.out.println(h); System.out.println(p1); System.out.println(p2); System.out.println(q1); System.out.println(q2); }
5.如下代碼的執行結果是____
public static void main(String[] args) { int m = 5, n = 5; if((m != 5) && (n++ == 5)){} System.out.println(n); m = n = 5; if((m != 5) & (n++ == 6)){} System.out.println(n); m = n = 5; if((m == 5) || (n++ == 5)){} System.out.println(n); m = n = 5; if((m == 5) | (n++ == 6)){} System.out.println(n); int a = 1, b =2; int c = a & b; System.out.println(c); }
1.Which of the following will compile correctly(下列哪項編譯正確?)( )
A.Short myshort = 99S; B.float z = 1.0 C.int t = "abc".length() D.char c = 17c;
2.下面代碼的輸出結果是( )
public static void main(String[] args) { public static void main(String[] args){ int i = 012; int j = 034; int k = (int)056L; int l = 078; System.out.println(i); System.out.println(j); System.out.println(k); }
A.輸出12,34,56 B.輸出10,28,46
C.int k = (int)056L;行編譯錯誤 D.int l = (int)078;行編譯錯誤
3.如下程序錯誤的是( )
A.short s=1;s=s+1; B.short s=1;s+=1;
4.下面代碼的輸出結果是( )
public static void main(String[] args) { char x = 'x'; int i = 10; System.out.println(false ? i : x); System.out.println(false ? 10 : x); }
A.120 x B.120 120 C.x 120 D.以上答案都不對
1.Which declaration of the main() method in a stand-alone program are NOT valid?( )
(哪個Main方法的聲明在獨立程序中是無效的?)
A.public static void main()
B.public static void main(String[] string)
C.public static void main(String[] exp) throws FileNotFondException
D.Static void main(String args)
2.如下程序的輸出結果是?( )
public class Penguin { private String name = null; private int health = 0; private String sex = null; public void Penguin() { health = 10; sex = "雄"; System.out.println("執行構造方法。"); } public void print(){ System.out.println("企鵝的名字是" + name + ",健康值是" + health + ",性別是" + sex + "。"); } public static void main(String[] args) { Penguin pgn = new Penguin(); pgn.print(); } }
A.企鵝的名字是null,健康值是10,性別是雄。
B.執行構造方法。
企鵝的名字是null,健康值是0,性別是null。
C.企鵝的名字是null,健康值是0,性別是null。
D.執行構造方法。
企鵝的名字是null,健康值是10,性別是雄。
1.如下代碼的輸出結果是( )
public static void main(String[] args) { boolean b = true ? false : true == true ? false : true; System.out.println(b); }
A.true B.false C.null D.以上答案都不對
2.如下代碼的輸出結果是( )
public static void main(String[] args) { int i = 42; String s = (i < 40) ? "life" : (i > 50) ? "universe" : "everything"; System.out.println(s); }
A.life B.universe C.everything D.以上答案都不對
3.如下代碼的輸出結果是( )
public static void main(String[] args) { int a = 5; System.out.println(a < 5 ? 10.9 : 9); }
A.編譯錯誤 B.10.9 C.9 D.以上答案都不對
4.如下代碼的輸出結果是____
public static void main(String[] args) { int a = 1; int b = 2; System.out.println(a & b); System.out.println(a | b); }
5.如下代碼的輸出結果是____
public static void main(String[] args) { int a = 1; int b = 2; System.out.println(b << a); System.out.println(b >> a); }
6.如下代碼的輸出結果是____
public static void main(String[] args) { int a = 1; int b = 2; System.out.println(b << a << a); System.out.println(b >> a >> a); System.out.println(b >> 32); System.out.println(b << 33); }
1.編程,輸出數組裏的所有數值。(假設int[] array = new int[]{1, 2, 3, 4})
2.編程,輸出99乘法口訣表
3.編程,輸出字符串中出現次數最多的字符,若是有多個則都輸出。(假設字符串String str = "abcdefaaaccc"。);
4.編程,有一個整數n,寫一個函數f(n),返回0~n之間出現「1」的個數。好比f(1)=1,f(13)=6(一、十、十一、十二、13)
5.編程,獲取斐波那契數列的第n項值。
(斐波那契數列指的是這樣一個數列:一、一、二、三、五、八、1三、21……這個數列從第3項開始,每一項都等於前兩項之和。F[n]=F[n-1]+F[n-2] (n>2,F[1]=1,F[2]=1,F[3]=2,F[4]=3))
類和對象
1.下面哪一個不是Object類所定義的public method? 答案:
這題看起來很簡單,可是仔細一想沒那麼容易。
Object類定義的公用方法有如下7種:
toString(); // equals(Object object); getClass(); hashCode(); wait(); notify(); notifyAll();
wait();方法有三種重載方法
wait(long timeout);
wait(long timeout, int nanos);
再加兩個一共是9種public方法。
因此這題的正確答案是A、B、D, 四個選項裏只有wait()是公用方法
clone()和finalize()是protected方法。sleep()不是Object類的方法。
《Java程序員面試寶典》給的答案是D,顯然錯了。
JVM
1.答案:
A.選項錯誤,ClassLoader具有層次關係。
B.選項錯誤,ClassLoader不止一種。
D.選項錯誤,ClassLoader具有層次關係。
正確答案:C
2.答案:
JVM的設計者爲了解決編碼問題實現Java的跨平臺,沒有使用任何特定的編碼格式,而是使用Unicode(萬國碼)字符集來表示字符。
因此正確答案是B。
i++
1.答案:
0
2
6
2.答案:
j=j++;//這一步j等於0,循環100次依然是0。
因此正確答案是A。
3.答案:
!(a == b)爲true,還需執行後面的(a == 1 + b++),執行後a,b的值分別爲5,4。
因此正確答案是D
4.答案:
public static void main(String[] args) { int i = 0; i = i++ + ++i; //0 + (1 + 1) = 2 int j = 0; j = ++j + j++ + j++ + j++; //(1 + 0) + 1 + 2 + 3 = 7 int k = 0; k = k++ + k++ + k++ + ++k; //0 + 1 + 2 + (1 + 3) = 7 int h = 0; h = ++h + ++h; //(1 + 0) + (1 + 1) = 3 int p1 = 0, p2 = 0, q1 = 0, q2 = 0; q1 = ++p1; //q1 = 1, p1 = 1 q2 = p2++; //q2 = 0, p2 = 1 System.out.println(i); //2 System.out.println(j); //7 System.out.println(k); //7 System.out.println(h); //3 System.out.println(p1); //1 System.out.println(p2); //1 System.out.println(q1); //1 System.out.println(q2); //0 }
5.答案:
public static void main(String[] args) { int m = 5, n = 5; if((m != 5) && (n++ == 5)){} System.out.println(n); //5 m = n = 5; if((m != 5) & (n++ == 6)){} System.out.println(n); //6 m = n = 5; if((m == 5) || (n++ == 5)){} System.out.println(n); //5 m = n = 5; if((m == 5) | (n++ == 6)){} System.out.println(n); //6 int a = 1, b =2; int c = a & b; System.out.println(c); //0 }
因此正確答案是:
5
6
5
6
0
類型轉換
1.答案:
A選項錯誤。short類型賦值時不須要在數值後加s,加s會報錯。
B選項錯誤。float類型賦值時須要在數值後加f,不加f默認會轉成double類型,編譯報錯「不能從double轉換爲float」。
D選項錯誤。char類型賦值時不須要在後面加c,加c會報錯。
正確答案爲C。
2.答案:
在java中以0開頭的數字表明8進制,數字範圍0~7,以0x開頭的數字表明16進制數字範圍0~F。
public static void main(String[] args) { public static void main(String[] args){ int i = 012; //(1x8) + 2 = 10 int j = 034; //(3x8) + 4 = 28 int k = (int)056L;//(5x8) + 6 = 46 int l = 078; //編譯報錯「類型 int 的文字 078 超出了範圍」 System.out.println(i); System.out.println(j); System.out.println(k); }
因此正確答案是D
3.答案:
short s=1;s=s+1; //s+1爲int型,編譯報錯「類型不匹配:不能從 int 轉換爲 short」
short s=1;s+=1; //編譯正常
因此正確答案是A。
4.答案:
在Java中,整型、實型、字符型被視爲簡單數據類型,簡單數據類型之間會轉換,這些類型由低級到高級分別爲:
(byte short char) int long float double (7種 不包括boolean)
簡單數據類型之間的轉換又能夠分爲:
(1)低級到高級的自動類型轉換。
(2)高級到低級的強制類型轉換。
(1)包裝類型過渡類型可以轉換。
注意表達式中的精度轉換。當表達式中有高精度和低精度類型同時存在時,低精度類型會自動轉換爲高精度類型,輸出結果會發生變化,這點要特別注意。
false?i:x中i是整型,x是字符型,整型比字符型的精度高,因此x會自動轉換爲整型。結果爲120
false?10:x中10是整型, 可是是常量表達式。Java編程規範中提到:當後兩個表達式有一個是常量表達式時(10),兩外一個類型是T(char),而常量表達式能夠被T表示時,輸出結果是T類型(char類型能夠被int表示,因此輸出結果依然是char類型)。結果爲x
因此正確答案是A.120 x
程序結構
1.答案:
java中對於main方法有嚴格的定義,必須是
public static void main(String[] x)或
public static void main(String x[])形式的。
修飾符必須是public static,返回類型必須是void(不須要返回類型),參數必須是String[] 不能沒有參數也不能是其餘參數。
標準格式以下:
public static void main(String[] args){}或
public static void main(String args[]){}
能夠修改參數的名字或添加拋出異常。基本是死記硬背的一種格式,遇到此類問題能夠和標準格式進行比對。
實際上不寫public或參數並不會在編譯期間報錯但會在運行時報錯。
因此這道題不簡單,坑挺深的,編譯期間4個選項的寫法都不會報錯,但運行時A、D都會出錯。
A、D選項會在運行時報出找不到main方法的錯誤:
「錯誤:在類 Test 中找不到 main 方法,請將 main 方法定義爲
public static void main(String[] args) 不然 JavaFX 應用程序類必須擴展javafx.application.Application」
因此正確答案是A、D。 若是隻能選一個選項的話,選D,《Java程序員面試寶典》一書中給的答案是D,若是剛好考官出的是此書中的題,那就中了。
2.答案:
這道題看起來很簡單,若是你選D就錯了。
這題考驗的是你對構造方法的理解。
構造方法的定義是:與類名徹底相同。沒有返回值,也不能用void來修飾。
注意的是無返回類型而不是void返回類型。
在java中普通方法能夠和構造方法同名,可是必須帶有返回值。
實際上這題因爲public void Penguin(){}方法寫了void返回類型,因此他沒有符合構造方法的條件,而是被看成普通方法了。程序執行了默認的構造方法並無執行public void Penguin{}這個方法,變量沒有被初始化,因此結果是C。
運算符
1.答案:
a?b:c;是三目運算符,至關於:
if(a){ b; }else{ c; }
boolean b = true ? false : true == true ? false : true;至關於:
boolean b = true ? false : (true == true ? false : true);至關於:
boolean b; if(true){ b = false; }else{ if(true == true){ b = false; }else{ b = true; } }
因此正確答案是B。
2.答案:
String s = (i < 40) ? "life" : (i > 50) ? "universe" : "everything";至關於:
String s = (i < 40) ? "life" : ((i > 50) ? "universe" : "everything");至關於:
String s; if(i < 40){ s = "life"; }else{ if(i > 50){ s = "universe"; }else{ s = "everything"; } }
因此正確答案是C。
3.答案:
注意10.9:9這裏Java會根據運算符的精度自動進行類型轉換。10.9的精度是double型,後面的9也自動轉成double型了,
所以代碼執行後結果爲9.0。
因此答案是D。
4.答案:
&、|是位運算符,是操做二進制數的,因此要先把a、b轉換爲二進制數進行位運算後再轉換爲整型輸出結果。
1的二進制是01,2的進制是10
a&b = 1 & 2 =
01
10
__
00 = 0;
a|b = 1 | 2 =
01
10
__
11 = 3;
因此輸出結果爲:
0
3
5.答案:
<<、>>是位移運算符,是操做二進制數的,因此要先把a、b轉換爲二進制數進行位移運算後再轉換爲整型輸出結果。
public static void main(String[] args) { int a = 1; int b = 2; System.out.println(b << a); //(b << a) = (0010 << 1) = 0100 = 4 System.out.println(b >> a); //(b >> a) = (0010 >> 1) = 0001 = 1 }
因此輸出結果爲:
4
1
6.答案:
注意當位移溢出時的計算結果。
public static void main(String[] args) { int a = 1; int b = 2; System.out.println(b << a << a); //(b << a << a) = (b << 2) = (0010 << 2) = 1000 = 8 System.out.println(b >> a >> a); //(b >> a >> a) = (b >> 2) = (0010 >> 2) = 0000 = 0 System.out.println(b >> 32); //(b >> 32) = (b >> (32%32)) = (b >> 0) = b = 2; 數據溢出時,位移數%數據最大範圍,求餘後從新計算 System.out.println(b << 33); //(b << 33) = (b << (33%32)) = (b << 1) = (0010 << 1) = 0100 = 4; 數據溢出時,位移數%數據最大範圍,求餘後從新計算 }
因此輸出結果爲:
8
0
2
4
算法
1.輸出數組裏的全部值 答案:
//方法1 Arrays.toString(array) public static void main(String[] args) { int[] array = new int[]{1, 2, 3, 4}; System.out.println(Arrays.toString(array)); //[1, 2, 3, 4] }
//方法2 for循環 public static void main(String[] args) { int[] array = new int[]{1, 2, 3, 4}; int length = array.length; for (int i = 0; i < length; i++) { System.out.print(array[i] + " "); //1 2 3 4 } }
//方法3 foreach循環 public static void main(String[] args) { int[] array = new int[]{1, 2, 3, 4}; for(int v : array){ System.out.print(v + " "); //1 2 3 4 } }
2.輸出99乘法口訣表 答案:
//方法1 用String public static void NineNine(){ String str = ""; for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { str += j + "*" + i + "=" + j*i + "\t"; } str += "\n"; } System.out.println(str); }
循環10W次時間:1180ms
//方法2 用StringBuilder public static void NineNine(){ StringBuilder sb = new StringBuilder(); for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { sb.append(j); sb.append("*"); sb.append(i); sb.append("="); sb.append(j*i); sb.append("\t"); } sb.append("\n"); } System.out.println(sb); }
循環10W次時間:367ms
//方法3 一次循環完成 public static void NineNine(){ int i = 1; int j = 1; String str = ""; while (i <= 9) { str += j + "*" + i + "=" + j*i + "\t"; j++; if(j > i){ i++; j = 1; str += "\n"; } } System.out.println(str); }
循環10W次時間:1197ms
//測試代碼 public static void main(String[] args){ long t1 = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { //循環時註釋掉System.out.println(str) NineNine(); } long t2 = System.currentTimeMillis(); System.out.println(t2 - t1); }
3.輸出字符串中出現次數最多的字符 答案:
//方法1 public static void printMaxChars(String str){ HashMap<Character, Integer> map = new HashMap<Character, Integer>(); int length = str.length(); int max = 0; //循環字符串中的全部字符,記錄每一個字符出現的次數並獲取最大次數 for (int i = 0; i < length; i++) { int count = 0; char c = str.charAt(i); if(map.containsKey(c)){ count = map.get(c); } count++; if(count > max){ max = count; } map.put(c, count); } System.out.println("最大次數:" + max); //遍歷map中的鍵,若是其值等於最大次數,則列出 for (Character c : map.keySet()) { if(map.get(c).equals(max)){ System.out.print(c + " "); } } }
輸出結果:
最大次數:4
c a
(輸出結果還能夠放進數組裏排個序)
4.編寫函數f(n), 獲取0~n中「1」出現的次數 答案:
//獲取0~n中1的數量 public static int get1Count(int n){ String str = ""; for (int i = 1; i <= n; i++) { str += i; } int count = 0; int length = str.length(); for (int i = 0; i < length; i++) { char c = str.charAt(i); if(c == '1'){ count++; } } return count; }
5.獲取斐波那契數列的第n項值 答案:
// 方法1 遞歸 public static int Fibo(int n){ return n < 3 ? 1 : Fibo(n - 2) + Fibo(n - 1); }
計算n=1~40 時間:776ms
// 方法2 for循環 public static int Fibo(int n) { int a = 1; int b = 1; for (int i = 2; i < n; i++) { int c = a + b; a = b; b = c; } return b; }
計算n=1~500 循環1萬次時間:462ms
// 方法3 for循環簡化 // (理論上比方法2稍快 具體執行環境不一樣稍有差別 正負相差不大) public static int Fibo(int n) { int a = 1; int b = 1; for (int i = 2; i < n; i++) { b = a + b; a = b - a; } return b; }
以上結果能夠看出。雖然遞歸寫法很簡潔,可是效率過低,展開爲for循環之後,效率極大提高。
// 測試代碼 public static void FiboTest() { int times = 10000; int n = 500; long t0 = 0; long t1 = 0; /* // 輸出斐波那契數列 String msg = ""; for (int i = 1; i <= 20; i++) { msg += Fibo(i) + " "; } System.out.println(msg); */ /* // 遞歸 t0 = System.currentTimeMillis(); for (int j = 1; j <= 40; j++) { Fibo(j); } t1 = System.currentTimeMillis() - t0; System.out.println("遞歸:" + t1 + "ms"); */ //for循環 t0 = System.currentTimeMillis(); for (int i = 0; i < times; i++) { for (int j = 1; j <= n; j++) { Fibo(j); } } t1 = System.currentTimeMillis() - t0; System.out.println("for循環:" + t1 + "ms"); }