1. 程式人生 > >java筆試題整理

java筆試題整理

1、運算子優先順序問題,下面程式碼的結果是多少?

  1. public class Test {

  2. public static void main(String[] args) {

  3. int k = 0;

  4. int ret = ++k + k++ + ++k + k;

  5. // ret的值為多少

  6. System.err.println(ret);

  7. }

  8. }

解答:主要考察++i和i++的區別。++在前則先自增再賦值運算,++在後則先賦值再自增運算。因此,結果為8。

2、運算子問題,下面程式碼分別輸出什麼?

  1. public class Test {

  2. public static void main(String[] args) {

  3. int i1 = 10, i2 = 10;

  4. System.err.println("i1 + i2 = " + i1 + i2);

  5. System.err.println("i1 - i2 = " + i1 - i2);

  6. System.err.println("i1 * i2 = " + i1 * i2);

  7. System.err.println("i1 / i2 = " + i1 / i2);

  8. }

  9. }

解答:主要考察兩點,運算子的優先順序、字串與數字中的+為連線符號。第一條中,都是相加,則從前到後的順序運算,字串與數字相加,連線為一個字串,再與後面的數字相加,再次連線為字串,因此結果為“i1 + i2 = 1010”。第二條是錯誤的,字串無法與數字用減號連線。第三條、第四條中乘除的優先順序高,會先運算,而後再與字串連線,因此結果分別為:“i1 * i2 = 100”、“i1 * i2 = 1”。

3、下面程式碼的結果是什麼?

  1. public class Test {

  2. public void myMethod(String str) {

  3. System.err.println("string");

  4. }

  5. public void myMethod(Object obj) {

  6. System.err.println("object");

  7. }

  8. public static void main(String[] args) {

  9. Test t = new Test();

  10. t.myMethod(null);

  11. }

  12. }

解答:這道題考察過載方法引數具有繼承關係時的呼叫問題,還有對null的認識。如果是一般具有繼承關係的物件分別作為引數,看物件的引用,如:

  1. class A {

  2. }

  3. class B extends A {

  4. }

  5. public class Test {

  6. public static void main(String[] args) {

  7. A b1 = new B();

  8. B b2 = new B();

  9. get(b1);// A

  10. get(b2);// B

  11. }

  12. public static void get(A a) {

  13. System.out.println("A");

  14. }

  15. public static void get(B a) {

  16. System.out.println("B");

  17. }

  18. }

這道題中,Object是一切類的父類,具有繼承關係,那null是指向什麼呢?null是任何引用型別的初始值,String和Object的初始值都是null,但是null會優先匹配引用型別引數為String的方法,因此這道題答案是string。假設這道題中還有其他同是引用型別的過載方法呢?如:

  1. public void myMethod(Integer obj) {

  2. System.err.println("Integer");

  3. }

如果是這樣的話,呼叫這個方法傳入引數null時會報錯,他不知道選哪個方法進行匹配呼叫了。

4、假設今天是9月8日,下面程式碼輸出什麼?

  1. public class Test {

  2. public static void main(String[] args) {

  3. Date date = new Date();

  4. System.err.println(date.getMonth() + " " + date.getDate());

  5. }

  6. }

解答:這道題考察的是日期中獲取的月份是從0開始的,因此會比我們日常的月份少1,這個題答案是8 8。

5、下面程式碼的輸出結果是什麼?

  1. public class Test {

  2. public static void main(String[] args) {

  3. double val = 11.5;

  4. System.err.println(Math.round(val));

  5. System.err.println(Math.floor(val));

  6. System.err.println(Math.ceil(val));

  7. }

  8. }

解答:這個是在考Math取整數的三種方法。round()是四捨五入取證,floor()是捨去小數位,ceil()是向上進一位。floor是地板ceil是天花板,一個在下,則捨去,一個在上,則向上進1。那是不是結果應該為12、11、12呢?還要考慮返回值型別,round()返回值型別為long長整型,floor()和ceil()返回值的是double型別,因此正確的答案應該是12、11.0、12.0。

6、程式設計輸出一個目錄下的所有目錄及檔名稱,目錄之間用tab。

  1. public class Test {

  2. public static void main(String[] args) {

  3. new Test().read("D:/test", "");

  4. }

  5. public void read(String path, String tab) {

  6. File file = new File(path);

  7. File[] childFiles = file.listFiles();

  8. for (int i = 0; childFiles != null && i < childFiles.length; i++) {

  9. System.err.println(tab + childFiles[i].getName());

  10. if (childFiles[i].isDirectory()) {

  11. read(childFiles[i].getPath(), tab + "\t");

  12. }

  13. }

  14. }

  15. }

這個主要是考察IO部分知識點了。

7、從鍵盤讀入10個整數,然後從大到小輸出。

  1. public class Test {

  2. public static void main(String[] args) {

  3. Scanner in = new Scanner(System.in);

  4. // 注意這裡的陣列,不是int的

  5. Integer[] arr = new Integer[10];

  6. for (int i = 0; i < 10; i++) {

  7. arr[i] = in.nextInt();

  8. }

  9. Arrays.sort(arr, new Comparator<Integer>() {

  10. @Override

  11. public int compare(Integer o1, Integer o2) {

  12. if (o1 > o2) return -1;

  13. if (o1 < o2) return 1;

  14. return 0;

  15. }

  16. });

  17. System.err.println(Arrays.toString(arr));

  18. }

  19. }


8、下面程式碼的結果是什麼?

  1. public class Test extends Base {

  2. public static void main(String[] args) {

  3. Base b = new Test();

  4. b.method();

  5. Test t = new Test();

  6. t.method();

  7. }

  8. @Override

  9. public void method() {

  10. System.err.println("test");

  11. }

  12. }

  13. class Base {

  14. public void method() throws InterruptedException {

  15. System.err.println("base");

  16. }

  17. }

解答:兩次呼叫輸出都是test。多型的情況下,儘管是父類的引用,呼叫方法時,還是呼叫子類的方法。

9、以下程式碼的結果是什麼?

  1. package test;

  2. public class Test extends Base {

  3. public static void main(String[] args) {

  4. new Test().method();

  5. }

  6. public void method() {

  7. System.err.println(super.getClass().getName());

  8. System.err.println(this.getClass().getSuperclass().getName());

  9. }

  10. }

  11. class Base {

  12. }

解答:第一個輸出test.Test、第二個輸出test.Base。super很容易讓人以為也是呼叫了父類,實際上還是本類。具體原因也沒太搞懂,有懂的同學歡迎留言。

10、true or false?

  1. public class Test {

  2. public static void main(String[] args) {

  3. String str1 = new String("abc");

  4. String str2 = new String("abc");

  5. System.err.println(str1.equals(str2));

  6. StringBuffer sb1 = new StringBuffer("abc");

  7. StringBuffer sb2 = new StringBuffer("abc");

  8. System.err.println(sb1.equals(sb2));

  9. }

  10. }

解答:第一個true,第二個false。String重寫了Object中的equals方法,會將string拆分為字元陣列,逐個比較各個字元,程式碼如下:

  1. public boolean equals(Object anObject) {

  2. if (this == anObject) {

  3. return true;

  4. }

  5. if (anObject instanceof String) {

  6. String anotherString = (String)anObject;

  7. int n = value.length;

  8. if (n == anotherString.value.length) {

  9. char v1[] = value;

  10. char v2[] = anotherString.value;

  11. int i = 0;

  12. while (n-- != 0) {

  13. if (v1[i] != v2[i])

  14. return false;

  15. i++;

  16. }

  17. return true;

  18. }

  19. }

  20. return false;

  21. }

Object中的equests方法如下:

  1. public boolean equals(Object obj) {

  2. return (this == obj);

  3. }


11、輸出的結果是什麼?

  1. public class Test {

  2. public static void main(String[] args) {

  3. System.err.println(new Test().method1());

  4. System.err.println(new Test().method2());

  5. }

  6. public int method1() {

  7. int x = 1;

  8. try {

  9. return x;

  10. } finally {

  11. ++x;

  12. }

  13. }

  14. public int method2() {

  15. int x = 1;

  16. try {

  17. return x;

  18. } finally {

  19. return ++x;

  20. }

  21. }

  22. }

解答:第一個返回1,第二個返回2。finally中的程式碼是一定會被執行的且在try中的程式碼執行完之後,因此若在其中return返回,會覆蓋掉try中的返回值。

如果這樣呢?

  1. public class Test {

  2. public static void main(String[] args) {

  3. System.err.println(method());

  4. }

  5. public static boolean method() {

  6. try {

  7. return true;

  8. } finally {

  9. return false;

  10. }

  11. }

  12. }

很明顯返回值應該為false。

12、方法m1和m2有區別嗎?

  1. public class Test {

  2. public static void main(String[] args) {

  3. }

  4. public synchronized void m1() {

  5. }

  6. public static synchronized void m2() {

  7. }

  8. }

解答:這裡考察的是同步方法的問題。synchronized修飾方法時鎖定的是呼叫該方法的物件。它並不能使呼叫該方法的多個物件在執行順序上互斥,靜態修飾符很有必要。因此當不適用靜態時,建立多個物件執行該方法,鎖都不一樣,還同步什麼呢,因此用static修飾後才能實現想要的效果。

13、true or false?

  1. public class Test {

  2. public static void main(String[] args) {

  3. Integer i1 = 127;

  4. Integer i2 = 127;

  5. System.err.println(i1 == i2);

  6. i1 = 128;

  7. i2 = 128;

  8. System.err.println(i1 == i2);

  9. }

  10. }

14、true or false?

  1. public class Test {

  2. public static void main(String[] args) {

  3. String str1 = "a";

  4. String str2 = "a";

  5. String str3 = new String("a");

  6. System.err.println(str1 == str2);

  7. System.err.println(str1 == str3);

  8. str3 = str3.intern();

  9. System.err.println(str1 == str3);

  10. }

  11. }

15、true or false?

  1. public class Test {

  2. public static void main(String[] args) {

  3. System.err.println(12 - 11.9 == 0.1);

  4. }

  5. }

解答:結果為false。這個題我只說下我的想法,12-11.9進行運算後會轉換成物件,不在是基本資料型別,因此在進行恆等判斷時,就會是false。

16、以下程式碼輸出是什麼?

  1. public class Test {

  2. public static void main(String[] args) {

  3. BigInteger one = new BigInteger("1");

  4. BigInteger two = new BigInteger("2");

  5. BigInteger three = new BigInteger("3");

  6. BigInteger sum = new BigInteger("0");

  7. sum.add(one);

  8. sum.add(two);

  9. sum.add(three);

  10. System.out.println(sum.toString());

  11. }

  12. }

解答:這個是對大整數的考察。結果是不是6呢?看起來好像沒毛病,其實不然。sum.add(one)與我們基本型別的sum+=one可不同,前者不會講結果賦值給sum物件,結果被賦值了這條語句的返回值。因此不管怎麼add,sum物件的值是沒有變化的,因此結果為0。

17、輸出的結果是什麼?

  1. public class Test {

  2. public static void main(String[] args) {

  3. Set<String> set = new HashSet<String>();

  4. set.add("one");

  5. set.add("two");

  6. set.add("three");

  7. set.add("four");

  8. set.add("five");

  9. for (Iterator<String> it = set.iterator(); it.hasNext();) {

  10. System.err.println(it.next());

  11. }

  12. }

  13. }

解答:結果順序是four  one  two  three  five。有懂的同學歡迎留言評論。

18、如何迭代Map容器?

  1. Map<String, String> map = new HashMap<>();

  2. Set<Map.Entry<String, String>> entrySet = map.entrySet();

  3. for(Map.Entry<String, String> entry : entrySet){

  4. String key = entry.getKey();

  5. String value = entry.getValue();

  6. }

  7. Set<String> keySet = map.keySet();

  8. Iterator<String> it1 = keySet.iterator();

  9. if(it1.hasNext())

  10. System.out.println(it1.next());

  11. Collection<String> values = map.values();

  12. Iterator<String> it2 = values.iterator();

  13. if(it2.hasNext())

  14. System.out.println(it2.next());


19、以下程式碼輸出的結果

  1. public class Test {

  2. public static void main(String[] args) {

  3. System.err.println(args.length);

  4. }

  5. }

  6. /*

  7. A. null B. 0 C. Test

  8. D. Exception in thread "main" java.lang.NullPointerException

  9. */

解答:0.

20、下面為一個單例的實現程式碼,請指出程式碼中有幾個錯誤或不合理之處,並改正。

  1. public class Test {

  2. public Test instance = null;

  3. public static Test getInstance() {

  4. if (instance == null) {

  5. instance = new Test();

  6. return instance;

  7. }

  8. }

  9. }