Java 初級軟件工程師java
認證考試試卷數據庫
筆試(A卷)編程
考試時間150分鐘設計模式
總分 100分數組
姓 名_______________________安全
身份證號_______________________服務器
考試結束後考卷必須收回,不然考試成績無效網絡
尚學堂Java 初級軟件工程師認證考試試卷多線程
1、 填空題(共20個題目,總計20分)oracle
2、 選擇題(共25個題目,總計25分)
1) |
如下選項中是對一個Java源文件進行正確編譯的語句是( A )(選擇一項) |
||
|
|
|
|
|
A. |
javac Test.java |
|
|
B. |
javac Test |
|
|
C. |
java Test |
|
|
D. |
java Test.class |
|
2) |
如下選項中屬於合法的Java標識符的是(CD )。(選擇兩項) |
||
|
|
|
|
|
A. |
public |
|
|
B. |
3num |
|
|
C. |
name |
|
|
D. |
_age |
|
3) |
如下代碼的執行結果是( B )。(選擇一項) |
||
|
boolean m = true; if(m = false){ System.out.println("false"); }else{ System.out.println("true"); } |
||
|
|
|
|
|
A. |
false |
|
|
B. |
true |
|
|
C. |
編譯錯誤 |
|
|
D. |
無結果 |
|
4) |
如下do-while循環代碼的執行結果是( A )。(選擇一項) |
||
|
int a=0; int c=0; do{ --c; a=a-1; }while(a>0); System.out.println(a+" "+c); |
||
|
|
|
|
|
A. |
-1 -1 |
|
|
B. |
死循環 |
|
|
C. |
-1 -2 |
|
|
D. |
-1 0 |
|
5) |
while循環和do-while循環的區別是( D )。(選擇一項) |
||
|
|
|
|
|
A. |
沒有區別,這兩個結構在任何狀況下效果同樣 |
|
|
B. |
while循環比do-while循環執行效率高 |
|
|
C. |
while循環是先循環後判斷,因此循環體至少被執行一次 |
|
|
D. |
do-while循環是先循環後判斷,因此循環體至少被執行一次 |
|
6) |
分析下面的Java多重循環代碼片斷,編譯運行後的輸出結果是( D )。(選擇一項) |
||
|
for (int i = 0; i < 6; i++) { int k = ++i; while (k < 5) { System.out.print(i); break; } } |
||
|
|
|
|
|
A. |
024 |
|
|
B. |
02 |
|
|
C. |
123 |
|
|
D. |
13 |
|
7) |
如下關於方法調用的代碼的執行結果是( B )。(選擇一項) |
||
|
public class Test { public static void main(String args[]) { int i = 99; mb_operate(i); System.out.print(i + 100); } static void mb_operate(int i) { i += 100; } } |
||
|
|
|
|
|
A. |
99 |
|
|
B. |
199 |
|
|
C. |
299 |
|
|
D. |
99100 |
|
8) |
如下關於繼承條件下構造方法執行過程的代碼的執行結果是( A )。(選擇一項) |
||
|
class Person { public Person() { System.out.println("execute Person()");1 } } class Student extends Person { public Student() { System.out.println("execute Student() ");2 } } class PostGraduate extends Student { public PostGraduate() { System.out.println("execute PostGraduate()");3 } } public class TestInherit { public static void main(String[] args) { new PostGraduate(); } } |
||
|
|
|
|
|
A. |
execute Person() execute Student() execute PostGraduate() |
|
|
B. |
execute PostGraduate() |
|
|
C. |
execute PostGraduate() execute Student() execute Person() |
|
|
D. |
沒有結果輸出 |
|
9) |
如下語句中關於Java構造方法的說法錯誤的是( B )。(選擇一項) |
||
|
|
|
|
|
A. |
構造方法的做用是爲建立對象進行初始化工做,好比給成員變量賦值 |
|
|
B. |
一個Java類能夠沒有構造方法,也能夠提供1個或多個構造方法 |
|
|
C. |
構造方法與類同名,不能書寫返回值類型 |
|
|
D. |
構造方法的第一條語句若是是super(),則能夠省略,該語句做用是調用父類無參數的構造方法 |
|
10) |
如下關於this和super關鍵字的說法錯誤的是( BD )。(選擇二項) |
||
|
|
|
|
|
A. |
this關鍵字指向當前對象自身,super關鍵字指向當前對象的直接父類 |
|
|
B. |
在main方法中能夠存在this或super關鍵字,但不能同時存在。 |
|
|
C. |
this和super關鍵字均可以訪問成員屬性,成員方法和構造方法 |
|
|
D. |
在一個類的構造方法中能夠同時使用this和super來調用其餘構造方法 |
|
11) |
如下選項中可使成員變量m 被函數fun()直接訪問的是( C )。(選擇一項) |
||
|
class Test { private int m; public static void fun() { System.out.println(m); } } |
||
|
|
|
|
|
A. |
將private int m 改成protected int m |
|
|
B. |
將private int m 改成 public int m |
|
|
C. |
將private int m 改成 static int m |
|
|
D. |
將private int m 改成 int m |
|
12) |
Person類和Test類的代碼以下所示,則代碼中的錯誤語句是( C )。(選擇一項) |
||
|
public class Person { public String name; public Person(String name) { this.name = name; } } public class Test { public static void main(String[] args) { final Person person = new Person("歐歐"); person.name = "美美"; person = new Person("亞亞"); } } |
||
|
|
|
|
|
A. |
final Person person = new Person("歐歐"); |
|
|
B. |
person.name = "美美"; |
|
|
C. |
person = new Person("亞亞"); |
|
|
D. |
沒有錯誤 |
|
13) |
如下關於異常的代碼的執行結果是( C )。(選擇一項) |
||
|
public class Test { public static void main(String args[]) { try { System.out.println("try"); return; } catch(Exception e){ System.out.println("catch"); }finally { System.out.println("finally"); } } } |
||
|
|
|
|
|
A. |
try catch finally |
|
|
B. |
catch finally |
|
|
C. |
try finally |
|
|
D. |
try
|
|
14) |
如下關於String類的代碼的執行結果是( B )。(選擇一項) |
||
|
public class Test2 { public static void main(String args[]) { String s1 = new String("bjsxt"); String s2 = new String("bjsxt"); if (s1 == s2) System.out.println("s1 == s2"); if (s1.equals(s2)) System.out.println("s1.equals(s2)"); } } |
||
|
|
|
|
|
A. |
s1 == s2 |
|
|
B. |
s1.equals(s2) |
|
|
C. |
s1 == s2 s1.equals(s2) |
|
|
D. |
以上都不對
|
|
15) |
如下關於StringBuffer類的代碼的執行結果是( D )。(選擇一項) |
||
|
public class TestStringBuffer { public static void main(String args[]) { StringBuffer a = new StringBuffer("A"); StringBuffer b = new StringBuffer("B"); mb_operate(a, b); System.out.println(a + "." + b); } static void mb_operate(StringBuffer x, StringBuffer y) { x.append(y); y = x; } } |
||
|
|
|
|
|
A. |
A.B |
|
|
B. |
A.A |
|
|
C. |
AB.AB |
|
|
D. |
AB.B |
|
16) |
如下選項中可以正確建立一個數組的是( AD )。(選擇二項) |
||
|
|
|
|
|
A. |
float []f[] = new float[6][6]; |
|
|
B. |
float f[][] = new float[][]; |
|
|
C. |
float [6][]f = new float[6][6]; |
|
|
D. |
float [][]f = new float[6][]; |
|
17) |
如下選項中關於int和Integer的說法錯誤的是( BD)。(選擇二項) |
||
|
|
|
|
|
A. |
int是基本數據類型,Integer是int的包裝類,是引用數據類型 |
|
|
B. |
int的默認值是0,Integer的默認值也是0 |
|
|
C. |
Integer能夠封裝了屬性和方法提供更多的功能 |
|
|
D. |
Integer i=5;該語句在JDK1.5以後能夠正確執行,使用了自動拆箱功能 |
|
18) |
如下選項中關於Java集合的說法錯誤的是( AC )。(選擇二項) |
||
|
|
|
|
|
A. |
List接口和Set接口是Collections接口有兩個子接口 |
|
|
B. |
List接口中存放的元素具備有序,不惟一的特色 |
|
|
C. |
Set接口中存放的元素具備無序,不惟一的特色 |
|
|
D. |
Map接口存放的是映射信息,每一個元素都是一個鍵值對 |
|
19) |
如下代碼的執行結果是(B )。(選擇一項) |
||
|
Set<String> s=new HashSet<String>(); s.add("abc"); s.add("abc"); s.add("abc"); s.add("abcd"); System.out.println(s.size()); |
||
|
|
|
|
|
A. |
1 |
|
|
B. |
2 |
|
|
C. |
3 |
|
|
D. |
4 |
|
20) |
下面集合類中屬於非線程安全,且結構採用了哈希表的是( C )。(選擇一項) |
||
|
|
|
|
|
A. |
Vector |
|
|
B. |
ArrayList |
|
|
C. |
HashMap |
|
|
D. |
Hashtable |
|
21) |
如下選項中關於以下代碼的說法正確的是( AD)。(選擇二項) |
||
|
public class TestBuffered { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("d:/bjsxt1.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("d:/bjsxt2.txt")); String str = br.readLine(); while(str !=null){ bw.write(str); bw.newLine(); str = br.readLine(); } br.close(); bw.close(); } } |
||
|
|
|
|
|
A. |
該類使用字符流實現了文件複製,將d:/bjsxt1.txt複製爲d:/bjsxt2.txt |
|
|
B. |
FileReader和FileWriter是處理流,直接從文件讀寫數據 |
|
|
C. |
BufferedReader和BufferedWriter是節點流,提供緩衝區功能,提升讀寫效率 |
|
|
D. |
readLine()能夠讀取一行數據,返回值是字符串類型,簡化了操做 |
|
22) |
InputStreamReader是轉換流,能夠將字節流轉換成字符流,是字符流與字節流之間的橋樑。它的實現使用的設計模式是( C )。(選擇一項) |
||
|
|
|
|
|
A. |
工廠模式 |
|
|
B. |
裝飾模式 |
|
|
C. |
適配器模式 |
|
|
D. |
代理模式 |
|
23) |
如下選項中能夠填寫到橫線處,讓代碼正確編譯和運行的是( A )。(選擇一項) |
||
|
public class Test implements Runnable { public static void main(String[] args) { ___________________________________ t.start(); System.out.println("main"); } public void run() { System.out.println("thread1!"); } } |
||
|
|
|
|
|
A. |
Thread t = new Thread(new Test()); |
|
|
B. |
Test t = new Test(); |
|
|
C. |
Thread t = new Test(); |
|
|
D. |
Thread t = new Thread(); |
|
24) |
在多個線程訪問同一個資源時,可使用( A )關鍵字來實現線程同步,保證對資源安全訪問。(選擇一項) |
||
|
|
|
|
|
A. |
synchronized |
|
|
B. |
transient |
|
|
C. |
static |
|
|
D. |
yield |
|
25) |
如下說法中關於UDP協議的說法正確的是( AD )。(選擇二項) |
||
|
|
|
|
|
A. |
發送無論對方是否準備好,接收方收到也不確認 |
|
|
B. |
面向鏈接 |
|
|
C. |
佔用系統資源多、效率低 |
|
|
D. |
很是簡單的協議,能夠廣播發送 |
|
3、 判斷題(共20個題目,總計10分)
Collection是接口類型,存放單值的最大接口;
Collections是操做集合的工具類,就像數組同樣,Arrays類是數組工具類。
4、 簡答題(共5個題目,總計25分)
|
英文 |
位置不一樣 |
修飾符 |
返回值 |
方法名 |
參數 |
拋出異常 |
方法體 |
重載 |
overload |
同一個類中 |
無關 |
無關 |
相同 |
不一樣 |
無關 |
不一樣 |
重寫 |
override |
子類和父類間 |
大於等於 |
小於等於 |
相同 |
相同 |
小於等於 |
不一樣 |
答:
(1)相同點:
①方法名稱相同。
②都屬於多態機制。
(2不一樣點:位置、參數列表、權限修飾符、返回值類型、拋出異常不一樣。
重載(overload):發生在同一個類中,方法名相同,參數列表不一樣,與權限修飾、返回值類型、拋出異常無關。
重寫(override): 發生在繼承類中,方法名和參數列表相同,權限修飾符大於等於父類、返回值類型小於等於父類、拋出異常小於等於父類。
1) public boolean equals(java.lang.Object) 比較內容
2) public native int hashCode() 哈希碼
3) public java.lang.String toString() 變成字符串
4) public final native java.lang.Class getClass() 獲取類結構信息
5) protected void finalize() throws java.lang.Throwable 垃圾回收前執行的方法
6) protected native Object clone() throws java.lang.CloneNotSupportedException 克隆
7) public final void wait() throws java.lang.InterruptedException 多線程中等待功能
8) public final native void notify() 多線程中喚醒功能
9) public final native void notifyAll() 多線程中喚醒全部等待線程的功能
相同點
二者的區別主要體如今兩方面:語法方面和設計理念方面
語法方面的區別是比較低層次的,非本質的,主要表如今:(2分)
兩者的主要區別在設計理念上,決定了某些狀況下使用抽象類仍是接口。(2分)
接口並不要求實現類和接口在概念本質上一致,僅僅是實現了接口定義的約定或能力而已。接口定義了「作什麼」,實現類負責完成「怎麼作」,體現了功能(規範)和實現分離的原則。接口和實現之間能夠認爲是一種「has-a的關係
一、抽象類和接口都不能直接實例化,若是要實例化,抽象類變量必須指向實現全部抽象方法的子類對象,接口變量必須指向實現全部接口方法的類對象。
二、抽象類要被子類繼承,接口要被類實現。
三、接口只能作方法申明,抽象類中能夠作方法申明,也能夠作方法實現
四、接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。
五、抽象類裏的抽象方法必須所有被子類所實現,若是子類不能所有實現父類抽象方法,那麼該子類只能是抽象類。一樣,一個實現接口的時候,如不能所有實現接口方法,那麼該類也只能爲抽象類。
六、抽象方法只能申明,不能實現,接口是設計的結果 ,抽象類是重構的結果
七、抽象類裏能夠沒有抽象方法
八、若是一個類裏有抽象方法,那麼這個類只能是抽象類
九、抽象方法要被實現,因此不能是靜態的,也不能是私有的。
十、接口可繼承接口,並可多繼承接口,但類只能單根繼承。
Vector和ArrayList的區別和聯繫
實現原理相同,功能相同,都是長度可變的數組結構,不少狀況下能夠互用(1分)
二者的主要區別以下
ArrayList和LinkedList的區別和聯繫
ArrayList和LinkedList都是List的實現類,元素具備有序,不惟一特色。(1分)
ArrayList實現了長度可變的數組,在內存中分配連續空間。遍歷元素和隨機訪問元素的效率比較高;(1分)
LinkedList採用鏈表存儲方式。插入、刪除元素時效率比較高(1分)
面向對象設計原則是面向對象設計的基石,面向對象設計質量的依據和保障,設計模式是面向對象設計原則的經典應用
開閉原則具備理想主義的色彩,它是面向對象設計的終極目標。其餘設計原則均可以看做是開閉原則的實現手段或方法。
1 1、 編碼題(共3個題目,總計20分) 2 1. 寫出餓漢式單例模式、懶漢式單例模式、多線程狀況下懶漢式雙重判斷單例模式的示例代碼。(7分) 3 4 public class Student_1 { 5 //餓漢式 6 private static Student_1 student = new Student_1(); 7 8 public static Student_1 newInstance() { 9 return student; 10 } 11 12 public Student_1() { 13 System.out.println("餓漢式建立對象"); 14 } 15 16 } 17 18 class Student_2 { 19 //懶漢式 20 private static Student_2 student2; 21 22 static Student_2 newInstance2() { 23 //提升效率,若是第一次建立對象成功,後面就不用進入同步當中,直接返回對象便可 24 if (student2 == null) { 25 synchronized (Student_1.class) { 26 //若是是第一次調用方法,進入if,建立對象 27 if (student2 == null) { 28 student2 = new Student_2(); 29 } 30 } 31 } 32 return student2; 33 } 34 35 public Student_2() { 36 System.out.println("懶漢式雙重檢驗建立對象"); 37 } 38 39 } 40 public class Danli_1 { 41 42 public static void main(String[] args) { 43 Student_1 s =Student_1.newInstance(); 44 45 Student_2 s2 =Student_2.newInstance2(); 46 47 } 48 } 49 50 2. 寫出使用JDBC訪問數據庫表t_student中全部數據,並將結果集內容封裝成List返回的代碼。(6分) 51 1) 數據庫表已經建立,表名稱及字段信息以下 52 表名 t_student 中文表名稱 學生信息表 53 序號 字段名稱 字段說明 類型 長度 備註 54 1 id 學生編號 number 6 主鍵 55 2 name 學生姓名 varchar2 8 非空 56 3 age 學生年齡 number 3 非空 57 4 score 學生分數 number 5,1 非空 58 5 enterdate 入學時間 date 非空 59 2) 實體類Student已經提供,和數據庫表字段對應,有id,name,age,score,enterDate五個屬性及相應的getter和setter方法,提供了各類參數的構造方法。 60 3) 使用JDBC訪問數據庫四個鏈接參數分別爲 61 a) driver:oracle.jdbc.driver.OracleDriver 62 b) url:jdbc:oracle:thin:@localhost:1521:orcl 63 c) username:bjsxt 64 d) password:bjsxt 65 4) 方法的聲明爲public List<Student> findAll(){ },在方法體中書寫JDBC代碼完成功能便可。 66 3. 使用TCP網絡編程完成用戶登陸功能:客戶端輸入用戶名和密碼,向服務器發出登陸請求;服務器接收數據並進行判斷,若是用戶名和密碼均是bjsxt,則登陸成功,不然登陸失敗,返回相應響應信息;客戶端接收響應信息並輸出登陸結果。(7分) 67 1) 用戶User類已提供構造方法 public User(String username,String password)。 68 2) 客戶端採用ObjectOutputStream發送封裝了用戶名和密碼的User對象。 69 3) 服務器端和客戶端的類名和方法聲明以下所示。 70 71 import java.io.BufferedReader; 72 import java.io.BufferedWriter; 73 import java.io.IOException; 74 import java.io.InputStreamReader; 75 import java.io.OutputStreamWriter; 76 import java.net.Socket; 77 import java.util.Scanner; 78 79 public class UserClint_3 { 80 static Scanner sc = new Scanner(System.in); 81 public static void main(String[] args) throws IOException { 82 //1.建立客戶端套接字 83 Socket s = new Socket("localhost", 152); 84 //2.建立客戶端輸出流 85 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 86 //3.用戶輸入用戶和密碼,並寫入輸出流 87 System.out.println("請輸入用戶名:"); 88 String user = sc.nextLine(); 89 System.out.println("請輸入用戶密碼:"); 90 String password = sc.nextLine(); 91 bw.write(user); 92 bw.flush(); 93 bw.newLine(); 94 bw.write(password); 95 bw.flush(); 96 97 //4.通知服務端客戶端用戶信息寫入完畢 98 s.shutdownOutput(); 99 100 //5.建立輸入流來接受服務端響應的信息 101 BufferedReader br= new BufferedReader(new InputStreamReader(s.getInputStream())); 102 String info = br.readLine(); 103 //6.輸出響應信息 104 System.out.println(info); 105 //7.關閉套接字 106 s.close(); 107 } 108 } 109 110 import java.io.BufferedReader; 111 import java.io.BufferedWriter; 112 import java.io.FileInputStream; 113 import java.io.IOException; 114 import java.io.InputStreamReader; 115 import java.io.OutputStreamWriter; 116 import java.net.ServerSocket; 117 import java.net.Socket; 118 import java.util.HashMap; 119 import java.util.Map; 120 import java.util.Properties; 121 122 public class UserServer_3 { 123 public static Map<String, String> User() throws IOException{ 124 //將用戶信息存放在User.properties文件中 125 //建立properties類獲取用戶信息 126 Properties p = new Properties(); 127 //經過load()方法讀取用戶信息 128 p.load(new FileInputStream("User.Properties")); 129 //經過getProperty()方法獲取用戶信息的鍵,獲得用戶信息的值 130 String user = p.getProperty("username"); 131 String pwd = p.getProperty("pwd"); 132 133 //建立map集合,將用戶信息的鍵以及對應的值放入集合中 134 Map<String, String> map = new HashMap<>(); 135 map.put("username", user); 136 map.put("pwd", pwd); 137 return map; 138 } 139 public static void main(String[] args) throws IOException { 140 //1.建立服務器端套接字 141 ServerSocket ss = new ServerSocket(152); 142 //2.監聽客戶端套接字 143 Socket s = ss.accept(); 144 //3.建立輸入流用來讀取客戶端發送的用戶信息 145 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 146 //4.讀取客戶端發送的用戶信息 147 String username = br.readLine(); 148 String password = br.readLine(); 149 150 //5.調用map集合,拿到map集合裏面的用戶信息和客戶端發送的信息進行比對 151 Map<String, String> map = User(); 152 //6.建立輸出流用來響應客戶端 153 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 154 //7.進行信息比對 155 if(map.get("username").equals(username)&&map.get("pwd").equals(password)){ 156 //8.寫入響應信息 157 bw.write("恭喜您,登陸成功!"); 158 bw.flush(); 159 }else{ 160 bw.write("登陸失敗,用戶或用戶密碼錯誤!"); 161 bw.flush(); 162 } 163 //9.關閉客戶端套接字 164 s.close(); 165 } 166 }