Java面試題 corejava(二)

65JAVA 語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別表明什麼意義?在try 塊中能夠拋出異常嗎?【基礎】java

答: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 語句。程序員

66、運行時異常與通常異常有何異同?【基礎】算法

答:異常表示程序運行過程當中可能出現的非正常狀態,運行時異常表示虛擬機的一般操做中可能遇到的異常,是一種常見運行錯誤。java 編譯器要求方法必須聲明拋出可能發生的非運行時異常,可是並不要求必須聲明拋出未被捕獲的運行時異常。編程

67、給我一個你最多見到的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

68final, finally, finalize 的區別? 【基礎】

答:final:修飾符(關鍵字);若是一個類被聲明爲final,意味着它不能再派生出新的子類,不能做爲父類被繼承,所以一個類不能既被聲明爲abstract的,又被聲明爲final 的;將變量或方法聲明爲final,能夠保證它們在使用中不被改變;被聲明爲final 的變量必須在聲明時給定初值,而在之後的引用中只能讀取,不可修改;被聲明爲final 的方法也一樣只能使用,不能重載。finally:再異常處理時提供finally 塊來執行任何清除操做;若是拋出一個異常,那麼相匹配的catch 子句就會執行,而後控制就會進入finally 塊(若是有的話)。finalize:方法名;Java 技術容許使用finalize() 方法在垃圾收集器將對象從內存中清除出去以前作必要的清理工做。這個方法是由垃圾收集器在肯定這個對象沒有被引用時對這個對象調用的。它是在Object 類中定義的,所以全部的類都繼承了它。子類覆蓋finalize() 方法以整理系統資源或者執行其餘清理工做。finalize() 方法是在垃圾收集器刪除對象以前對這個對象調用的。

69、類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。

集合部分:(共11 題:基礎11 道)

70、介紹JAVA 中的Collection FrameWork(及如何寫本身的數據結構)【基礎】

答:Collection FrameWork 以下:

Collection

├List

│├LinkedList

│├ArrayList

│└Vector

│ └Stack

└Set

Map

├Hashtable

├HashMap

└WeakHashMap

Collection 是最基本的集合接口,一個Collection 表明一組Object,即Collection 的元素(Elements); Map 提供key 到value 的映射。

71List,Set,Map 是否繼承自Collection 接口?【基礎】

答:List,Set 是;Map 不是。

72、你所知道的集合類都有哪些?主要方法?【基礎】

答:最經常使用的集合類是List 和Map。List 的具體實現包括ArrayList 和Vector,它們是可變大小的列表,比較適合構建、存儲和操做任何類型對象的元素列表。List 適用於按數值索引訪問元素的情形。Map 提供了一個更通用的元素存儲方法。Map 集合類用於存儲元素對(稱做「鍵」和「值」),其中每一個鍵映射到一個值。

73、說出ArrayList,Vector, LinkedList 的存儲性能和特性?【基礎】

答:ArrayList 和Vector 都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增長和插入元素,它們都容許直接按序號索引元素,可是插入元素要涉及數組元素移動等內存操做,因此索引數據快而插入數據慢,Vector 因爲使用了synchronized 方法(線程安全),一般性能上較ArrayList 差,而LinkedList 使用雙向鏈表實現存儲,按序號索引數據須要進行前向或後向遍歷,可是插入數據時只須要記錄本項的先後項便可,因此插入速度較快。

74Collection Collections 的區別?【基礎】

答:Collection 是java.util 下的接口,它是各類集合的父接口,繼承於它的接口主要有Set 和List;Collections 是個java.util 下的類,是針對集合的幫助類,提供一系列靜態方法實現對各類集合的搜索、排序、線程安全化等操做。

75HashMap 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 算法大體同樣,因此性能不會有很大的差別。

76Arraylist Vector 區別?【基礎】

答:就ArrayList 與Vector 主要從二方面來講:

1)同步性:Vector 是線程安全的(同步),而ArrayList 是線程序不安全的;

2)數據增加:當須要增加時,Vector 默認增加一倍,而ArrayList 倒是一半。

77ListMapSet 三個接口,存取元素時,各有什麼特色?【基礎】

答:List 以特定次序來持有元素,可有重複元素。Set 沒法擁有重複元素,內部排序。Map 保存key-value 值,value 可多值。

78Set 裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==仍是equals()? 它們有何區別? 【基礎】

答:Set 裏的元素是不能重複的,用equals ()方法來區分重複與否。覆蓋equals()方法用來判斷對象的內容是否相同,而」==」判斷地址是否相等,用來決定引用值是否指向同一對象。

79、用程序給出隨便大小的10 個數,序號爲1-10,按從小到大順序輸出,並輸出相應的序號。【基礎】

答:代碼以下:

package test;

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 list = new ArrayList();

// 生成10 個隨機數,並放在集合list 中

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

list.add(random.nextInt(1000));

}

Collections.sort(list); // 對集合中的元素進行排序

Iterator it = list.iterator();

int count = 0;

while (it.hasNext()) { // 順序輸出排序後集閤中的元素

System.out.println(++count + ": " + it.next());

}

}

public static void main(String[] args) {

printRandomBySort();

}

}

80、用JAVA 實現一種排序,JAVA 類實現序列化的方法?COLLECTION 框架中,實現比較要實現什麼樣的接口?【基礎】

答:用插入法進行排序代碼以下:

package test;

import java.util.*;

class InsertSort {

ArrayList al;

public InsertSort(int num,int mod) {

al = new ArrayList(num);

Random rand = new Random();

System.out.println("The ArrayList Sort Before:");

for (int i=0;i<num ;i++ ){

al.add(new Integer(Math.abs(rand.nextInt()) % mod +

1));

System.out.println("al["+i+"]="+al.get(i));

}

}

public void SortIt(){

tempInt;

int MaxSize=1;

for(int i=1;i<al.size();i++){

tempInt = (Integer)al.remove(i);

if(tempInt.intValue() >=

((Integer)al.get(MaxSize-1)).intValue()){

al.add(MaxSize,tempInt);

MaxSize++;

System.out.println(al.toString());

}else{

for (int j=0;j<MaxSize ;j++ ){

if (((Integer)al.get(j)).intValue()

>=tempInt.intValue()){

al.add(j,tempInt);

MaxSize++;

System.out.println(al.toString());

break;

}

}

}

}

System.out.println("The ArrayList Sort After:");

for(int i=0;i<al.size();i++){

System.out.println("al["+i+"]="+al.get(i));

}

}

public static void main(String[] args){

InsertSort is = new InsertSort(10,100);

is.SortIt();

}

}

JAVA 類實現序例化的方法是實現java.io.Serializable 接口;Collection 框架中實現比較要實現Comparable 接口和Comparator 接口。

線程部分:(共10 題:基礎7 道,中等難度3 道)

81sleep() wait() 有什麼區別? 【基礎】

答:sleep 是線程類(Thread)的方法,致使此線程暫停執行指定時間,給執行機會給其餘線程,可是監控狀態依然保持,到時後會自動恢復。調用sleep 不會釋放對象鎖。wait 是Object 類的方法,對此對象調用wait 方法致使本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify 方法(或notifyAll)後本線程才進入對象鎖定池準備得到對象鎖進入運行狀態。

82、當一個線程進入一個對象的一個synchronized 方法後,其它線程是否可進入此對象的其它方法? 【基礎】

答:其它線程只能訪問該對象的其它非同步方法,同步方法則不能進入。

83、請說出你所知道的線程同步的方法。【基礎】

答:wait():使一個線程處於等待狀態,而且釋放所持有的對象的lock;sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException 異常;notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM 肯定喚醒哪一個線程,並且不是按優先級;

notityAll():喚醒全部處入等待狀態的線程,注意並非給全部喚醒線程一個對象的鎖,而是讓它們競爭。

84、多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼? 【基礎】

答:多線程有兩種實現方法,分別是繼承Thread 類與實現Runnable 接口,同步的實現方面有兩種,分別是synchronized,wait 與notify。

85、同步和異步有何異同,在什麼狀況下分別使用他們?舉例說明。【基礎】

答:若是數據將在線程間共享。例如正在寫的數據之後可能被另外一個線程讀到,或者正在讀的數據可能已經被另外一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。當應用程序在對象上調用了一個須要花費很長時間來執行的方法,而且不但願讓程序等待方法的返回時,就應該使用異步編程,在不少狀況下采用異步途徑每每更有效率。

86、啓動一個線程是用run()仍是start()?【基礎】

答:啓動一個線程是調用start()方法,使線程所表明的虛擬處理機處於可運行狀態,這意味着它能夠由JVM 調度並執行。這並不意味着線程就會當即運行。run()方法能夠產生必須退出的標誌來中止一個線程。

87、線程的基本概念、線程的基本狀態以及狀態之間的關係?【基礎】

答:線程指在程序執行過程當中,可以執行程序代碼的一個執行單位,每一個程序至少都有一個線程,也就是程序自己;Java 中的線程有四種狀態分別是:運行、就緒、掛起、結束。

88、簡述synchronized java.util.concurrent.locks.Lock 的異同?【中等難度】

答:主要相同點:Lock 能完成synchronized 所實現的全部功能;主要不一樣點:Lock 有比synchronized 更精確的線程語義和更好的性能。synchronized 會自動釋放鎖,而Lock 必定要求程序員手工釋放,而且必須在finally 從句中釋放。

89java 中有幾種方法能夠實現一個線程?用什麼關鍵字修飾同步方法?stop()suspend()方法爲什麼不推薦使用?【中等難度】

答:有兩種實現方法,分別是繼承Thread 類與實現Runnable 接口;用synchronized 關鍵字修飾同步方法;反對使用stop(),是由於它不安全。它會解除由線程獲取的全部鎖定,並且若是對象處於一種不連貫狀態,那麼其餘線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在;suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這以前得到的鎖定。此時,其餘任何線程都不能訪問鎖定的資源,除非被「掛起」的線程恢復運行。對任何線程來講,若是它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會形成死鎖。故不該該使用suspend(),而應在本身的Thread 類中置入一個標誌,指出線程應該活動仍是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()從新啓動線程。

90、設計4 個線程,其中兩個線程每次對j 增長1,另兩個線程對j 每次減小1;寫出程序。【中等難度】

答:如下程序使用內部類實現線程,對j 增減的時候沒有考慮順序問題:

public class TestThread {

private int j;

public TestThread(int j) {this.j = j;}

private synchronized void inc(){

j++;

System.out.println(j + "--Inc--" +

Thread.currentThread().getName());

}

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();

}

}

IO 流及Socket 部分:(共5 題:基礎5 道)

91、什麼是java 序列化,如何實現java 序列化?【基礎】

答:序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。能夠對流化後的對象進行讀寫操做,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操做時所引起的問題;序列化的實現:將須要被序列化的類實現Serializable 接口,該接口沒有需實現的方法,implements Serializable 只是爲了標註該對象是可被序列化的,而後使用一個輸出流(如FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream 對象的writeObject(Object obj)方法就能夠將參數爲obj 的對象寫出(即保存其狀態),要恢復的話則用輸入流。

92java 中有幾種類型的流?JDK 爲每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?【基礎】

答:字節流,字符流。字節流繼承於InputStream、OutputStream,字符流繼承於Reader、Writer。在java.io 包中還有許多其餘的流,主要是爲了提升性能和使用方便。

93、文件和目錄(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)示例代碼以下:

//讀文件:

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");

fw.write("hello world!" + System.getProperty("line.separator"));

fw.write("你好!北京!");

fw.close();

9四、寫一個方法,輸入一個文件名和一個字符串,統計這個字符串在這個文件中出現的次數。【基礎】

答:代碼以下:

public 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;

}

95Java 的通訊編程,編程題(或問答),用JAVA SOCKET 編程,讀服務器幾個字符,再寫入本地顯示?【基礎】

答:Server 端程序:

package test;

import java.net.*;

import java.io.*;

public class Server{

private ServerSocket ss;

private Socket socket;

private BufferedReader in;

private PrintWriter out;

public Server(){

try {

ss=new ServerSocket(10000);

while(true){

socket = ss.accept();

String RemoteIP =

socket.getInetAddress().getHostAddress();

String RemotePort = ":"+socket.getLocalPort();

System.out.println("A client come in!IP:"

+ RemoteIP+RemotePort);

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.close();

}

}catch (IOException e){

out.println("wrong");

}

}

public static void main(String[] args){

new Server();

}

}

Client 端程序:

package test;

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");

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());

in = new BufferedReader(

new InputStreamReader(socket.getInputStream()));

System.out.println(in.readLine());

out.close();

in.close();

socket.close();

}catch(IOException e){

out.println("Wrong");

}

}

public static void main(String[] args) {

new Client();

}

}

相關文章
相關標籤/搜索