1、JAVA 語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try 塊中可以丟擲異常嗎?
答:Java 通過物件導向的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。在Java 中,每個異常都是一個物件,它是Throwable 類或其它子類的例項。當一個方法出現異常後便丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常並進行處理。Java 的異常處理是通過5 個關鍵詞來實現的:try、catch、throw、throws 和finally。一般情況下是用try 來執行一段程式,如果出現異常,系統會丟擲(throws)一個異常,這時候你可以通過它的型別來捕捉(catch)它,或最後(finally)由預設處理器來處理;try 用來指定一塊預防所有“異常”的程式;catch 子句緊跟在try 塊後面,用來指定你想要捕捉的“異常”的型別;throw 語句用來明確地丟擲一個“異常”;throws 用來標明一個成員函式可能丟擲的各種“異常”;Finally 為確保一段程式碼不管發生什麼“異常”都被執行的一段程式碼;可以在一個成員函式呼叫的外面寫一個try 語句,在這個成員函式內部寫另一個try 語句保護其他程式碼。每當遇到一個try 語句,“異常”的框架就放到堆疊上面,直到所有的try 語句都完成。如果下一級的try 語句沒有對某種“異常”進行處理,堆疊就會展開,直到遇到有處理這種“異常”的try 語句。
2、執行時異常與一般異常有何異同?
答:異常表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見執行錯誤。java 編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常。
3、說出一個你最常見到的runtime exception?
答:ArithmeticException, ArrayStoreException, BufferOverflowException,
BufferUnderflowException, CannotRedoException, CannotUndoException,
ClassCastException, CMMException, ConcurrentModificationException,
DOMException, EmptyStackException, IllegalArgumentException,
IllegalMonitorStateException, IllegalPathStateException,
IllegalStateException, ImagingOpException, IndexOutOfBoundsException,
MissingResourceException, NegativeArraySizeException,
NoSuchElementException, NullPointerException, ProfileDataException,
ProviderException, RasterFormatException, SecurityException,
SystemException, UndeclaredThrowableException,
UnmodifiableSetException, UnsupportedOperationException
4、final, finally, finalize 的區別?
答:final:修飾符(關鍵字);如果一個類被宣告為final,意味著它不能不能作為父類被繼承,因此一個類不能既被宣告為abstract的,又被宣告為final 的;將變數或方法宣告為final,可以保證它們在使用中不被改變;被宣告為final 的變數必須在宣告時給定初值,而在以後的引用中只能讀取,不可修改;被宣告為final 的方法也同樣只能使用,不能過載。finally:異常處理時提供finally 塊來執行任何清除操作。finalize:方法名;Java 技術允許使用finalize() 方法在垃圾收集器,將物件從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用時,對這個物件呼叫的。它是在Object 類中定義的,因此所有的類都繼承了它。子類覆蓋finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除物件之前對這個物件呼叫的。
5、類Example A 繼承Exception,類ExampleB 繼承Example A;
有如下程式碼片斷:
try{ throw new ExampleB(“b”); }catch(ExampleA e){ System.out.printfln(“ExampleA”); }catch(Exception e){ System.out.printfln(“Exception”); }
輸出的內容應該是:
A:ExampleA B:Exception C:b D:無
答:輸出為A。
6、介紹JAVA 中的Collection FrameWork(及如何寫自己的資料結構)
答:Collection FrameWork 如下:
Collection
├List元素可以重複,有序(存入順序和取出順序一致)
│├LinkedList底層資料結構是連結串列,查詢慢,增刪快,執行緒不安全效率高。
│├ArrayList底層資料結構是陣列,查詢快,增刪慢,執行緒不安全效率高。
│└Vector底層資料結構是陣列,查詢快,增刪慢,執行緒安全效率低。
│ └Stack
└Set元素無序,不可以重複。
├HashSet執行緒不安全,存取速度快。
└TreeSet執行緒不安全,可以對Set集合中的元素進行排序。
Map
├Hashtable執行緒安全,速度快。底層是雜湊表資料結構。是同步的。不允許null作為鍵,null作為值
├HashMap執行緒不安全,速度慢。底層也是雜湊表資料結構。是不同步的。允許null作為鍵,null作為值。替代了Hashtable.
└WeakHashMap可以用來對Map集合中的鍵進行排序。
Collection 是最基本的集合介面,一個Collection 代表一組Object,即Collection 的元素(Elements); Map 提供key 到value 的對映。
Collection 和 Collections的區別
Collection是集合類的上級介面,子介面主要有Set 和List、Map。
Collections是針對集合類的一個幫助類,提供了操作集合的工具方法:一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。
7、你所知道的集合類都有哪些?主要方法有哪些?
答:最常用的集合類是List 和Map。List 的具體實現包括ArrayList 和Vector,它們是可變大小的列表,比較適合構建、儲存和操作任何型別物件的元素列表。List 適用於按數值索引訪問元素的情形。Map 提供了一個更通用的元素儲存方法。Map 集合類用於儲存元素對(稱作“鍵”和“值”),其中每個鍵對映到一個值。
8、說出ArrayList,Vector, LinkedList 的儲存效能和特性?
答:ArrayList 和Vector 都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢,Vector 由於使用了synchronized 方法(執行緒安全),通常效能上較ArrayList 差,而LinkedList 使用雙向連結串列實現儲存,按序號索引資料需要進行前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。
9、Collection 和Collections 的區別?
答:Collection 是java.util 下的介面,它是各種集合的父介面,繼承於它的介面主要有Set 和List;Collections 是個java.util 下的類,是針對集合的幫助類,提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。
10、HashMap 和Hashtable 的區別?
答:二者都實現了Map 介面,是將惟一鍵對映到特定的值上;主要區別在於:
1)HashMap 沒有排序,允許一個null 鍵和多個null 值,而Hashtable 不允許;
2)HashMap 把Hashtable 的contains 方法去掉了,改成containsvalue 和containsKey,因為contains 方法容易讓人引起誤解;
3)Hashtable 繼承自Dictionary 類,HashMap 是Java1.2 引進的Map 介面的實現;
4)Hashtable 的方法是Synchronize 的,而HashMap 不是,在多個執行緒訪問Hashtable 時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。Hashtable 和HashMap 採用的hash/rehash 演算法大致一樣,所以效能不會有很大的差異。
11、Arraylist 與Vector 區別?
答:就ArrayList 與Vector 主要從二方面來說:
1)同步性:Vector 是執行緒安全的(同步),而ArrayList 是執行緒序不安全的;
2)資料增長:當需要增長時,Vector 預設增長一倍,而ArrayList 卻是一半。
12、List、Map、Set 三個介面,存取元素時,各有什麼特點?
答:List 以特定次序來持有元素,可有重複元素。Set 無法擁有重複元素,內部排序。Map 儲存key-value 值,value 可多值。
13、Set 裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?
答:Set 裡的元素是不能重複的,用equals ()方法來區分重複與否。覆蓋equals()方法用來判斷物件的內容是否相同,而”==”判斷地址是否相等,用來決定引用值是否指向同一物件。
14、用程式給出隨便大小的10 個數,序號為1-10,按從小到大順序輸出,並輸出相應的序號。
答:程式碼如下:
import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Random; public class RandomSort { public static void printRandomBySort() { Random random = new Random(); // 建立隨機數生成器 List<Integer> list = new ArrayList<Integer>(); // 生成10 個隨機數,並放在集合list 中 for (int i = 0; i < 10; i++) { list.add(random.nextInt(1000)); } Collections.sort(list); // 對集合中的元素進行排序 //第一種輸出方法 Iterator<Integer> it = list.iterator(); int count = 0; while (it.hasNext()) { // 順序輸出排序後集閤中的元素 System.out.println(++count + ": " + it.next()); } //第二種輸出方法 for (Integer integer : list) { System.out.println(integer); } } public static void main(String[] args) { printRandomBySort(); } }
15、用JAVA 實現一種排序,JAVA 類實現序列化的方法?在COLLECTION 框架中,實現比較要實現什麼樣的介面?
答:用選擇排序程式碼如下:
public class ChooseSort { private int[] array; private int length; public ChooseSort(int[] array) { this.array = array; this.length = array.length; } /** * 列印陣列中的所有元素 */ public void display() { for (int i : array) { System.out.print(i + " "); } System.out.println(); } /** * 選擇排序演算法 */ public void chooseSort() { for (int i = 0; i < length - 1; i++) {// 做第i趟排序 int minIndex = i; for (int j = minIndex + 1; j < length; j++) {// 選最小的記錄 if (array[minIndex]>array[j]) { minIndex = j;// 記下目前找到的最小值所在的位置 } } // 在內層迴圈結束,也就是找到本輪迴圈的最小的數以後,再進行交換 if (i != minIndex) { // 交換a[i]和a[minIndex] int temp = array[i]; array[i] = array[minIndex]; array[minIndex] = temp; } } } public static void main(String[] args) { int[] array = { 100, 45, 36, 21, 17, 13, 7 }; ChooseSort cs = new ChooseSort(array); System.out.println("排序前的資料為:"); cs.display(); cs.chooseSort(); System.out.println("排序後的資料為:"); cs.display(); } }
JAVA 類實現序例化的方法是實現java.io.Serializable 介面;Collection 框架中實現比較要實現Comparable 介面和Comparator 介面。
16、sleep() 和wait() 有什麼區別?
答:sleep 是執行緒類(Thread)的方法,使此執行緒暫停執行並指定時間,把執行機會給其他執行緒,但是監控狀態依然保持,到時後會自動恢復。呼叫sleep 不會釋放物件鎖。wait 是Object 類的方法,對物件呼叫wait 方法導致本執行緒放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件發出notify 方法(或notifyAll)後本執行緒才進入物件鎖定池準備,獲得物件鎖進入執行狀態。
17、當一個執行緒進入一個物件的一個synchronized 方法後,其它執行緒是否可進入此物件的其它方法?
答:其它執行緒只能訪問該物件的其它非同步方法,同步方法則不能進入。
18、請說出你所知道的執行緒同步的方法。
答:wait():使一個執行緒處於等待狀態,並且釋放所持有的物件的lock;sleep():使一個正在執行的執行緒處於睡眠狀態,是一個靜態方法,呼叫此方法要捕捉InterruptedException 異常;notify():喚醒一個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並不能確切的喚醒某一個等待狀態的執行緒,而是由JVM 確定喚醒哪個執行緒,而且不是按優先順序;
notityAll():喚醒所有處入等待狀態的執行緒,注意並不是給所有喚醒執行緒一個物件的鎖,而是讓它們互相競爭。
19、多執行緒有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼?
答:多執行緒有兩種實現方法,分別是繼承Thread 類與實現Runnable 介面,同步的實現方面有兩種,分別是synchronized,wait 與notify。
20、同步和非同步有何異同,在什麼情況下使用他們?舉例說明。
答:如果資料將線上程間共享。例如正在寫的資料以後可能被另一個執行緒讀到,或者正在讀的資料可能已經被另一個執行緒寫過了,那麼這些資料就是共享資料,必須進行同步存取。當應用程式在物件上呼叫了一個需要花費很長時間來執行的方法,並且不希望讓程式等待方法的返回時,就應該使用非同步程式設計,在很多情況下采用非同步途徑往往更有效率。
21、啟動一個執行緒是用run()還是start()?
答:啟動一個執行緒是呼叫start()方法,使執行緒所代表的虛擬處理機處於可執行狀態,這意味著它可以由JVM 排程並執行。這並不意味著執行緒就會立即執行。當cpu分配給它時間時,才開始執行run()方法(如果有的話)。start()是方法,它呼叫run()方法.而run()方法是你必須重寫的. run()方法中包含的是執行緒的主體。
22、執行緒的基本概念、執行緒的基本狀態以及狀態之間的關係?
答:執行緒指在程式執行過程中,能夠執行程式程式碼的一個執行單位,每個程式至少都有一個執行緒,也就是程式本身;Java 中的執行緒有四種狀態分別是:執行、就緒、掛起、結束。
23、簡述synchronized 和java.util.concurrent.locks.Lock 的異同?
答:相同點:Lock 能完成synchronized 所實現的所有功能;
不同點:Lock 有比synchronized 更精確的執行緒語義和更好的效能。synchronized 會自動釋放鎖,而Lock 一定要求程式設計師手工釋放,並且必須在finally中釋放。
24、java 中有幾種方法可以實現一個執行緒?用什麼關鍵字修飾同步方法?stop()和suspend()方法為何不推薦使用?
答:有兩種實現方法,分別是繼承Thread 類與實現Runnable 介面;用synchronized 關鍵字修飾同步方法;反對使用stop(),是因為它不安全。它會解除由執行緒獲取的所有鎖定,而且如果物件處於一種不連貫狀態,那麼其他執行緒能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在;suspend()方法容易發生死鎖。呼叫suspend()的時候,目標執行緒會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何執行緒都不能訪問鎖定的資源,除非被“掛起”的執行緒恢復執行。對任何執行緒來說,如果它們想恢復目標執行緒,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。故不應該使用suspend(),而應在自己的Thread 類中置入一個標誌,指出執行緒應該活動還是掛起。若標誌指出執行緒應該掛起,便用wait()命其進入等待狀態。若標誌指出執行緒應當恢復,則用一個notify()重新啟動執行緒。
25、設計4 個執行緒,其中兩個執行緒每次對j 增加1,另兩個執行緒對j 每次減少1;寫出程式。
答:以下程式使用內部類實現執行緒,對j 增減的時候沒有考慮順序問題:
public class TestThread { private int j; public TestThread(int j) { this.j = j; } //增加j private synchronized void inc() { j++; System.out.println(j + "--Inc--" + Thread.currentThread().getName()); } //減少j private synchronized void dec() { j--; System.out.println(j + "--Dec--" + Thread.currentThread().getName()); } public void run() { new Dec().start(); new Thread(new Inc()).start(); new Dec().start(); new Thread(new Inc()).start(); } class Dec extends Thread { public void run() { for (int i = 0; i < 100; i++) { dec(); } } } class Inc implements Runnable { public void run() { for (int i = 0; i < 100; i++) { inc(); } } } public static void main(String[] args) { new TestThread(5).run(); } }
26、什麼是java 序列化,如何實現java 序列化?
答:序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決在對物件流進行讀寫操作時所引發的問題;序列化的實現:將需要被序列化的類實現Serializable 介面,該介面沒有需實現的方法,implements Serializable 只是為了標註該物件是可被序列化的。
27、java 中有幾種型別的流?JDK 為每種型別的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
答:位元組流,字元流。位元組流繼承於InputStream、OutputStream,字元流繼承於Reader、Writer。在java.io 包中還有許多其他的流,主要是為了提高效能和使用方便。
28、檔案和目錄(IO)操作:
1)如何列出某個目錄下的所有檔案?
2)如何列出某個目錄下的所有子目錄?
3)如何判斷一個檔案或目錄是否存在?
4)如何讀寫檔案?
答:1)示例程式碼如下:
File file = new File("e:"); File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isFile()) System.out.println(files[i]); }
2)示例程式碼如下:
File file = new File("e:\\"); File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) System.out.println(files[i]); }
3)建立File 物件,呼叫其exsit()方法即可返回是否存在,如:
System.out.println(new File("d:\\t.txt").exists());
4)示例程式碼如下:
public class Test { public static void main(String[] args) throws IOException { // 讀檔案: FileInputStream fin = new FileInputStream("e:\\tt.txt"); byte[] bs = new byte[100]; while (true) { int len = fin.read(bs); if (len <= 0) break; System.out.print(new String(bs, 0, len)); } fin.close(); // 寫檔案: FileWriter fw = new FileWriter("e:\\test.txt"); //System.getProperty("line.separator")相當於"/n"\n’ 這樣寫的話,剔除了平臺無關性 fw.write("hello world!" + System.getProperty("line.separator")); fw.write("你好!鄭州!"); fw.close(); } }
29、寫一個方法,輸入一個檔名和一個字串,統計這個字串在這個檔案中出現的次數。
答:程式碼如下:
public static int countWords(String file, String find) throws Exception { int count = 0; Reader in = new FileReader(file); int c; while ((c = in.read()) != -1) { while (c == find.charAt(0)) { for (int i = 1; i < find.length(); i++) { c = in.read(); if (c != find.charAt(i)) break; if (i == find.length() - 1) count++; } } } return count; }
30、Java 的通訊程式設計,程式設計題(或問答),用JAVA SOCKET 程式設計,讀伺服器幾個字元,再寫入本地顯示?
答:Server 端程式:
import java.net.*; import java.io.*; public class Server { private ServerSocket ss; private Socket socket; private BufferedReader in; private PrintWriter out; public Server() { try { //建立 ServerSocket 物件(並繫結埠) ss = new ServerSocket(10000); while (true) { //呼叫 accept 方法,等待來自客戶端的連線 socket = ss.accept(); String RemoteIP = socket.getInetAddress().getHostAddress(); String RemotePort = ":" + socket.getLocalPort(); System.out.println("A client come in!IP:" + RemoteIP + RemotePort); //呼叫 getXXXStream 方法,進行 I/O操作 in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = in.readLine(); System.out.println("Cleint send is :" + line); out = new PrintWriter(socket.getOutputStream(), true); out.println("Your Message Received!"); out.close(); in.close(); //關閉 Socket socket.close(); } } catch (IOException e) { out.println("wrong"); } } public static void main(String[] args) { new Server(); } }
Client 端程式:
import java.io.*; import java.net.*; public class Client { Socket socket; BufferedReader in; PrintWriter out; public Client() { try { System.out.println("Try to Connect to 127.0.0.1:10000"); //1.建立 Socket 物件,並連線伺服器 (ip字串,埠號) socket = new Socket("127.0.0.1", 10000); System.out.println("The Server Connected!"); System.out.println("Please enter some Character:"); BufferedReader line = new BufferedReader(new InputStreamReader(System.in)); out = new PrintWriter(socket.getOutputStream(), true); out.println(line.readLine()); //2.呼叫 getXXXStream 方法,進行 I/O操作 in = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println(in.readLine()); out.close(); in.close(); //3、關閉 Socket socket.close(); } catch (IOException e) { out.println("Wrong"); } } public static void main(String[] args) { new Client(); } }