久久久久无码精品,四川省少妇一级毛片,老老熟妇xxxxhd,人妻无码少妇一区二区

JAVA筆試題目及答案

時間:2023-08-03 19:31:29 玉華 JAVA認證 我要投稿
  • 相關推薦

JAVA經典筆試題目及答案(精選7套)

  編程語言可以簡單的理解為一種計算機和人都能識別的語言。一種計算機語言讓程序員能夠準確地定義計算機所需要使用的數據,并精確地定義在不同情況下所應當采取的行動,下面是小編收集的JAVA經典筆試題目及答案,歡迎大家閱讀和參考。

JAVA經典筆試題目及答案(精選7套)

  JAVA筆試題目及答案1

  一、選擇題(共50題,每題1.5分,共75分。多選題選不全或選錯都不得分。)

  1. 以下屬于面向對象的特征的是(C,D)。(兩項)

  A) 重載

  B) 重寫

  C) 封裝

  D) 繼承

  2. 以下代碼運行輸出是(C)

  public class Person{

  private String name=”Person”;

  int age=0;

  }

  public class Child extends Person{

  public String grade;

  public static void main(String[] args){

  Person p = new Child();

  System.out.println(p.name);

  }

  }

  A) 輸出:Person

  B) 沒有輸出

  C) 編譯出錯

  D) 運行出錯

  3. 在使用super 和this關鍵字時,以下描述正確的是(A)

  A) 在子類構造方法中使用super()顯示調用父類的構造方法,super()必須寫在子類構造方法的第一行,否則編譯不通過

  B) super()和this()不一定要放在構造方法內第一行

  C) this()和super()可以同時出現在一個構造函數中

  D) this()和super()可以在static環(huán)境中使用,包括static方法和static語句塊

  4. 以下對封裝的描述正確的是(D)

  A) 只能對一個類中的方法進行封裝,不能對屬性進行封裝

  C) 封裝的意義不大,因此在編碼時盡量不要使用

  D) 封裝的主要作用在于對外隱藏內部實現細節(jié),增強程序的安全性

  5. 以下對繼承的描述錯誤的是(A)

  A) Java中的繼承允許一個子類繼承多個父類

  B) 父類更具有通用性,子類更具體

  C) Java中的繼承存在著傳遞性

  D) 當實例化子類時會遞歸調用父類中的構造方法

  6. 以下程序的運行結果是(D)

  class Person{

  public Person(){

  System.out.println(“this is a Person”);

  }

  }

  public class Teacher extends Person{

  private String name=”tom”;

  public Teacher(){

  System.out.println(“this is a teacher”);

  super();

  }

  public static void main(String[] args){

  Teacher teacher = new Teacher();

  System.out.println(this.name);

  }

  }

  A) this is a Person

  this is a teacher

  tom

  B) this is a teacher

  this is a Person

  tom

  C) 運行出錯

  D) 編譯有兩處錯誤

  7. 以下說法錯誤的是()

  A) super.方法()可以調用父類的所有非私有方法

  B) super()可以調用父類的所有非私有構造函數

  C) super.屬性可以調用父類的所有非私有屬性

  D) this和super關鍵字可以出現在同一個構造函數中

  8. 以下關于final關鍵字說法錯誤的是(A,C)(兩項)

  A) final是java中的修飾符,可以修飾類、接口、抽象類、方法和屬性

  B) final修飾的類肯定不能被繼承

  C) final修飾的方法不能被重載

  D) final修飾的變量不允許被再次賦值

  9. 訪問修飾符作用范圍由大到小是(D)

  A) private-default-protected-public

  B) public-default-protected-private

  C) private-protected-default-public

  D) public-protected-default-private

  10. 以下(D)不是Object類的方法

  A) clone()

  B) finalize()

  C) toString()

  D) hasNext()

  11. 多態(tài)的表現形式有(A)

  A) 重寫

  B) 抽象

  C) 繼承

  D) 封裝

  12. 以下對重載描述錯誤的是()

  A) 方法重載只能發(fā)生在一個類的內部

  B) 構造方法不能重載

  C) 重載要求方法名相同,參數列表不同

  D) 方法的返回值類型不是區(qū)分方法重載的條件

  13. 以下(D)添加到ComputerBook中不會出錯

  class Book{

  protected int getPrice(){

  return 30;

  }

  }

  public class ComputerBook extends Book{

  }

  A) protected float getPrice(){}

  B) protected int getPrice(int page){}

  C) int getPrice(){}

  D) public int getPrice(){return 10;}

  14. 以下對抽象類的描述正確的是(C)

  A) 抽象類沒有構造方法

  B) 抽象類必須提供抽象方法

  C) 有抽象方法的類一定是抽象類

  D) 抽象類可以通過new關鍵字直接實例化

  15. 以下對接口描述錯誤的有(D)

  A) 接口沒有提供構造方法

  B) 接口中的方法默認使用public、abstract修飾

  C) 接口中的屬性默認使用public、static、final修飾

  D) 接口不允許多繼承

  16. 以下代碼,描述正確的有(A)

  interface IDemo{

  public static final String name;1

  void print();2

  public void getInfo();3

  }

  abstract class Person implements IDemo{4

  public void print(){

  }

  }

  A) 第1行錯誤,沒有給變量賦值

  B) 第2行錯誤,方法沒有修飾符

  C) 第4行錯誤,沒有實現接口的全部方法

  D) 第3行錯誤,沒有方法的實現

  17. 接口和抽象類描述正確的有(B,C)(兩項)

  A) 抽象類沒有構造函數

  B) 接口沒有構造函數

  C) 抽象類不允許多繼承

  D) 接口中的方法可以有方法體

  18. 以下描述錯誤的有(C)

  A) abstract 可以修飾類、接口、方法

  B) abstract修飾的類主要用于被繼承

  C) abstract 可以修飾變量

  D) abstract修飾的類,其子類也可以是abstract修飾的

  19. 以下描述正確的有(B)

  A) 方法的重寫應用在一個類的內部

  B) 方法的重載與返回值類型無關

  C) 構造方法不能重載

  D) 構造方法可以重寫

  20. 以下程序運行結果是(A)

  public class Test extends Father{

  private String name=”test”;

  public static void main(String[] args){

  Test test = new Test();

  System.out.println(test.getName());

  }

  }

  class Father{

  private String name=”father”;

  public String getName() {

  return name;

  }

  }

  A) father

  B) test

  C) 編譯出錯

  D) 運行出錯,無輸出

  21. 以下對異常的描述不正確的有(C)

  A) 異常分為Error和Exception

  B) Throwable是所有異常類的父類

  C) Exception是所有異常類父類

  D) Exception包括RuntimeException和RuntimeException之外的異常

  22. 在try-catch-finally語句塊中,以下可以單獨與finally一起使用的是(B)

  A) catch

  B) try

  C) throws

  D) throw

  23. 下面代碼運行結果是(B)

  public class Demo{

  public int add(int a,int b){

  try{

  return a+b;

  }catch(Exception e){

  System.out.println(“catch 語句塊”);

  }finally{

  System.out.println(“finally 語句塊”);

  }

  return 0;

  }

  public static void main(String[] args){

  Demo demo = new Demo();

  System.out.println(“和是:”+demo.add(9,34));

  }

  }

  A) 編譯異常

  B) finally語句塊 和是:43

  C) 和是:43 finally語句塊

  D) catch語句塊 和是:43

  24. 以下描述不正確的有(D)

  A) try塊不可以省略

  B) 可以使用多重catch塊

  C) finally塊可以省略

  D) catch塊和finally塊可以同時省略

  25. 以下對自定義異常描述正確的是(C)

  A) 自定義異常必須繼承Exception

  B) 自定義異?梢岳^承自Error

  C) 自定義異?梢愿用鞔_定位異常出錯的位置和給出詳細出錯信息

  D) 程序中已經提供了豐富的異常類,使用自定義異常沒有意義

  26. 以下程序運行結果是(D)

  public class Test {

  public int div(int a, int b) {

  try {

  return a / b;

  }catch(Exception e){

  System.out.println(“Exception”);

  }catch(NullPointerException e){

  System.out.println(“ArithmeticException”);

  }

  catch (ArithmeticException e) {

  System.out.println(“ArithmeticException”);

  } finally {

  System.out.println(“finally”);

  }

  return 0;

  }

  public static void main(String[] args) {

  Test demo = new Test();

  System.out.println(“商是:” + demo.div(9, 0));

  }

  }

  A) Exception finally 商是:0

  B) ArithmeticException finally 商是:0

  C) finally商是:0

  D) 編譯報錯

  27. 以下對TCP和UDP描述正確的是(D)

  A) TCP不能提供數據的可靠性

  B) UDP能夠保證數據庫的可靠性

  C) TCP數據傳輸效率高于UDP

  D) UDP數據傳輸效率高于TCP

  28. 在Java中,下面對于構造函數的描述正確的是(D)。(選擇一項)

  A) 類必須顯示定義構造函數

  B) 構造函數的返回類型是void

  C) 構造函數和類有相同的名稱,并且不能帶任何參數

  D) 一個類可以定義多個構造函數

  29. 根據下面的代碼,

  String s = null;

  會拋出NullPointerException異常的有(A,C)。[兩項]

  A) if( (s!=null) & (s.length()>0) )

  B) if( (s!=null) & & (s.length()>0) )

  C) if( (s==null) | (s.length()==0) )

  D) if( (s==null) || (s.length()==0) )

  30. .在Java中,關于HashMap類的描述,以下廉潔錯誤的是( B )。

  A) HashMap使用鍵/值得形式保存數據

  B) HashMap 能夠保證其中元素的順序

  C) HashMap允許將null用作鍵

  D) HashMap允許將null用作值

  31. 下列選項中關于java中super關鍵字的說法錯誤的是( B )

  A) super關鍵字是在子類對象內部指代其父類對象的引用

  B) super關鍵字不僅可以指代子類的直接父類,還可以指代父類的父類

  C) 子類可以通過super關鍵字調用父類的方法

  D) 子類可以通過super關鍵字調用父類的屬性

  32. 在Java中,以下代碼( A )正確地創(chuàng)建了一個InputStreamReader對象。

  A) InuptStreamReader(new FileInputStream(“1.dat”));

  B) InuptStreamReader(new FileReader(“1.dat”));

  C) InuptStreamReader(new BufferReader(“1.dat”));

  D) InuptStreamReader (“1.dat”);

  33. 在Java中,( D )類提供定位本地文件系統(tǒng),對文件或目錄及其屬性進行基本操作。

  A) FileInputStream

  B) FileReader

  C) FileWriter

  D) File

  34. Java中的集合類包括ArrayList、LinkedList、HashMap等類,下列關于集合類描述錯誤的是(C)(選擇一項)

  A) ArrayList和LinkedList均實現了List接口

  B) ArrayList的訪問速度比LinkedList快

  C) 添加和刪除元素時,ArrayList的表現更佳

  D) HashMap實現Map接口,它允許任何類型的鍵和值對象,并允許將null用作鍵或值

  35. 在Java中開發(fā)JDBC應用程序時,使用DriverManager類的getConnection()方法

  建立與數據源的連接語句為:

  Connection con = DriverManager.getConnection(“jdbc:odbc:news”);

  URL連接中的”n ews”表示的是(C)(選擇一項)

  A) 數據庫中表的名稱

  B) 數據庫服務器的機器名

  C) 數據源的名稱

  D) 用戶名

  36. 在Java中,JDBCAPI定義了一組用于與數據庫進行通信的接口和類,它們包括在(B)包中。

  A) java.lang

  B) java.sql

  C) java.util

  D) java.math

  37. Java中,以下( B )接口以鍵_值對的方式存儲對象。

  A) java.util.Collection

  B) java.util.Map

  C) java.util.List

  D) java.util.Set

  38. 以下關于對象序列化描述正確的是( C,D )[兩項]

  A) 使用FileOutputStream可以將對象進行傳輸

  B) 使用PrintWriter可以將對象進行傳輸

  C) 使用ObjectOutputStream類完成對象存儲,使用ObjectInputStream類完成對象讀取

  D) 對象序列化的所屬類需要實現Serializable接口

  39. 在Java中,( A )類可用于創(chuàng)建鏈表數據結構的對象。

  A) LinkedList

  B) ArrayList

  C) Collection

  D) HashMap

  40. 分析下面這段Java代碼,它的運行結果是( C )。

  Import java.io.*;

  Public class B{

  Public static void main(string [] args){

  int i=12;

  System.out.println(i+=i-=i*=i);}}

  A) 100

  B) 0

  C) -120

  D) 程序無法編譯

  41. 使用JDBC事務的步驟是(C,A,B,D)(多選)

  A) 取消Connection的事務自動提交方式

  B) 發(fā)生異;貪L事務

  C) 獲取Connection對象

  D) 操作完畢提交事務

  42. 以下對JDBC事務描述錯誤的是( B )

  A) JDBC事務屬于JAVA事務的一種

  B) JDBC事務屬于容器事務類型

  C) JDBC事務可以保證操作的完整性和一致性

  D) JDBC事務是由Connection發(fā)起的,并由Connection控制

  43. 要通過可滾動的結果集更新數據,以下正確的是(A

  A) pst=con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE)

  B) pst=con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY)

  C) pst=con.prepareStatement(sql, Resu ltSet.TYPE_SCROLL_SENSITIVE)

  D) pst=con.prepareStatement(sql, ResultSet.CONCUR_UPDATABLE)

  44. 存儲過程pro有兩個參數,第一個為輸入參數,第二個為輸出參數,以下代碼正確的是(C)

  A) CallableStatement cst=con.prepareCall(“(call pro(?,?))”);

  B) CallableStatement cst=con.prepareCall(“(call pro(?))”);

  C) CallableStatement cst=con.prepareCall(“{call pro(?,?)}”);

  D) CallableStatement cst=con.prepareCall(“{call pro(?,?,?)}”);

  45. 以下描述正確的是(B)

  A) CallableStatement是PreparedStatement的父接口

  B) PreparedStatement是CallableStatement的父接口

  C) CallableStatement是Statement的子接口

  D) PreparedStatement是Statement的父接口

  46. 要刪除book表中書籍(bookName)是”java”的記錄,以下代碼正確的是(A

  String sql=” from book where bookName=?”;

  PreparedStatement pst=con.preparedStatement(sql);

  ______________________________

  pst.execute();

  A) pst.setString(1,”java”);

  B) pst.setString(0,”java”);

  C) pst.setInt(0,”java”);

  D) 以上選項都不正確

  47. 獲取ResutlSet對象rst的第一行數據,以下正確的是(B)

  A) rst.hashNext();

  B) rst.next();

  C) rst.first();

  D) rst.nextRow();

  48. 以下可以正確獲取結果集的有(AD)(多選)

  A) Statement sta=con.createStatement();

  ResultSet rst=sta.executeQuery(“select * from book”);

  B) Statement sta=con.createStatement(“select * from book”);

  ResultSet rst=sta.executeQuery();

  C) PreparedStatement pst=con.preparedStatement();

  ResultSet rst=pst.executeQuery(“select * from book”);

  D) PreparedStatement pst=con.preparedStatement(“select * from book”);

  ResultSet rst=pst.executeQuery();

  49. 以下負責建立與數據庫連接的是(D)

  A) Statement

  B) PreparedStatement

  C) ResultSet

  D) DriverManager

  50. 使用JDBC連接數據庫的順序是(B,A,D,C,E)(多選)

  A) 加載驅動

  B) 導入驅動包

  C) 發(fā)送并處理SQL語句

  D) 建立于數據庫的連接

  E 關閉連接

  二、簡答題(各5分,共25分)

  1、在java中如果聲明一個類為final,表示什么意思? (不計分)

  答:final是最終的意思,final可用于定義變量、方法和類但含義不同,聲明為final的類不能被繼承。

  1、父類的構造方法是否可以被子類覆蓋(重寫)?

  答:父類的構造方法不可以被子類覆蓋,因為父類和子類的類名是不可能一樣的。

  2、請講述String 和StringBuffer的區(qū)別。

  答:String 類所定義的對象是用于存放”長度固定”的字符串。

  StringBuffer類所定義的對象是用于存放”長度可變動”的字符串。

  3、如果有兩個類A、B(注意不是接口),你想同時使用這兩個類的功能,那么你會如何編寫這個C類呢?

  答:因為類A、B不是接口,所以是不可以直接繼承的,但可以將A、B類定義成父子類,那么C類就能實現A、B類的功能了。假如A為B的父類,B為C的父類,此時C就能實現A、B的功能。

  4、結合Java視頻Lesson5(多線程),分析sleep()和wait()方法的區(qū)別。

  答: Sleeping睡眠的意思 : sleep() 方法用來暫時中止執(zhí)行的線程。在睡眠后,線程將進入就緒狀態(tài)。

  waiting等待的意思: 如果調用了 wait() 方法,線程將處于等待狀態(tài)。用于在兩個或多個線程并發(fā)運行時。

  5、談談你對抽象類和接口的理解。

  答:定義抽象類的目的是提供可由其子類共享的一般形式、子類可以根據自身需要擴展抽象類、抽象類不能實例化、抽象方法沒有函數體、抽象方法必須在子類中給出具體實現。他使用extends來繼承。

  接口:一個接口允許一個類從幾個接口繼承而來,Java 程序一次只能繼承一個類但可以實現幾個接口,接口不能有任何具體的方法,接口也可用來定義可由類使用的一組常量。其實現方式是interface來實現。

  JAVA筆試題目及答案2

  1. 下面哪些是Thread類的方法()

  A start() B run() C exit() D getPriority()

  答案:ABD

  解析:看Java API docs吧:http://docs.oracle.com/javase/7/docs/api/,exit()是System類的方法,如System.exit(0)。

  2. 下面關于java.lang.Exception類的說法正確的是()

  A 繼承自Throwable B Serialable CD 不記得,反正不正確

  答案:A

  解析:Java異常的基類為java.lang.Throwable,java.lang.Error和java.lang.Exception繼承 Throwable,RuntimeException和其它的Exception等繼承Exception,具體的RuntimeException繼承RuntimeException。

  擴展:錯誤和異常的區(qū)別(Error vs Exception)

  1)java.lang.Error: Throwable的子類,用于標記嚴重錯誤。合理的應用程序不應該去try/catch這種錯誤。絕大多數的錯誤都是非正常的,就根本不該出現的。

  java.lang.Exception: Throwable的子類,用于指示一種合理的程序想去catch的條件。即它僅僅是一種程序運行條件,而非嚴重錯誤,并且鼓勵用戶程序去catch它。

  2) Error和RuntimeException 及其子類都是未檢查的異常(unchecked exceptions),而所有其他的Exception類都是檢查了的異常(checked exceptions).

  checked exceptions:通常是從一個可以恢復的程序中拋出來的,并且最好能夠從這種異常中使用程序恢復。比如FileNotFoundException, ParseException等。檢查了的異常發(fā)生在編譯階段,必須要使用try…catch(或者throws)否則編譯不通過。

  unchecked exceptions:通常是如果一切正常的話本不該發(fā)生的異常,但是的確發(fā)生了。發(fā)生在運行期,具有不確定性,主要是由于程序的邏輯問題所引起的。比如ArrayIndexOutOfBoundException, ClassCastException等。從語言本身的角度講,程序不該去catch這類異常,雖然能夠從諸如RuntimeException這樣的異常中catch并恢復,但是并不鼓勵終端程序員這么做,因為完全沒要必要。因為這類錯誤本身就是bug,應該被修復,出現此類錯誤時程序就應該立即停止執(zhí)行。因此,面對Errors和unchecked exceptions應該讓程序自動終止執(zhí)行,程序員不該做諸如try/catch這樣的事情,而是應該查明原因,修改代碼邏輯。

  RuntimeException:RuntimeException體系包括錯誤的類型轉換、數組越界訪問和試圖訪問空指針等等。

  處理RuntimeException的原則是:如果出現 RuntimeException,那么一定是程序員的錯誤。例如,可以通過檢查數組下標和數組邊界來避免數組越界訪問異常。其他(IOException等等)checked異常一般是外部錯誤,例如試圖從文件尾后讀取數據等,這并不是程序本身的錯誤,而是在應用環(huán)境中出現的外部錯誤。

  3. 下面程序的運行結果是()

  String str1 = "hello";

  String str2 = "he" + new String("llo");

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

  答案:false

  解析:因為str2中的llo是新申請的內存塊,而==判斷的是對象的地址而非值,所以不一樣。如果是String str2 = str1,那么就是true了。

  4.下列說法正確的有()

  A. class中的constructor不可省略

  B. constructor必須與class同名,但方法不能與class同名

  C.一個class只能定義一個constructor

  D. constructor在一個對象被new時執(zhí)行

  答案:D

  解析:這里可能會有誤區(qū),其實普通的類方法是可以和類名同名的,和構造方法唯一的區(qū)分就是,構造方法沒有返回值。

  5. 具體選項不記得,但用到的知識如下:

  String []a = new String[10];

  則:a[0]~a[9] = null

  a.length = 10

  如果是int []a = new int[10];

  則:a[0]~a[9] = 0

  a.length = 10

  6. 下面程序的運行結果:()

  public static void main(String args[]) {

  Thread t = new Thread() {

  public void run() {

  pong();

  }

  };

  t.run();

  System.out.print("ping");

  }

  static void pong() {

  System.out.print("pong");

  }

  A pingpong B pongping C pingpong和pongping都有可能 D 都不輸出

  答案:B

  解析:這里考的是Thread類中start()和run()方法的區(qū)別了。start()用來啟動一個線程,當調用start方法后,系統(tǒng)才會開啟一個新的線程,進而調用run()方法來執(zhí)行任務,而單獨的調用run()就跟調用普通方法是一樣的,已經失去線程的特性了。因此在啟動一個線程的時候一定要使用start()而不是run()。

  7. 下列屬于關系型數據庫的是()

  A. Oracle B MySql C IMS D MongoDB

  答案:AB

  解答:IMS(Information Management System)數據庫是IBM公司開發(fā)的兩種數據庫類型之一;

  一種是關系數據庫,典型代表產品:DB2;

  另一種則是層次數據庫,代表產品:IMS層次數據庫。

  非關系型數據庫有MongoDB、memcachedb、Redis等。

  8. GC線程是否為守護線程?()

  答案:是

  解析:線程分為守護線程和非守護線程(即用戶線程)。

  只要當前JVM實例中尚存在任何一個非守護線程沒有結束,守護線程就全部工作;只有當最后一個非守護線程結束時,守護線程隨著JVM一同結束工作。

  守護線程最典型的應用就是 GC (垃圾回收器)

  9. volatile關鍵字是否能保證線程安全?()

  答案:不能

  解析:volatile關鍵字用在多線程同步中,可保證讀取的可見性,JVM只是保證從主內存加載到線程工作內存的值是最新的讀取值,而非cache中。但多個線程對

  volatile的寫操作,無法保證線程安全。例如假如線程1,線程2 在進行read,load 操作中,發(fā)現主內存中count的值都是5,那么都會加載這個最新的值,在線程1堆count進行修改之后,會write到主內存中,主內存中的count變量就會變?yōu)?;線程2由于已經進行read,load操作,在進行運算之后,也會更新主內存count的變量值為6;導致兩個線程及時用volatile關鍵字修改之后,還是會存在并發(fā)的情況。

  10. 下列說法正確的是()

  A LinkedList繼承自List

  B AbstractSet繼承自Set

  C HashSet繼承自AbstractSet

  D WeakMap繼承自HashMap

  答案:AC

  解析:下面是一張下載的Java中的集合類型的繼承關系圖,一目了然。

  11. 存在使i + 1 < i的數嗎()

  答案:存在

  解析:如果i為int型,那么當i為int能表示的最大整數時,i+1就溢出變成負數了,此時不就

  擴展:存在使i > j || i <= j不成立的數嗎()

  答案:存在

  解析:比如Double.NaN或Float.NaN,感謝@BuilderQiu網友指出。

  12. 0.6332的數據類型是()

  A float B double C Float D Double

  答案:B

  解析:默認為double型,如果為float型需要加上f顯示說明,即0.6332f

  13. 下面哪個流類屬于面向字符的輸入流( )

  ABufferedWriter BFileInputStream CObjectInputStream D InputStreamReader

  答案:D

  解析:Java的IO操作中有面向字節(jié)(Byte)和面向字符(Character)兩種方式。

  面向字節(jié)的操作為以8位為單位對二進制的數據進行操作,對數據不進行轉換,這些類都是InputStream和OutputStream的子類。

  面向字符的操作為以字符為單位對數據進行操作,在讀的時候將二進制數據轉為字符,在寫的時候將字符轉為二進制數據,這些類都是Reader和Writer的子類。

  總結:以InputStream(輸入)/OutputStream(輸出)為后綴的是字節(jié)流;

  以Reader(輸入)/Writer(輸出)為后綴的是字符流。

  擴展:Java流類圖結構,一目了然,解決大部分選擇題:

  14. Java接口的修飾符可以為()

  A private B protected C final D abstract

  答案:CD

  解析:接口很重要,為了說明情況,這里稍微啰嗦點:

  (1)接口用于描述系統(tǒng)對外提供的所有服務,因此接口中的成員常量和方法都必須是公開(public)類型的,確保外部使用者能訪問它們;

 。2)接口僅僅描述系統(tǒng)能做什么,但不指明如何去做,所以接口中的方法都是抽象(abstract)方法;

  (3)接口不涉及和任何具體實例相關的細節(jié),因此接口沒有構造方法,不能被實例化,沒有實例變量,只有靜態(tài)(static)變量;

 。4)接口的中的變量是所有實現類共有的,既然共有,肯定是不變的東西,因為變化的東西也不能夠算共有。所以變量是不可變(final)類型,也就是常量了。

  (5)接口中不可以定義變量?如果接口可以定義變量,但是接口中的方法又都是抽象的,在接口中無法通過行為來修改屬性。有的人會說了,沒有關系,可以通過 實現接口的對象的行為來修改接口中的屬性。這當然沒有問題,但是考慮這樣的情況。如果接口 A 中有一個public 訪問權限的靜態(tài)變量 a。按照 Java 的語義,我們可以不通過實現接口的對象來訪問變量 a,通過 A.a = xxx; 就可以改變接口中的變量 a 的值了。正如抽象類中是可以這樣做的,那么實現接口 A 的所有對象也都會自動擁有這一改變后的 a 的值了,也就是說一個地方改變了 a,所有這些對象中 a 的值也都跟著變了。這和抽象類有什么區(qū)別呢,怎么體現接口更高的抽象級別呢,怎么體現接口提供的統(tǒng)一的協(xié)議呢,那還要接口這種抽象來做什么呢?所以接口中 不能出現變量,如果有變量,就和接口提供的統(tǒng)一的抽象這種思想是抵觸的。所以接口中的屬性必然是常量,只能讀不能改,這樣才能為實現接口的對象提供一個統(tǒng) 一的屬性。

  通俗的講,你認為是要變化的東西,就放在你自己的實現中,不能放在接口中去,接口只是對一類事物的屬性和行為更高層次的抽象。對修改關閉,對擴展(不同的實現 implements)開放,接口是對開閉原則的一種體現。

  所以:

  接口的方法默認是public abstract;

  接口中不可以定義變量即只能定義常量(加上final修飾就會變成常量)。所以接口的屬性默認是public static final 常量,且必須賦初值。

  注意:final和abstract不能同時出現。

  15. 不通過構造函數也能創(chuàng)建對象嗎()

  A 是 B 否

  答案:A

  解析:Java創(chuàng)建對象的幾種方式(重要):

  (1) 用new語句創(chuàng)建對象,這是最常見的創(chuàng)建對象的方法。

  (2) 運用反射手段,調用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法。

  (3) 調用對象的clone()方法。

  (4) 運用反序列化手段,調用java.io.ObjectInputStream對象的 readObject()方法。

  (1)和(2)都會明確的顯式的調用構造函數 ;(3)是在內存上對已有對象的影印,所以不會調用構造函數 ;(4)是從文件中還原類的對象,也不會調用構造函數。

  16. ArrayList list = new ArrayList(20);中的list擴充幾次()

  A 0 B 1 C 2 D 3

  答案:A

  解析:這里有點迷惑人,大家都知道默認ArrayList的長度是10個,所以如果你要往list里添加20個元素肯定要擴充一次(擴充為原來的1.5倍),但是這里顯示指明了需要多少空間,所以就一次性為你分配這么多空間,也就是不需要擴充了。

  17. 下面哪些是對稱加密算法()

  A DES B AES C DSA D RSA

  答案:AB

  解析:常用的對稱加密算法有:DES、3DES、RC2、RC4、AES

  常用的非對稱加密算法有:RSA、DSA、ECC

  使用單向散列函數的加密算法:MD5、SHA

  18.新建一個流對象,下面哪個選項的代碼是錯誤的?()

  A)new BufferedWriter(new FileWriter("a.txt"));

  B)new BufferedReader(new FileInputStream("a.dat"));

  C)new GZIPOutputStream(new FileOutputStream("a.zip"));

  D)new ObjectInputStream(new FileInputStream("a.dat"));

  答案:B

  解析:請記得13題的那個圖嗎?Reader只能用FileReader進行實例化。

  19. 下面程序能正常運行嗎()

  public class NULL {

  public static void haha(){

  System.out.println("haha");

  }

  public static void main(String[] args) {

  ((NULL)null).haha();

  }

  }

  答案:能正常運行

  解析:輸出為haha,因為null值可以強制轉換為任何java類類型,(String)null也是合法的。但null強制轉換后是無效對象,其返回值還是為null,而static方法的調用是和類名綁定的,不借助對象進行訪問所以能正確輸出。反過來,沒有static修飾就只能用對象進行訪問,使用null調用對象肯定會報空指針錯了。這里和C++很類似。這里感謝@Florian網友解答。

  20. 下面程序的運行結果是什么()

  class HelloA {

  public HelloA() {

  System.out.println("HelloA");

  }

  { System.out.println("Im A class"); }

  static { System.out.println("static A"); }

  }

  public class HelloB extends HelloA {

  public HelloB() {

  System.out.println("HelloB");

  }

  { System.out.println("Im B class"); }

  static { System.out.println("static B"); }

  public static void main(String[] args) {

  new HelloB();

  }

  }

  答案:

  static A

  static B

  Im A class

  HelloA

  Im B class

  HelloB

  解析:說實話我覺得這題很好,考查靜態(tài)語句塊、構造語句塊(就是只有大括號的那塊)以及構造函數的執(zhí)行順序。

  對象的初始化順序:(1)類加載之后,按從上到下(從父類到子類)執(zhí)行被static修飾的語句;(2)當static語句執(zhí)行完之后,再執(zhí)行main方法;(3)如果有語句new了自身的對象,將從上到下執(zhí)行構造代碼塊、構造器(兩者可以說綁定在一起)。

  下面稍微修改下上面的代碼,以便更清晰的說明情況:

  View Code

  此時輸出結果為:

  static A

  static B

  -------main start-------

  Im A class

  HelloA

  Im B class

  HelloB

  Im A class

  HelloA

  Im B class

  HelloB

  -------main end-------

  21.getCustomerInfo()方法如下,try中可以捕獲三種類型的異常,如果在該方法運行中產生了一個IOException,將會輸出什么結果()

  public void getCustomerInfo() {

  try {

  // do something that may cause an Exception

  } catch (java.io.FileNotFoundException ex) {

  System.out.print("FileNotFoundException!");

  } catch (java.io.IOException ex) {

  System.out.print("IOException!");

  } catch (java.lang.Exception ex) {

  System.out.print("Exception!");

  }

  }

  AIOException!

  BIOException!Exception!

  CFileNotFoundException!IOException!

  DFileNotFoundException!IOException!Exception!

  答案:A

  解析:考察多個catch語句塊的執(zhí)行順序。當用多個catch語句時,catch語句塊在次序上有先后之分。從最前面的catch語句塊依次先后進行異常類型匹配,這樣如果父異常在子異常類之前,那么首先匹配的將是父異常類,子異常類將不會獲得匹配的機會,也即子異常類型所在的catch語句塊將是不可到達的語句。所以,一般將父類異常類即Exception老大放在catch語句塊的最后一個。

  22. 下面代碼的運行結果為:()

  import java.io.*;

  import java.util.*;

  public class foo{

  public static void main (String[] args){

  String s;

  System.out.println("s=" + s);

  }

  }

  A代碼得到編譯,并輸出“s=”

  B代碼得到編譯,并輸出“s=null”

  C由于String s沒有初始化,代碼不能編譯通過

  D代碼得到編譯,但捕獲到NullPointException異常

  答案:C

  解析:開始以為會輸出null什么的,運行后才發(fā)現Java中所有定義的基本類型或對象都必須初始化才能輸出值。

  23. System.out.println("5" + 2);的輸出結果應該是()。

  A52 B7 C2 D5

  答案:A

  解析:沒啥好說的,Java會自動將2轉換為字符串。

  24.指出下列程序運行的結果()

  public class Example {

  String str = new String("good");

  char[] ch = { a, b, c };

  public static void main(String args[]) {

  Example ex = new Example();

  ex.change(ex.str, ex.ch);

  System.out.print(ex.str + " and ");

  System.out.print(ex.ch);

  }

  public void change(String str, char ch[]) {

  str = "test ok";

  ch[0] = g;

  }

  }

  A、good and abc

  B、good and gbc

  C、test ok and abc

  D、test ok and gbc

  答案:B

  解析:大家可能以為Java中String和數組都是對象所以肯定是對象引用,然后就會選D,其實這是個很大的誤區(qū):因為在java里沒有引用傳遞,只有值傳遞

  這個值指的是實參的地址的拷貝,得到這個拷貝地址后,你可以通過它修改這個地址的內容(引用不變),因為此時這個內容的地址和原地址是同一地址,

  但是你不能改變這個地址本身使其重新引用其它的對象,也就是值傳遞,可能說的不是很清楚,下面給出一個完整的能說明情況的例子吧:

  View Code

  程序有些啰嗦,但能反映問題,該程序運行結果為:

  對象交換前:p1 = Alexia female

  對象交換前:p2 = Edward male

  對象交換后:p1 = Alexia female

  對象交換后:p2 = Edward male

  對象數組交換前:arraya[0] = Alexia female, arraya[1] = Edward male

  對象數組交換前:arrayb[0] = jmwang female, arrayb[1] = hwu male

  對象數組交換后:arraya[0] = Alexia female, arraya[1] = Edward male

  對象數組交換后:arrayb[0] = jmwang female, arrayb[1] = hwu male

  基本類型數組交換前:a[0] = 0, a[1] = 1

  基本類型數組交換前:b[0] = 1, b[1] = 2

  基本類型數組交換后:a[0] = 0, a[1] = 1

  基本類型數組交換后:b[0] = 1, b[1] = 2

  對象數組內容交換并改變后:arraya[1] = wjl male

  對象數組內容交換并改變后:arrayb[1] = Edward male

  基本類型數組內容交換并改變后:a[1] = 5

  基本類型數組內容交換并改變后:b[1] = 1

  說明:不管是對象、基本類型還是對象數組、基本類型數組,在函數中都不能改變其實際地址但能改變其中的內容。

  25.要從文件"file.dat"中讀出第10個字節(jié)到變量c中,下列哪個方法適合?()

  AFileInputStream in=new FileInputStream("file.dat"); in.skip(9); int c=in.read();

  BFileInputStream in=new FileInputStream("file.dat"); in.skip(10); int c=in.read();

  CFileInputStream in=new FileInputStream("file.dat"); int c=in.read();

  DRandomAccessFile in=new RandomAccessFile("file.dat"); in.skip(9); int c=in.readByte();

  答案:A?D?

  解析:long skip(long n)作用是跳過n個字節(jié)不讀,主要用在包裝流中的,因為一般流(如FileInputStream)只能順序一個一個的讀不能跳躍讀,但是包裝流可以用skip方法跳躍讀取。那么什么是包裝流呢?各種字節(jié)節(jié)點流類,它們都只具有讀寫字節(jié)內容的方法,以FileInputStream與FileOutputStream為例,它們只能在文件中讀取或者向文件中寫入字節(jié),在實際應用中我們往往需要在文件中讀取或者寫入各種類型的數據,就必須先將其他類型的數據轉換成字節(jié)數組后寫入文件,或者從文件中讀取到的字節(jié)數組轉換成其他數據類型,想想都很麻煩!因此想通過FileOutputStream將一個浮點小數寫入到文件中或將一個整數寫入到文件時是非常困難的。這時就需要包裝類DataInputStream/DataOutputStream,它提供了往各種輸入輸出流對象中讀入或寫入各種類型的數據的方法。

  DataInputStream/DataOutputStream并沒有對應到任何具體的流設備,一定要給它傳遞一個對應具體流設備的輸入或輸出流對象,完成類似DataInputStream/DataOutputStream功能的類就是一個包裝類,也叫過濾流類或處理流類。它對InputOutStream/OutputStream流類進行了包裝,使編程人員使用起來更方便。其中DataInputStream包裝類的構造函數語法:public DataInputStream(InputStream in)。包裝類也可以包裝另外一個包裝類。

  首先BC肯定 是錯的,那A正確嗎?按上面的解析應該也不對,但我試了下,發(fā)現A也是正確的,與網上解析的資料有些出入,下面是我的code:

  View Code

  那么D呢,RandomAccessFile是IO包的類,但是其自成一派,從Object直接繼承而來?梢詫ξ募M行讀取和寫入。支持文件的隨機訪問,即可以隨機讀取文件中的某個位置內容,這么說RandomAccessFile肯定可以達到題目的要求,但是選項有些錯誤,比如RandomAccessFile的初始化是兩個參數而非一個參數,采用的跳躍讀取方法是skipBytes()而非skip(),即正確的寫法是:

  RandomAccessFile in = new RandomAccessFile("file.dat", "r");

  in.skipBytes(9);

  int c = in.readByte();

  這樣也能讀到第十個字節(jié),也就是A和D都能讀到第十個字節(jié),那么到底該選哪個呢?A和D有啥不同嗎?求大神解答~~~

  26.下列哪種異 常是檢查型異常,需要在編寫程序時聲明()

  ANullPointerException BClassCastException CFileNotFoundException D IndexOutOfBoundsException

  答案:C

  解析:看第2題的解析。

  27. 下面的方法,當輸入為2的時候返回值是多少?()

  public static int getValue(int i) {

  int result = 0;

  switch (i) {

  case 1:

  result = result + i;

  case 2:

  result = result + i * 2;

  case 3:

  result = result + i * 3;

  }

  return result;

  }

  A0 B2 C4 D10

  答案:D

  解析:注意這里case后面沒有加break,所以從case 2開始一直往下運行。

  28.選項中哪一行代碼可以替換題目中//add code here而不產生編譯錯誤?()

  public abstract class MyClass {

  public int constInt = 5;

  //add code here

  public void method() {

  }

  }

  Apublic abstract void method(int a);

  B constInt = constInt + 5;

  Cpublic int method();

  Dpublic abstract void anotherMethod() {}

  答案:A

  解析:考察抽象類的使用。

  抽象類遵循的原則:

 。1)abstract關鍵字只能修飾類和方法,不能修飾字段。

 。2)抽象類不能被實例化(無法使用new關鍵字創(chuàng)建對象實例),只能被繼承。

  (3)抽象類可以包含屬性,方法,構造方法,初始化塊,內部類,枚舉類,和普通類一樣,普通方法一定要實現,變量可以初始化或不初始化但不能初始化后在抽象類中重新賦值或操作該變量(只能在子類中改變該變量)。

 。4)抽象類中的抽象方法(加了abstract關鍵字的方法)不能實現。

 。5)含有抽象方法的類必須定義成抽象類。

  擴展:抽象類和接口的區(qū)別,做個總結吧:

  (1)接口是公開的,里面不能有私有的方法或變量,是用于讓別人使用的,而抽象類是可以有私有方法或私有變量的。

  (2)abstract class 在 Java 語言中表示的是一種繼承關系,一個類只能使用一次繼承關系。但是,一個類卻可以實現多個interface,實現多重繼承。接口還有標識(里面沒有任何方法,如Remote接口)和數據共享(里面的變量全是常量)的作用。

 。3)在abstract class 中可以有自己的數據成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態(tài)的不能被修改的數據成員(也就是必須是 static final的,不過在 interface中一般不定義數據成員),所有的成員方法默認都是 public abstract 類型的。

 。4)abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"is-a"關系,interface表示的是"has-a"關系。

 。5)實現接口的一定要實現接口里定義的所有方法,而實現抽象類可以有選擇地重寫需要用到的方法,一般的應用里,最頂級的是接口,然后是抽象類實現接口,最后才到具體類實現。抽象類中可以有非抽象方法。接口中則不能有實現方法。

  (6)接口中定義的變量默認是public static final 型,且必須給其初值,所以實現類中不能重新定義,也不能改變其值。抽象類中的變量默認是 friendly 型,其值可以在子類中重新定義,也可以在子類中重新賦值。

  29. 閱讀Shape和Circle兩個類的定義。在序列化一個Circle的對象circle到文件時,下面哪個字段會被保存到文件中?( )

  class Shape {

  public String name;

  }

  class Circle extends Shape implements Serializable{

  private float radius;

  transient int color;

  public static String type = "Circle";

  }

  Aname

  Bradius

  Ccolor

  Dtype

  答案:B

  解析:這里有詳細的解釋:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html

  30.下面是People和Child類的定義和構造方法,每個構造方法都輸出編號。在執(zhí)行new Child("mike")的時候都有哪些構造方法被順序調用?請選擇輸出結果( )

  class People {

  String name;

  public People() {

  System.out.print(1);

  }

  public People(String name) {

  System.out.print(2);

  this.name = name;

  }

  }

  class Child extends People {

  People father;

  public Child(String name) {

  System.out.print(3);

  this.name = name;

  father = new People(name + ":F");

  }

  public Child() {

  System.out.print(4);

  }

  }

  A312 B 32 C 432 D 132

  答案:D

  解析:考察的又是父類與子類的構造函數調用次序。在Java中,子類的構造過程中必須調用其父類的構造函數,是因為有繼承關系存在時,子類要把父類的內容繼承下來。但如果父類有多個構造函數時,該如何選擇調用呢?

  第一個規(guī)則:子類的構造過程中,必須調用其父類的構造方法。一個類,如果我們不寫構造方法,那么編譯器會幫我們加上一個默認的構造方法(就是沒有參數的構造方法),但是如果你自己寫了構造方法,那么編譯器就不會給你添加了,所以有時候當你new一個子類對象的時候,肯定調用了子類的構造方法,但是如果在子類構造方法中我們并沒有顯示的調用基類的構造方法,如:super();這樣就會調用父類沒有參數的構造方法。

  第二個規(guī)則:如果子類的構造方法中既沒有顯示的調用基類構造方法,而基類中又沒有無參的構造方法,則編譯出錯,所以,通常我們需要顯示的:super(參數列表),來調用父類有參數的構造函數,此時無參的構造函數就不會被調用。

  JAVA筆試題目及答案3

  一、單選題

  1.下列哪一種敘述是正確的(D)

  A.abstract修飾符可修飾字段、方法和類

  B. 抽象方法的body部分必須用一對大括號{ }包住

  C. 聲明抽象方法,大括號可有可無

  D.聲明抽象方法不可寫出大括號

  2.如下代碼

  public class Test {

  public int aMethod() {

  static int i = 0;

  i++;

  return i;

  }

  public static void main (String args[]) {

  Test test = new Test();

  test.aMethod();

  int j = test.aMethod();

  System.out.println(j);

  }

  }

  輸出結果是什么?D

  A. 0 B. 1 C. 2 D.編譯失敗

  附:static用來修飾全局變量,不能修飾局部變量

  3.下列哪種說法是正確的(D)

  A. 實例方法可直接調用超類的實例方法

  B. 實例方法可直接調用超類的類方法

  C. 實例方法可直接調用其他類的實例方法

  D.實例方法可直接調用本類的類方法

  4.如下代碼:

  class Super {

  publicIntegergetLenght() { return new Integer(4); }

  }

  public class Sub extends Super {

  publicLonggetLenght() { return new Long(5); }

  public static void main(String[] args) {

  Super sooper = new Super();

  Sub sub = new Sub();

  System.out.println(sooper.getLenght().toString() + “,” +

  sub.getLenght().toString() );

  }

  }

  輸出是什么E

  A. 4,4 B. 4,5 C. 5,4 D. 5,5 E.編譯失敗.

  附:方法重寫不能改變返回值類型

  5.在Servlet處理請求的方式為:C

  A.以進程的方式 B.以程序的方式 C.以線程的方式 D.以響應的方式

  6.JDBC中,用于表示數據庫連接的對象是:B

  A.Statement B.Connection C.DriverManager D.PreparedStatement

  7.用于調用存儲過程的對象是:C

  A.ResultSet B.DriverManager C.CallableStatemet D.PreparedStatement

  8.按照MVC設計模式,JSP用于實現:B

  A.Model B.View C.Controller D.容器

  9.如下代碼

  10. public Object m() {

  11. Object o = new Float(3.14F);

  12. Object [] oa = new Object[1];

  13. oa[0] = o;

  14. o = null;

  15. oa[0] = null;

  16. print ‘return 0’;

  17. }

  當Float對象在第11行被創(chuàng)建后, 什么時候能夠被垃圾回收C

  A. 13行以后. B. 14行以后. C. 15行以后. D. 16行以后.

  附:當引用變量置為null時,它將變得無法訪問,因此符合垃圾回收條件

  10.如下代碼:

  class Base {

  Base() { System.out.print(“Base”); }

  }

  public class Alpha extends Base {

  public static void main( String[] args ) {

  new Alpha();-----調用父類無參的構造方法

  new Base();

  }

  }

  結果是什么B

  A. Base B. BaseBase C. 編譯失敗. D. 代碼運行但沒有輸出. E. 運行時拋出異常

  附:對象初始化會先走父類構造方法,在走自己的構造方法

  11.在J2EE中屬于Web層的組件有:A

  A.Servlet B.EJB C.Applet D.HTML

  12.在Servlet的生命周期中,容器只調用一次的方法是:C

  A.service B.getServletConfig C.init D.destroy

  13.以下關于異常的說法正確的是:D

 。.一旦出現異常,程序運行就終止了

  B.如果一個方法申明將拋出某個異常,它就必須真的拋出那個異常

 。.在catch子句中匹配特別是一種精確匹配

 。.可能拋出系統(tǒng)異常的方法是不需要申明異常的

  14.如下代碼:

  public class Foo {

  public static void main(String[] args) {

  try {

  return;

  } finally {

  System.out.println( “Finally” );

  }

  }

  }

  輸出結果是什么A

  A. Finally B.編譯失敗 C. 代碼正常運行但沒有任何輸出. D. 運行時拋出異常

  附:無論是否拋出異常,finally代碼塊總是會被執(zhí)行,主要用于java一些后續(xù)處理

  15.jsp指令中isELIgnored="boolean"的意思是(C)

  A.決定是否實現Servler的單線程模式,

  B.決定改頁面是否是一個錯誤處理頁面,

  C.決定是否支持EL表示,

  D.沒有具體的含義。

  附:在isELIgnored="true"時輸出為${2000 % 20},而isELIgnored="false"時輸出為100。Web容器默認isELIgnored="false"。

  16.下面關于Java的引用,說法正確的是:B

 。.應用實際上就是指針

  B.應用本身是Primitive

 。.引用就是對象本身

  D.一個對象只能被一個引用所指引

  附:primitive主數據類型,也稱之其為基本數據類型,

  還有一種為引用數據類型:引用數據類型,顧名思義就是:“引用”,當一個對象賦值給一個引用變量時,那么,則表明這個引用變量是指向這個對象的;一個對象可以有多個引用;一個引用同一時刻,則只能指向一個對象;

  17.對于import java.util包,以下那種說法是錯誤的**?C**

  A. Vector類屬于java.util包

 。. Vector類放在…/java/util/目錄下

 。. Vector類放在java.util文件中

 。. Vector類是Sun公司的產品

  18.在一個線程中Sleep(1000)方法,將使得該線程在多少時間后獲得對CPU的控制(假設睡眠過程中不會有其他事件喚醒該線程)?C

 。.正好1000毫秒。. 1000毫秒不到。. >=1000毫秒 D.不一定

  附:在程序sleep之后線程進入就緒態(tài),在這種狀態(tài)下,需要檢查現在是否有資源允許現在的線程繼續(xù)運行,如果條件不滿足,則需要等待。如果是現在有資源則立即執(zhí)行。

  19.在WEB-INF目錄下,必須存放的文件為:B

  A.class文件 B.web.xml C.jar文件 D.html文件

  20.下面關于垃圾收集的說法正確的是:D

 。.一旦一個對象成為垃圾,就立刻被收集掉。

  B.對象空間被收集掉之后,會執(zhí)行該對象的finalize方法

 。. finalize方法和C++的析構函數是完全一回事情

 。.一個對象成為垃圾是因為不再有引用指著它,但是線程并非如此。

  21.下面的語句會產生什么樣的輸出A

  System.out.println(4&7);

  A.4 B.5 C.6 D.7 E.0

  附:& 既是位運算符又是邏輯運算符,&的兩側可以是int,也可以是boolean表達式,當&兩側是int時,要先把運算符兩側的數轉化為二進制數再進行運算,4的二進制為100(前面的0省略),7的二進制為111,即100 & 111 = 100,在計算機中1表示真,0表示假,最左邊一位1&1=1,最右邊一位0&1=0,所以輸出4

  22.下面的程序中,temp的最終值是什么?B

  long temp=(int)3.9;

  temp%=2;

  A .0 B .1 C .2 D .3 E .4

  附:浮點型強轉int會丟失精度,所以前面的(int)3.9 會等于3,后面的temp%=2后temp=1;

  23.下面哪個不是JAVA關鍵字A

  Ainteger B double C float D default

  24.Which method is used by aServletto place its session ID in a URL that is written to the servlet’s response output streamB

  A. The encodeURL method of the HttpServletRequest interface.

  B. The encodeURL method of the HttpServletResponse interface.

  C. The rewriteURL method of the HttpServletRequest interface.

  D. The rewriteURL method of the HttpServletResponse interface.

  25.每個使用Swing構件的程序必須有一個**( ). D**

  A.按鈕 B.標簽 C.菜單 D.容器

  26.下列標識符(名字)命名原則中,正確的是**( ) D**

  A.類名的首字母小寫 B.變量和方法名的首寫字母大寫 C.接口名的首寫字母小寫 D.常量完全大寫

  27.類Test1定義如下:

  1.public class Test1{

  2.public float aMethod(float a,float b){return 0;}

  3.

  4.}

  將以下哪種方法插入行3是不合法的。(B)

  A、public float aMethod(float a,float b,float c){return 0;}

  B、public float aMethod(float c,float d){return 0;}

  C、public int aMethod(int a,int b){return 0;}

  D、private float aMethod(int a,int b,int c){return 0;}

  28.哪個語句創(chuàng)建了一個數組實例**?A**

  A. int[] ia = new int [15];

  B. float fa = new float [20];

  C. char[] ca = “Some String”;

  D. int ia [][] = {4, 5, 6} {1, 2, 3};

  附:B不是一個數租,應該返回float[] ,C中是字符串應該返回String,D是二維數租,正確寫法int[][] ia = {{4, 5, 6}, {1, 2, 3}};

  29.以public修飾的類如:public class Car{…}則Car() A

  A、可被其它程序包中的類使用

  B、僅能被本程序包中的類使用

  C、不能被任意其它類使用

  D、不能被其它類繼承

  30.下列哪個屬于容器型構件() C

  A .JEditB.JButton C.JPanel D.JTextField

  31.Java程序的執(zhí)行過程中用到一套JDK工具,其中java.exe是指( )B

  A.Java文檔生成器 B.Java解釋器 C.Java編譯器 D.Java類分解器

  32.下列關于構造方法的敘述中,錯誤的是**( ) C**

  A. Java語言規(guī)定構造方法名與類名必須相同

  B. Java語言規(guī)定構造方法沒有返回值,但不用vold聲明

  C. Java語言規(guī)定構造方法不可以重載

  D. Java語言規(guī)定構造方法只能通過new自動調用

  33.構造函數何時被調用() B

  A.類定義時 B.創(chuàng)建對象時 C.調用對象方法時 D.使用對象的變量時

  34.break語句**( ) D**

  A、只中斷最內層的循環(huán)B、只中斷最外層的循環(huán)

  C、借助于標號,可以實現任何外層循環(huán)中斷D、只中斷某一層的循環(huán)

  35.Java語言中下面哪個可以用作正確的變量名稱**()B**

  A、3DB、nameC、extendsD、implements

  附:Java 中的變量名不能以數字開頭。不能是關鍵字

  36.在JavaScript中如何驗證一個數據是否是數字(D)

  A.如果用Integer.parseInt(value)有誤就不是數字

  B.int I = value若報錯就不是數字,

  C.沒有方法驗證

  D.利用isNaN(value)返回的boolean進行判斷

  附:返回一個Boolean 值,指明提供的值是否是保留值NaN(不是數字)。

  37.下面哪一個不能作JSP的服務器(D)

  A. IBM WebSphereB. BEA WebLogic C. TomcatD. pws

  38.下面哪項不是JSP操作指令(D)

  A. getPropertyB. forward

  C. includeD. import

  39.如果希望控件在界面上按表格行分列排列,應使用下列那種布局管理器?( B)

  A、BoxLayoutB、GridLayoutC、BorderLayoutD、FlowLouLayout

  40.下面哪一項不是Java類訪問控制關鍵字(C)

  A. public B. protected C. this D. private

  41.在配置tomcat虛擬目錄時,需要打開哪個文件?(C )

  A. index.jsp B. web.xml C.server.xml D.以上都不是

  42.下面哪個不是表單標記(D)

  A. INPUT B.RADIO C.CHECKBOX D. TR

  43.下面哪項不是response對象的方法(C)

  A. setContentType(String contentTypestr)

  B. setHeader(String headername,String headervalue)

  C. getParameter(String str)

  D. sendError(int errorcode)

  44.以下(B)是編寫Servlet必須導入的包.

  A.java.sql.* B.java.servlet.* C.java.util.* D.java.lang.*

  45.下面哪項不屬于SQL語句的子類(D)

  A.數據定義語言(DDL)

  B.數據查詢語言(DQL)

  C.事務控制語言(TCL)

  D.數據插入語言(DIL)

  46.選出所有正確的答案

  public class Outer{

  public void someOuterMethod() {

  // Line 3

  }

  public class Inner{}

  public static void main( String[]argv ) {

  Outer o = new Outer();

  // Line 8

  }

  }

  Which instantiates an instance of InnerA

  A. new Inner(); // At line 3

  B. new Inner(); // At line 8

  C. new o.Inner(); // At line 8

  D. new Outer.Inner(); // At line 8

  二、多選題

  1.下列屬于jsp中注釋的有(AD)

  A.<%–與--%>

  B./

  C./**與**/

  D.

  2.按照學生平均成績(avg_grade) 將students表中的數據檢索出來,下面SQL語句正確的是(ACD)

  A) SELECT * FROM students ORDER BY avg_grade

  B) SELECT * FROM students GROUP BY avg_grade ASC

  C) SELECT * FROM students ORDER BY avg_grade DESC

  D) SELECT * FROM students ORDER by avg_grade asc

  3.下列是jsp作用域的通信對象的有(ABC)

  A.Session

  B.application

  C.pageContext

  D.cookie

  4.在接口中以下哪條定義是正確的 (AB)

  A. void methoda();

  B. public double methoda();

  C. public final double methoda();

  D. static void methoda(double d1);

  E. protected void methoda(double d1);

  附:接口中的方法會被隱式的指定為public abstract(只能是 public abstract,其他修飾符都會報錯)。

  接口中的變量會被隱式的指定為public static final變量(并且只能是 public,用 private 修飾會報編譯錯誤。)

  5.下面哪個語句正確地聲明一個整型的二維數組?CDE

  A.int a[][] = new int[][];

  B.int a[10][10] = new int[][];

  C.int a[][] = new int[10][10];

  D.int [][]a = new int[10][10];

  E.int []a[] = new int[10][10];

  6.下面哪些不是java的簡單數據類型BC

  A. short B. Boolean C. Double D. float

  7.下面哪些語句能夠正確地生成5個空字符串?AB

  A.String a[]=new String[5];for(int i=0;i<5;a[i++]=“”);

  B.String a[]={“”,“”,“”,“”,“”};

  C.String a[5];

  D.String[5]a;

  E.String []a=new String[5];for(int i=0;i<5;a[i++]=null);

  8.下列說法錯誤的有(BCD)

  A. 數組是一種對象

  B. 數組屬于一種原生類

  C.int number=[]={31,23,33,43,35,63}

  D. 數組的大小可以任意改變

  9.不能用來修飾interface的有(ACD)

  A.privateB.publicC.protectedD.static

  10.下列說法錯誤的有(ACD)

  A. 在類方法中可用this來調用本類的類方法

  B. 在類方法中調用本類的類方法時可直接調用

  C. 在類方法中只能調用本類中的類方法

  D. 在類方法中絕對不能調用實例方法

  11.如下代碼

  class A {

  A() { }

  }

  class B extends A {

  }

  哪兩個說明是正確的?BD

  A. B類的構造器應該是public.

  B. B類的構造器應該是沒有參數

  C. B類的構造器應該調用this().

  D. B類的構造器應該調用super().

  附:默認構造器的修飾符只跟當前類的修飾符有關

  12.下列標識符不合法的有(ACD)

  A.new B.$Usdollars C.1234 D.car.taxi

  13.以下哪四個能使用throw拋出ADEF

  A. Error

  B. Event

  C. Object

  D. Throwable

  E. Exception

  F. RuntimeException

  14.javax.Servlet的包中,屬于類的是:BC

  A.Servlet

  B.GenericServlet

  C.ServletException

  D.ServletContext

  15.如下代碼:

  public class X {

  public X aMethod() { return this;}

  }

  public class Y extends X {

  }

  哪兩個方法能加到Y類的定義中CE

  A. public void aMethod() {}

  B. private void aMethod() {}

  C. public void aMethod(String s) {

  D. private Y aMethod() { return null; }

  E. public X aMethod() { return new Y(); }

  16.對該段代碼描述正確的有<% int="" i="Integer.parseInt(request.getParemeter(“value”))">(BDC)

  B. <%=>

  C. <%=>

  D.

  E.

  F.

  G.

  18.下面哪三個描述是正確的?BCE

  A. 默認構造器初始化方法變量

  B. 默認構造器有和它所在類相同的訪問修飾詞.

  C. 默認構造器調用其父類的無參構造器.

  D. 如果一個類沒有無參構造器,編譯器會它創(chuàng)建一個默認構造器.

  E. 只有當一個類沒有任何構造器時,編譯器會為它創(chuàng)建一個默認構造器

  19.哪二種聲明防止方法覆蓋?AD

  A、final void methoda() {}

  B、void final methoda() {}

  C、static void methoda() {}

  D、static final void methoda() {}

  E、final abstract void methoda() {}

  JAVA筆試題目及答案4

  一、單選題

  以下哪個不是SpringBoot默認支持自動裝配的?(A)

  A.spring-boot-starter-web

  Bspring-boot-starter-data-redis

  C spring-boot-starter-security

  D mybatis spring-boot-starter

  Spring中Bean的作用域不包括(D)

  A、singleton

  B、prototype

  C、session

  D. application

  關系數據庫中,實現表與表之間的聯系是通過。(B)

  A、實體完整性規(guī)

  B、參照完整性規(guī)則

  C.用戶自定義的完整性

  D、值域

  當Redis作為數據庫時,與Spring Boot整合使用的相關說明,正確的是(A)

  A. @RedisHash("persons )用于指定操作實體類對象在Redis數據庫中的存儲空間

  B. @ld用于標識實體類主鍵,需要手動指定id生成策略

  C.使用Redis數據庫,必須為實體類屬性添加@Indexed屬性生成二級索引

  D編寫操作Redis數據庫的Repostory接口文件時,需要繼承JpaRepository 接口

  哪個關鍵字可以對對象加互斥鎖。(B)

  A, serialize

  B, synichronized

  C, transient

  D, static

  算法的確定性特征,以下不符合算法確定性的是:(D)

  A. D- (B*B-4*A*C)

  B. S- (L*H)/ 10

  C.輸入:X

  D.輸出: L/正整數

  下列SpringMVC中用到的注解錯誤的一項。(A)

  A @RequestMapping來指定請求的url,只能寫在方法上

  B @GetMappgin表示只能接收GET方式提交的請求

  C @PostMapping表示只能接收POST方式提交的請求

  D @RestController是個組合注解, 包括@Controller和@ResponseBody

  Spring支持的事務功能包括(C)

  A,事務的傳播行為

  B,事務回滾

  C,全部選項

  D,事務的隔離級別

  下列哪種操作,最容易產生MySQL數據庫的鎖等待(C)

  A、.執(zhí)行 fromtwhere id> n (刪除數百萬行)

  B、執(zhí)行alter table對一個1000萬行記錄的表刪除索引

  C、執(zhí)行alter table對一個1000萬行記錄的表增加列

  D、執(zhí)行alter table對一個1000萬行記錄的表增加索引

  下列( B) 不屬于MyBatis全局配置文件中的標簽

  A. settings

  B. select

  C. plugins

  D. properties

  以下數據庫事務的隔離級別中哪一個有不可重復讀,幻讀(D)

  A,讀取未提交內容(Read Uncommited)

  B,讀取提交內容(Read Committed)

  C,可重復讀(Repeatable Read)

  D,可串行化(Serializable)

  以下哪個不是SpringBoot默認支持自動裝配的? (B )

  A spring-boot starter-web

  B spring -boot starter-data-redis

  C spring-boot- starter-security

  D mybatis spring boot starter

  下列語句哪一個正確(B )

  A. Java程序經編譯后會產生machine code

  B、Java程序經編譯后會產生byte code

  C. Java程序經編譯后會產生DLL

  D.以上都不正確

  下面對Spring框架的持久化支持說法錯誤的是(C)

  A Spring沒有自己的持久化方案,它集合了現有的流行持久化框架

  B Spring采用JDBC模板封裝了JDBC的數據庫操作

  C Spring對各種持久化技術提供了統(tǒng)一的編程方式

  D Spring將數據庫訪問的checked異常轉換為運行時異常

  標記關于Spring核心容器,說法錯誤的是?(A)

  A: Spring框架的所有功能都是通過其核心容器來實現的。

  B:創(chuàng)建BeanFactory實例時,需要提供Spring所管理容器的詳細配置信息,這些信息通常采用XML文件形式來管理。

  C: ApplicationContext不僅包含了BeanFactory的所有功能,還添加了對國際化、資源訪問、事件傳播等方面的支持。

  D:通常在Java項目中,會采用通過ClassPathXmlApplicationContex類來實例化ApplicationContext容器的方式, 而在Web項目中,ApplicationContext容器的實例化工作會交由Web服務器來完成。

  下列說話錯誤的一項是:(D)

  A SpringBoot項目啟動本質上就是Spring的初始化操作

  B. SpringBoot項目啟動會加載所有的在spring factories中配置的監(jiān) 聽器

  C SpringBoot項目啟動的時候會發(fā)布相關事件,從而會觸發(fā)對應的監(jiān) 聽器來完成對應的操作

  D. SpringBoot項目啟動就會加載bootstrap properties文件

  下列關于Spring Boot自動配置原理的說法,錯誤的是(D)

  A @SpringBootApplication只包含@SpringBooConfiguration、@EnableAutoConfiguration、 @ComponentScan 3個注解

  B. @SpringBootConfiguration注解表示當前類為-一一個配置類并可以被組件掃描器掃描

  C. @EnableAutoConfiguration的作用是啟動自動配置,向容器中導入所有選中的自動配置類

  D. @ComponentScan注解的主要作用是掃描指定包及其子包下所有注解類文件作為Spring容器的組件使用

  描述Spring MVC正確的選項。(D)

  A,在Spring MVC中,可以配置多個DispatcherServlet

  B, DispatcherServlet在 Spring MVC中是核心servlet,它負責接收請求并將請求分發(fā)給適合的控制器

  C,要使Spring MVC可用,DispatcherServlet需要在web xml中配置

  D,全部選項

  看程序進行分析: Public UserselectUser(String name ,String area).

  select”fromuser user t whereuser name = #{0} anduser _area #(1)

  #{0)表示哪一個參數?(B)

  A.程序報錯

  B. name

  C. area

  D. 0

  二、多選題

  在關于依賴注入,描述正確的是。(BC)

  A.依賴注入可以增強系統(tǒng)各組件的依賴關系

  B.所謂依賴注入,就是明確地定義組件接口,獨立開發(fā)各個組件,然后根據組件件依賴關系組裝運行的設計模式

  C依賴注入能多降低系統(tǒng)各組件的依賴關系,提倡面向接口編程

  D Spring的依賴注入和控制反轉是完全不同的兩個概念

  下列哪種說法是錯誤的。(A,B )

  A.實例方法可直接調用超類的實例方法

  B.實例方法可直接調用超類的類方法

  C.實例方法可直接調用其他類的實例方法

  D.實例方法可直接調用本類的類方法

  對mysql支持的復制類型描述正確的是? (ABC)

  A,基于語句的復制

  B,基于行的復制

  C,混合類型的復制

  D,單類型的復制

  SpringMVC用什么對象從后臺向前臺傳遞數據的? (CB)

  A將數據綁定到request

  B返回ModelAndView

  C通過ModelMap對象,可以在這個對象里面調用put方法,把對象加到里面,前端就可以通過el表達式拿到

  D綁定數據到Session中

  下列描述有誤的是? (CD)

  A MyBatis是一個可以自定義SQL、存儲過程和高級映射的持久層框架

  B. MyBatis的緩存分為級緩存和二級緩存,一級緩存放在 session里面

  C. Mybatis是個全ORM (對象關系映射)框架,它內部封裝了JDBC

  D. MyBatis只可以使用XML來配置和映射原生信息

  三、判斷題

  SpringMvc的控制器是單例模式。(對 )

  在Java的方法中定義一個常量要用const關鍵字。(錯)

  在sq|語句比較復雜的時候,使用注解綁定比使用xml!綁定會更好。(錯)

  Spring是輕量的,基本的版本大約3MB。(對)

  Spring Boot為整合MyBatis技術框架提供了版本管理。(對)

  如果對象的引用被置為null,垃圾收集器會立即釋放對象占用的內存?(錯)

  主鍵被強制定義成NOT NULL和UNIQUE。(對)

  SpringMVC我們可以直接在Controller的相關的方法的形參中獲取HttpServletResponse對象(對 )

  JSP頁面是一種包含 了靜態(tài)數據和JSP元素兩種類型的文本的文本文檔。(對)

  在Java中,程序員是不需要顯示的去釋放一個對象的內存的, 而是由虛擬機自行執(zhí)行。(對)

  四、填空題

  #{}和${}的含義是什么? #{}是(表示一個占位符,防止sql注入) ${}是(sql的拼接,以字符串方式替換)

  SpringMVC常用注解中獲取URL中路徑變量中的值是(RequestParam)注解。

 。‥NUM)是一個字符串對象,用于指定一組預定義的值,并可在創(chuàng)建表時使用。

  讓控件按相同大小排列用(GridLayout)布局管理器;一次只有一個控件可見的布局管理器是(CardLayout)

  (@Repository)注解用于將數據訪問層(DAO層)的類標識為Spring中的Bean,其功能與@Component相同。

  在Spring Boot項目啟動類上添加了注解,(@MapperScan("xxx"))來替代@Mapper注解。

  默認情況下,Spring Boot生成的全局配置文件是(application.properties)

  JAVA筆試題目及答案5

  1.什么是Java虛擬機?為什么Java被稱作是“平臺無關的編程語言”?

  Java虛擬機是一個可以執(zhí)行Java字節(jié)碼的虛擬機進程。Java源文件被編譯成能被Java虛擬機執(zhí)行的字節(jié)碼文件。

  Java被設計成允許應用程序可以運行在任意的平臺,而不需要程序員為每一個平臺單獨重寫或者是重新編譯。Java虛擬機讓這個變?yōu)榭赡埽驗樗赖讓佑布脚_的指令長度和其他特性。

  2.JDK和JRE的區(qū)別是什么?

  Java運行時環(huán)境(JRE)是將要執(zhí)行Java程序的Java虛擬機。它同時也包含了執(zhí)行applet需要的瀏覽器插件。Java開發(fā)工具包(JDK)是完整的Java軟件開發(fā)包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java調試器),可以讓開發(fā)者開發(fā)、編譯、執(zhí)行Java應用程序。

  3.”static”關鍵字是什么意思?Java中是否可以覆蓋(override)一個private或者是static的方法?

  “static”關鍵字表明一個成員變量或者是成員方法可以在沒有所屬的類的實例變量的情況下被訪問。

  Java中static方法不能被覆蓋,因為方法覆蓋是基于運行時動態(tài)綁定的,而static方法是編譯時靜態(tài)綁定的。static方法跟類的任何實例都不相關,所以概念上不適用。

  4.是否可以在static環(huán)境中訪問非static變量?

  static變量在Java中是屬于類的,它在所有的實例中的值是一樣的。當類被Java虛擬機載入的時候,會對static變量進行初始化。如果你的代碼嘗試不用實例來訪問非static的變量,編譯器會報錯,因為這些變量還沒有被創(chuàng)建出來,還沒有跟任何實例關聯上。

  5.Java支持的數據類型有哪些?什么是自動拆裝箱?

  Java語言支持的8中基本數據類型是:byte short int long float double boolean char

  自動裝箱是Java編譯器在基本數據類型和對應的對象包裝類型之間做的一個轉化。比如:把int轉化成Integer,double轉化成double,等等。反之就是自動拆箱。

  6.Java中的方法覆蓋(Overriding)和方法重載(Overloading)是什么意思?

  Java中的方法重載發(fā)生在同一個類里面兩個或者是多個方法的方法名相同但是參數不同的情況。與此相對,方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,參數列表和返回類型。覆蓋者可能不會限制它所覆蓋的方法的訪問。

  7.Java中,什么是構造函數?什么是構造函數重載?什么是復制構造函數?

  當新對象被創(chuàng)建的時候,構造函數會被調用。每一個類都有構造函數。在程序員沒有給類提供構造函數的情況下,Java編譯器會為這個類創(chuàng)建一個默認的構造函數。

  Java中構造函數重載和方法重載很相似?梢詾橐粋類創(chuàng)建多個構造函數。每一個構造函數必須有它自己唯一的參數列表。

  Java不支持像C++中那樣的復制構造函數,這個不同點是因為如果你不自己寫構造函數的情況下,Java不會創(chuàng)建默認的復制構造函數。

  8.Java支持多繼承么?

  不支持,Java不支持多繼承。每個類都只能繼承一個類,但是可以實現多個接口。

  9.接口和抽象類的區(qū)別是什么?

  Java提供和支持創(chuàng)建抽象類和接口。它們的實現有共同點,不同點在于:

  接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。 類可以實現很多個接口,但是只能繼承一個抽象類 類如果要實現一個接口,它必須要實現接口聲明的所有方法。但是,類可以不實現抽象類聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。 抽象類可以在不提供接口方法實現的情況下實現接口。 Java接口中聲明的變量默認都是final的。抽象類可以包含非final的變量。 Java接口中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。 接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含main方法的話是可以被調用的。也可以參考JDK8中抽象類和接口的區(qū)別

  10.什么是值傳遞和引用傳遞?

  對象被值傳遞,意味著傳遞了對象的一個副本。因此,就算是改變了對象副本,也不會影響源對象的值。

  對象被引用傳遞,意味著傳遞的并不是實際的對象,而是對象的引用。因此,外部對引用對象所做的改變會反映到所有的對象上。

  11.進程和線程的區(qū)別是什么?

  進程是執(zhí)行著的應用程序,而線程是進程內部的一個執(zhí)行序列。一個進程可以有多個線程。線程又叫做輕量級進程。

  12.創(chuàng)建線程有幾種不同的方式?你喜歡哪一種?為什么?

  有三種方式可以用來創(chuàng)建線程:

  繼承Thread類 實現Runnable接口 應用程序可以使用Executor框架來創(chuàng)建線程池。

  實現Runnable接口這種方式更受歡迎,因為這不需要繼承Thread類。在應用設計中已經繼承了別的對象的情況下,這需要多繼承(而Java不支持多繼承),只能實現接口。同時,線程池也是非常高效的,很容易實現和使用。

  13.概括的解釋下線程的幾種可用狀態(tài)。

  線程在執(zhí)行過程中,可以處于下面幾種狀態(tài):

  就緒(Runnable):線程準備運行,不一定立馬就能開始執(zhí)行。 運行中(Running):進程正在執(zhí)行線程的代碼。 等待中(Waiting):線程處于阻塞的狀態(tài),等待外部的處理結束。 睡眠中(Sleeping):線程被強制睡眠。 I/O阻塞(Blocked on I/O):等待I/O操作完成。 同步阻塞(Blocked on Synchronization):等待獲取鎖。 死亡(Dead):線程完成了執(zhí)行。

  14.同步方法和同步代碼塊的區(qū)別是什么?

  在Java語言中,每一個對象有一把鎖。線程可以使用synchronized關鍵字來獲取對象上的鎖。synchronized關鍵字可應用在方法級別(粗粒度鎖)或者是代碼塊級別(細粒度鎖)。

  15.在監(jiān)視器(Monitor)內部,是如何做線程同步的?程序應該做哪種級別的同步?

  監(jiān)視器和鎖在Java虛擬機中是一塊使用的。監(jiān)視器監(jiān)視一塊同步代碼塊,確保一次只有一個線程執(zhí)行同步代碼塊。每一個監(jiān)視器都和一個對象引用相關聯。線程在獲取鎖之前不允許執(zhí)行同步代碼。

  16.什么是死鎖(deadlock)?

  兩個進程都在等待對方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時候就發(fā)生了死鎖。結果就是兩個進程都陷入了無限的等待中。

  17.如何確保N個線程可以訪問N個資源同時又不導致死鎖?

  使用多線程的時候,一種非常簡單的避免死鎖的方式就是:指定獲取鎖的順序,并強制線程按照指定的順序獲取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會出現死鎖了。

  18.Java集合類框架的基本接口有哪些?

  Java集合類提供了一套設計良好的支持對一組對象進行操作的接口和類。Java集合類里面最基本的接口有:

  Collection:代表一組對象,每一個對象都是它的子元素。 Set:不包含重復元素的Collection。 List:有順序的collection,并且可以包含重復元素。 Map:可以把鍵(key)映射到值(value)的對象,鍵不能重復。

  19.為什么集合類沒有實現Cloneable和Serializable接口?

  集合類接口指定了一組叫做元素的對象。集合類接口的每一種具體的實現類都可以選擇以它自己的方式對元素進行保存和排序。有的集合類允許重復的鍵,有些不允許。

  20.什么是迭代器(Iterator)?

  Iterator接口提供了很多對集合元素進行迭代的方法。每一個集合類都包含了可以返回迭代器實例的

  迭代方法。迭代器可以在迭代的過程中刪除底層集合的元素。

  克隆(cloning)或者是序列化(serialization)的語義和含義是跟具體的實現相關的。因此,應該由集合類的具體實現來決定如何被克隆或者是序列化。

  21.Iterator和ListIterator的區(qū)別是什么?

  下面列出了他們的區(qū)別:

  Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。 Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以后向。 ListIterator實現了Iterator接口,并包含其他的功能,比如:增加元素,替換元素,獲取前一個和后一個元素的索引,等等。

  22.快速失敗(fail-fast)和安全失敗(fail-safe)的區(qū)別是什么?

  Iterator的安全失敗是基于對底層集合做拷貝,因此,它不受源集合上修改的影響。java.util包下面的所有的集合類都是快速失敗的,而java.util.concurrent包下面的所有的類都是安全失敗的。快速失敗的迭代器會拋出ConcurrentModificationException異常,而安全失敗的迭代器永遠不會拋出這樣的異常。

  23.Java中的HashMap的工作原理是什么?

  Java中的HashMap是以鍵值對(key-value)的形式存儲元素的。HashMap需要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,然后把鍵值對存儲在集合中合適的索引上。如果key已經存在了,value會被更新成新值。HashMap的一些重要的特性是它的容量(capacity),負載因子(load factor)和擴容極限(threshold resizing)。

  24.hashCode()和equals()方法的重要性體現在什么地方?

  Java中的HashMap使用hashCode()和equals()方法來確定鍵值對的索引,當根據鍵獲取值的時候也會用到這兩個方法。如果沒有正確的實現這兩個方法,兩個不同的鍵可能會有相同的hash值,因此,可能會被集合認為是相等的。而且,這兩個方法也用來發(fā)現重復元素。所以這兩個方法的實現對HashMap的精確性和正確性是至關重要的。

  25.HashMap和Hashtable有什么區(qū)別?

  HashMap和Hashtable都實現了Map接口,因此很多特性非常相似。但是,他們有以下不同點: HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。 Hashtable是同步的,而HashMap不是。因此,HashMap更適合于單線程環(huán)境,而Hashtable適合于多線程環(huán)境。 HashMap提供了可供應用迭代的鍵的集合,因此,HashMap是快速失敗的。另一方面,Hashtable提供了對鍵的列舉(Enumeration)。 一般認為Hashtable是一個遺留的類。

  26.數組(Array)和列表(ArrayList)有什么區(qū)別?什么時候應該使用Array而不是ArrayList?

  下面列出了Array和ArrayList的不同點:

  Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。 Array大小是固定的,ArrayList的大小是動態(tài)變化的。 ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。 對于基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。

  27.ArrayList和LinkedList有什么區(qū)別?

  ArrayList和LinkedList都實現了List接口,他們有以下的不同點:

  ArrayList是基于索引的數據接口,它的底層是數組。它可以以O(1)時間復雜度對元素進行隨機訪問。與此對應,LinkedList是以元素列表的形式存儲它的數據,每一個元素都和它的前一個和后一個元素鏈接在一起,在這種情況下,查找某個元素的時間復雜度是O(n)。

  相對于ArrayList,LinkedList的插入,添加,刪除操作速度更快,因為當元素被添加到集合任意位置的時候,不需要像數組那樣重新計算大小或者是更新索引。

  LinkedList比ArrayList更占內存,因為LinkedList為每一個節(jié)點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素也可以參考ArrayList vs. LinkedList。

  28.Comparable和Comparator接口是干什么的?列出它們的區(qū)別。

  Java提供了只包含一個compareTo()方法的Comparable接口。這個方法可以個給兩個對象排序。具體來說,它返回負數,0,正數來表明輸入對象小于,等于,大于已經存在的對象。

  Java提供了包含compare()和equals()兩個方法的Comparator接口。compare()方法用來給兩個輸入參數排序,返回負數,0,正數表明第一個參數是小于,等于,大于第二個參數。equals()方法需要一個對象作為參數,它用來決定輸入參數是否和comparator相等。只有當輸入參數也是一個comparator并且輸入參數和當前comparator的排序結果是相同的時候,這個方法才返回true。

  29.什么是Java優(yōu)先級隊列(Priority Queue)?

  PriorityQueue是一個基于優(yōu)先級堆的無界隊列,它的元素是按照自然順序(natural order)排序的。在創(chuàng)建的時候,我們可以給它提供一個負責給元素排序的比較器。PriorityQueue不允許null值,因為他們沒有自然順序,或者說他們沒有任何的相關聯的比較器。最后,PriorityQueue不是線程安全的,入隊和出隊的時間復雜度是O(log(n))。

  30.你了解大O符號(big-O notation)么?你能給出不同數據結構的例子么?

  大O符號描述了當數據結構里面的元素增加的時候,算法的規(guī)模或者是性能在最壞的場景下有多么好。

  大O符號也可用來描述其他的行為,比如:內存消耗。因為集合類實際上是數據結構,我們一般使用大O符號基于時間,內存和性能來選擇最好的實現。大O符號可以對大量數據的性能給出一個很好的說明。

  31.如何權衡是使用無序的數組還是有序的數組?

  有序數組最大的好處在于查找的時間復雜度是O(log n),而無序數組是O(n)。有序數組的缺點是插入操作的時間復雜度是O(n),因為值大的元素需要往后移動來給新元素騰位置。相反,無序數組的插入時間復雜度是常量O(1)。

  32.Java集合類框架的最佳實踐有哪些?

  根據應用的需要正確選擇要使用的集合的類型對性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我們就應該用Array而不是ArrayList。

  有些集合類允許指定初始容量。因此,如果我們能估計出存儲的元素的數目,我們可以設置初始容量來避免重新計算hash值或者是擴容。

  為了類型安全,可讀性和健壯性的原因總是要使用泛型。同時,使用泛型還可以避免運行時的ClassCastException。

  使用JDK提供的不變類(immutable class)作為Map的鍵可以避免為我們自己的類實現hashCode()和equals()方法。

  編程的時候接口優(yōu)于實現。

  底層的集合實際上是空的情況下,返回長度是0的集合或者是數組,不要返回null。

  33.Enumeration接口和Iterator接口的區(qū)別有哪些?

  Enumeration速度是Iterator的2倍,同時占用更少的內存。但是,Iterator遠遠比Enumeration安全,因為其他線程不能夠修改正在被iterator遍歷的集合里面的對象。同時,Iterator允許調用者刪除底層集合里面的元素,這對Enumeration來說是不可能的。

  34.HashSet和TreeSet有什么區(qū)別?

  HashSet是由一個hash表來實現的,因此,它的元素是無序的。add(),remove(),contains()方法的時間復雜度是O(1)。

  另一方面,TreeSet是由一個樹形的結構來實現的,它里面的元素是有序的。因此,add(),remove(),contains()方法的時間復雜度是O(logn)。

  35.Java中垃圾回收有什么目的?什么時候進行垃圾回收?

  垃圾回收的目的是識別并且丟棄應用不再使用的對象來釋放和重用資源。

  36.System.gc()和Runtime.gc()會做什么事情?

  這兩個方法用來提示JVM要進行垃圾回收。但是,立即開始還是延遲進行垃圾回收是取決于JVM的。

  37.finalize()方法什么時候被調用?析構函數(finalization)的目的是什么?

  在釋放對象占用的內存之前,垃圾收集器會調用對象的finalize()方法。一般建議在該方法中釋放對象持有的資源。

  38.如果對象的引用被置為null,垃圾收集器是否會立即釋放對象占用的內存?

  不會,在下一個垃圾回收周期中,這個對象將是可被回收的。

  39.Java堆的結構是什么樣子的?什么是堆中的永久代(Perm Gen space)?

  JVM的堆是運行時數據區(qū),所有類的實例和數組都是在堆上分配內存。它在JVM啟動的時候被創(chuàng)建。對象所占的堆內存是由自動內存管理系統(tǒng)也就是垃圾收集器回收。

  堆內存是由存活和死亡的對象組成的。存活的對象是應用可以訪問的,不會被垃圾回收。死亡的對象是應用不可訪問尚且還沒有被垃圾收集器回收掉的對象。一直到垃圾收集器把這些對象回收掉之前,他們會一直占據堆內存空間。

  40.串行(serial)收集器和吞吐量(throughput)收集器的區(qū)別是什么?

  吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等規(guī)模和大規(guī)模數據的應用程序。而串行收集器對大多數的小應用(在現代處理器上需要大概100M左右的內存)就足夠了。

  41.在Java中,對象什么時候可以被垃圾回收?

  當對象對當前使用這個對象的應用程序變得不可觸及的時候,這個對象就可以被回收了。

  42.JVM的永久代中會發(fā)生垃圾回收么?

  垃圾回收不會發(fā)生在永久代,如果永久代滿了或者是超過了臨界值,會觸發(fā)完全垃圾回收(Full GC)。如果你仔細查看垃圾收集器的輸出信息,就會發(fā)現永久代也是被回收的。這就是為什么正確的永久代大小對避免Full GC是非常重要的原因。

  JAVA筆試題目及答案6

  一、面向對象的特征有哪些方面

  1.抽象:

  抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節(jié)。抽象包括兩個方面,一是過程抽象,二是數據抽象。

  2.繼承:

  繼承是一種聯結類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,并且類可以修改或增加新的方法使之更適合特殊的需要。

  3.封裝:

  封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始于這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。

  4.多態(tài)性:

  多態(tài)性是指允許不同類的對象對同一消息作出響應。多態(tài)性包括參數化多態(tài)性和包含多態(tài)性。多態(tài)性語言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢,很好的解決了應用程序函數同名問題。

  二、String是最基本的數據類型嗎?

  基本數據類型包括byte、int、char、long、float、double、boolean和short. java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節(jié)省空間,我們應該用 StringBuffer類。

  三、int 和 Integer 有什么區(qū)別?

  Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。int是Java的原始數據類型,Integer是Java為int提供的封裝類。Java為每個原始類型提供了封裝類。

  引用類型和原始類型的行為完全不同,并且它們具有不同的語義。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的缺省值。對象引用實例變量的缺省值為 null,而原始類型實例變量的缺省值與它們的類型有關。

  四、String 和StringBuffer的區(qū)別?

  Java平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當你知道字符數據要改變的時候你就可以使用StringBuffer.典型地,你可以使用StringBuffer來動態(tài)構造字符數據。

  五、運行時異常與一般異常有何異同?

  異常表示程序運行過程中可能出現的非正常狀態(tài),運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。Java編譯器要求方法必須聲明拋出可能發(fā)生的非運行時異常,但是并不要求必須聲明拋出未被捕獲的運行時異常。

  六、說出Servlet的生命周期,并說出Servlet和CGI的區(qū)別。

  Servlet被服務器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷毀的時候調用其destroy方法。

  與CGI的區(qū)別在于Servlet處于服務器進程中,它通過多線程方式運行其service方法,一個實例可以服務于多個請求,并且其實例一般不會銷毀,而CGI對每個請求都產生新的進程,服務完成后就銷毀,所以效率上低于CGI.

  七、說出ArrayList,Vector, LinkedList的存儲性能和特性

  ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大于實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快。

  八、EJB是基于哪些技術實現的?并說出SessionBean和EntityBean的區(qū)別,StatefulBean和StatelessBean的區(qū)別。

  EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技術實現。

  SessionBean在J2EE應用程序中被用來完成一些服務器端的業(yè)務操作,例如訪問數據庫、調用其他EJB組件。EntityBean被用來代表應用系統(tǒng)中用到的數據。

  對于客戶機,SessionBean是一種非持久性對象,它實現某些在服務器上運行的業(yè)務邏輯。

  對于客戶機,EntityBean是一種持久性對象,它代表一個存儲在持久性存儲器中的實體的對象視圖,或是一個由現有企業(yè)應用程序實現的實體。

  九、Collection 和 Collections的區(qū)別。

  Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.

  Collections是針對集合類的一個幫助類,他提供一系列靜態(tài)方法實現對各種集合的搜索、排序、線程安全化等操作。

  十、&和&&的區(qū)別。

  &是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and)。

  JAVA筆試題目及答案7

  一、單項選擇題(共10題,每題2分,共20分)

  1. 下列說法哪一個是正確的。( B )

  A.Java程序經編譯后會產生machine code

  B.Java程序經編譯后會產生byte code

  C.Java程序經編譯后會產生DLL

  D.以上都不正確

  2. 提供Java存取數據庫能力的包是。( A )

  A.java.sql B.java.awt C.java.lang D.java.swing

  3. 執(zhí)行如下程序代碼后,C的值是。( C )

  a=0;c=0;

  do{

  --c;

  a=a-1;

  }while(a>0);

  A.0 B.1 C.-1 D.死循環(huán)

  4. 下面的語句中正確的表達式為。( C )

  A.byte b = 128;

  B.boolean n = null;

  C.double d = 0.9239d;

  D.float f = 0.9239;

  5. 將一個十六進制值賦給一個long型變量的正確寫法為。( D )

  A.long number = 345L;

  B.long number = 0345;

  C.long number = 0345L;

  D.long number = 0x345L;

  6. 以下程序代碼的輸出是。( B )

  public class test (

  public static void main (String args[]) (

  System.out.printIn (6 ^ 3);

  )

  )

  A.3 B.5 C.6 D.11

  7. 以下程序代碼的輸出是。(E )

  public class test (

  private static int j = 0;

  private static boolean methodB(int k) (

  j += k;

  return true;

  )

  public static void methodA(int i) {

  boolean b:

  b = i < 10 | methodB (4);

  b = i < 10 || methodB (8);

  )

  public static void main (String args[] } (

  methodA (0);

  system.out.printIn(j);

  )

  )

  A.0 B.4 C.8 D.12 E.不能編譯通過

  8. 以下程序代碼的輸出是。( A)

  public class test {

  public static void add3 (Integer i) }

  int val = i.intValue ( );

  val += 3;

  i = new Integer (val);

  }

  public static void main (String args [ ] ) {

  Integer i = new Integer (0);

  add3 (i);

  system.out.printIn (i.intValue ( ) );

  }

  )

  A.編譯失敗 B.編譯成功但在第三行會出現異常 C.0 D.3

  9. 以下程序代碼執(zhí)行后,哪個說法正確?( B )

  int index = 1;

  boolean[] test = new Boolean[3];

  boolean foo= test [index];

  A.有異常拋出。

  B.無法編譯。

  C.foo的值是0。

  D.foo的值是null。

  E.foo的值是true。

  F.foo的值是false。

  10. 以下哪個類是swt包中的。( D )

  A.MessageBox B.MessageDialog C.JDialog D.DisplayMode

  二、多項選擇題(共5題,每題4分,共20分)

  1. 在下面的選項中合法的標識符有。( ADEF )

  A._ok

  B.*point

  C.this

  D.$byte

  E.const

  F.ILikeJLCSS

  2. 下面的選項中哪些不是java的關鍵字。( AB D )

  A.TRUE

  B.sizeof

  C.goto

  D.const

  E.super

  F.void

  3. 下面的敘述中正確的有。( AC )

  A. 環(huán)境變量可在編譯source code時指定。

  B. 在編譯程序時,所能指定的環(huán)境變量不包括class path。

  C. javac一次可同時編譯數個Java源文件。

  D. javac.exe能指定編譯結果要置于哪個目錄(directory)。

  4. 下面的敘述中正確的有。( C )

  A.equals()方法判定引用值是否指向同一對象。

  B.= = 操作符判定兩個分立的對象的內容和類型是否一致。

  C.equals()方法只有在兩個對象的內容一致時返回true。

  D.類File重寫方法equals()在兩個分立的對象的內容和類型一致時返回true。

  5. 下面有關變量及其作用域的陳述哪些是對的。( A C )

  A. 在方法里面定義的局部變量在方法退出的時候被撤銷。

  B. 局部變量也叫自動變量。

  C. 在方法外面定義的變量(譯注:即實例變量)在對象被構造時創(chuàng)建。

  D. 在方法中定義的方法的參變量只要該對象被需要就一直存在。

  三、簡答題(共7題,共40分)

  1. 請寫出一個輸出“Hello World!” 的程序。(3分)

  答:public Class Hello World

  {

  Public static void main(String[]args)

  {

  System.out.println(“HELLO WOTLD”);

  }

  }

  2. char型變量中能不能存貯一個中文漢字? 為什么? (3分)

  答:能存儲一個漢字;因為它能存儲四個字節(jié)而每個漢字只占兩個字節(jié)。

  3. 常見的兩種xml解析技術是什么? 區(qū)別是什么? (4分)

  答:常見的兩種有:SAX和DOM。

  區(qū)別:SAX 是一種事件驅動的xml解析方式。每次訪問一個xml文件中的某個節(jié)點的時候,sax就會搜索一遍xml文件,在找到相應的節(jié)點后就會觸發(fā)一個事件來處理請求。只讀

  DOM是一種基于樹狀的查找方式。DOM會將xml解析成一棵樹,存在內存中。開發(fā)者可以通過查找樹的節(jié)點來取得文件的內容或者修改內容?勺x寫

  4. MVC是什么,如何實現? (5分)

  答:MVC是一個是一個設計模式,它強制性的使應用程序的輸入,處理和輸出分開。使用MVC應用程序被分為三個核心部件:M----------MODO模型,V ----------VIEW 試圖,C --------- Contral控制

  實現:首先有頁面(jsp)發(fā)送請求給控制器(servlet),然后由控制器接收用戶的請求,并決定應該調用哪個模型(javabean)來進行處理,然后模型用業(yè)務邏輯來處理用戶的請求并返回數據,最后控制器用相應的視圖格式化模型返回的數據,并通過表示層顯示給用戶。

  5. .J2EE是什么?(6分)

  答:J2EE 是Sun公司提出的多層(multi-diered),分布式(distributed),基于組件(component-base)的企業(yè)級應用模型 (enterpriese application model).在這樣的一個應用系統(tǒng)中,可按照功能劃分為不同的組件,這些組件又可在不同計算機上,并且處于相應的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web層和組件,Business層和組件,企業(yè)信息系統(tǒng)(EIS)層。

  6. jsp有哪些內置對象?作用分別是什么? (9分)

  答:1.request 用戶端請求,此請求會包含來自GET/POST請求的參數;2.response 網頁傳回用戶端的回應;3.pageContext 網頁的屬性是在這里管理;4.session 與請求有關的會話期;5.application servlet 正在執(zhí)行的內容;6.out 用來傳送回應的輸出;7.config servlet的構架部件;8.page JSP網頁本身;9.exception 針對錯誤網頁,未捕捉的例外

  7. 作用域public,private,protected,以及不寫時的區(qū)別 ?(10分)

  答:作用域 當前類 同一package 子孫類 其他package

  public √ √ √ √

  protected √ √ √ ×

  friendly √ √ × ×

  private √ × × ×

  不寫時默認為friendly

  四、編碼及論述題(共2題,每題10分,共20分)

  1. 什么是Singleton,它的作用是什么,它有幾種形式?請用代碼寫出一個Singleton類。

  答:Java Singleton 模式用來保證在運行的應用程序中,一個Class只是實例化一次,也就是只有一個相應的對象存在。

  它有三種形式

  public class Singleton

  {

  private static Singleton instance = null;

  public static synchronized Singleton getInstance()

  {

  if (instance==null)

  instance=new Singleton();

  return instance;

  }

  }

  2. 在Struts + Spring + Hibernate的組合框架模式中,三者各自的特點都是什么?

  答:Strtus WEB層 Spring是業(yè)務層 Hiebenate是持久化層。

【JAVA筆試題目及答案】相關文章:

2017年Java筆試題及答案08-27

2016年Java認證筆試題及答案08-19

2016最新Java認證筆試題及答案06-18

最新中興Java語言筆試真題及答案08-24

Java中級開發(fā)工程師筆試題及答案201608-21

PHOTOSHOP認證題目及答案06-19

excel選擇題目及答案11-08

EMBA面試常見題目及答案06-22

java認證考試試題及答案08-20