導航:首頁 > 編程語言 > java面試常見演算法題

java面試常見演算法題

發布時間:2023-08-17 13:06:20

❶ 重分懸賞java面試問題

JAVA程序員面試32問

第一,談談final, finally, finalize的區別。
第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)?

第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。

第四,&和&&的區別。

第五,HashMap和Hashtable的區別。

第六,Collection 和 Collections的區別。

第七,什麼時候用assert。

第八,GC是什麼? 為什麼要有GC?

第九,String s = new String("xyz");創建了幾個String Object?

第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

第十一,short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

第十二,sleep() 和 wait() 有什麼區別?

第十三,Java有沒有goto?

第十四,數組有沒有length()這個方法? String有沒有length()這個方法?

第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?

第十六,Set里的元素是不能重復的,那麼用什麼方法來區分重復與否呢? 是用==還是equals()? 它們有何區別?

第十七,給我一個你最常見到的runtime exception。

第十八,error和exception有什麼區別?

第十九,List, Set, Map是否繼承自Collection介面?

第二十,abstract class和interface有什麼區別?

第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?

第二十二,介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體類(concrete class)?

第二十三,啟動一個線程是用run()還是start()?

第二十四,構造器Constructor是否可被override?

第二十五,是否可以繼承String類?

第二十六,當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?

第二十七,try {}里有一個return語句,那麼緊跟在這個try後的finally {}里的code會不會被執行,什麼時候被執行,在return前還是後?

第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?

第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

第三十,當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這里到底是值傳遞還是引用傳遞?

第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

第三十二,編程題: 寫一個Singleton出來。

以下是答案

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

第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)?
匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作為一個介面,由另一個內部類實現。

第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。
Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。Java內部類與C++嵌套類最大的不同就在於是否有指向外部的引用上。具體可見http: //www.frontfree.net/articles/services/view.asp?id=704&page=1
註: 靜態內部類(Inner Class)意味著1創建一個static內部類的對象,不需要一個外部類對象,2不能從一個static內部類的一個對象訪問一個外部類對象

第四,&和&&的區別。
&是位運算符。&&是布爾邏輯運算符。

第五,HashMap和Hashtable的區別。
都屬於Map介面的類,實現了將惟一鍵映射到特定的值上。
HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。
Hashtable 類似於 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因為它是同步的。

第六,Collection 和 Collections的區別。
Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。
Collection是個java.util下的介面,它是各種集合結構的父介面。

第七,什麼時候用assert。
斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式為 true。如果表達式計算為 false,那麼系統會報告一個 AssertionError。它用於調試目的:
assert(a > 0); // throws an AssertionError if a <= 0
斷言可以有兩種形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 應該總是產生一個布爾值。
Expression2 可以是得出一個值的任意表達式。這個值用於生成顯示更多調試信息的 String 消息。
斷言在默認情況下是禁用的。要在編譯時啟用斷言,需要使用 source 1.4 標記:
javac -source 1.4 Test.java
要在運行時啟用斷言,可使用 -enableassertions 或者 -ea 標記。
要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。
要系統類中啟用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啟用或者禁用斷言。
可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用於驗證傳遞給私有方法的參數。不過,斷言不應該用於驗證傳遞給公有方法的參數,因為不管是否啟用了斷言,公有方法都必須檢查其參數。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試後置條件。另外,斷言不應該以任何方式改變程序的狀態。

第八,GC是什麼? 為什麼要有GC? (基礎)。
GC是垃圾收集器。Java 程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()

第九,String s = new String("xyz");創建了幾個String Object?
兩個對象,一個是「xyx」,一個是指向「xyx」的引用對象s。

第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

第十一,short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型。可修改為s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。

第十二,sleep() 和 wait() 有什麼區別? 搞線程的最愛
sleep()方法是使線程停止一段時間的方法。在sleep 時間間隔期滿後,線程不一定立即恢復執行。這是因為在那個時刻,其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)「醒來」的線程具有更高的優先順序
(b)正在運行的線程因為其它原因而阻塞。
wait()是線程交互時,如果線程對一個同步對象x 發出一個wait()調用,該線程會暫停執行,被調對象進入等待狀態,直到被喚醒或等待時間到。

第十三,Java有沒有goto?
Goto—java中的保留字,現在沒有在java中使用。

第十四,數組有沒有length()這個方法? String有沒有length()這個方法?
數組沒有length()這個方法,有length的屬性。
String有有length()這個方法。

第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被「屏蔽」了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

第十六,Set里的元素是不能重復的,那麼用什麼方法來區分重復與否呢? 是用==還是equals()? 它們有何區別?
Set里的元素是不能重復的,那麼用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相等。
equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。

第十七,給我一個你最常見到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, , DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

第十八,error和exception有什麼區別?
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。
exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。

第十九,List, Set, Map是否繼承自Collection介面?
List,Set是

Map不是

第二十,abstract class和interface有什麼區別?
聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基本行為的類,並為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變數,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。
介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。多繼承性可通過實現這樣的介面而獲得。介面中的所有方法都是抽象的,沒有一個有程序體。介面只可以定義static final成員變數。介面的實現與子類相似,除了該實現類不能從介面定義中繼承行為。當類實現特殊介面時,它定義(即將程序體給予)所有這種介面的方法。然後,它可以在實現了該介面的類的任何對象上調用介面的方法。由於有抽象類,它允許使用介面名作為引用變數的類型。通常的動態聯編將生效。引用可以轉換到介面類型或從介面類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了介面。

第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?
都不能

第二十二,介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體類(concrete class)?
介面可以繼承介面。抽象類可以實現(implements)介面,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。

第二十三,啟動一個線程是用run()還是start()?
啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處於可運行狀態,這意味著它可以由JVM調度並執行。這並不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。

第二十四,構造器Constructor是否可被override?
構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。

第二十五,是否可以繼承String類?
String類是final類故不可以繼承。

第二十六,當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?
不能,一個對象的一個synchronized方法只能由一個線程訪問。

第二十七,try {}里有一個return語句,那麼緊跟在這個try後的finally {}里的code會不會被執行,什麼時候被執行,在return前還是後?
會執行,在return前執行。

第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?
有C背景的程序員特別喜歡問這種問題。

2 << 3

第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
不對,有相同的hash code。

第三十,當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這里到底是值傳遞還是引用傳遞?
是值傳遞。Java 編程語言只由值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。

第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。long,string 都不能作用於swtich。

第三十二,編程題: 寫一個Singleton出來。
Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。
一般Singleton模式通常有幾種種形式:
第一種形式: 定義一個類,它的構造函數為private的,它有一個static的private的該類變數,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。
public class Singleton {
private Singleton(){}
//在自己內部定義自己一個實例,是不是很奇怪?
//注意這是private 只供內部調用
private static Singleton instance = new Singleton();
//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次
//使用時生成實例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其他形式:
定義一個類,它的構造函數為private的,所有方法為static的。
一般認為第一種形式要更加安全些
第三十三 Hashtable和HashMap
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現

HashMap允許將null作為一個entry的key或者value,而Hashtable不允許

還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在
多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap
就必須為之提供外同步。

Hashtable和HashMap採用的hash/rehash演算法都大概一樣,所以性能不會有很大的差異。

❷ JAVA題目

J2EE Java2平台企業版
string是引用數據類型
如何取得年月日,小時分秒
public static void main(String[] args)
{
ActionListener time = new ActionListener() { // 監聽事件,不然實現不了動態改變時間
public void actionPerformed(ActionEvent e) {
//date對象代表當前的系統時間(毫秒)
Date date = new Date();
//format對象是用來以指定的時間格式格式化時間的
SimpleDateFormat from = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss"); //這里的格式可以自己設置
//format()方法是用來格式化時間的方法
String times = from.format(date);
System.out.println(times); }
};
Timer tim = new Timer(1000, time); //這里表示1000毫秒更新一下時間
tim.start(); //啟動
}

我這個答案肯定正確啊
下面幫你解釋你的答案吧
Date //是在java.util.Date;裡面
SimpleDateForma //這個是java.text.SimpleDateFormat;用來輸出問本格式的
DateFormat //應該是在java.util.*;裡面吧..應該是的

你那個錯誤是編譯就沒通過啊
public class Test
那你那個編譯寫的因該是
javac Test.java 編譯的應該是類啊而不是javac time.java 請問你的time什麼意思呢,所以你報的異常是找不到time類啊
呵呵...你是初學java吧該答的我都答完了拉!還特地幫你每句都寫

如何讀寫文件
StringBuffer sb = new StringBuffer();
//File file = new FileWindow().load();
File file;
file = new File("F:/jtest/from.txt");
TextReader tr = new TextReader(file);
sb.append(tr.readAll());
Out.println(sb.toString());
String [] tags = {"\"", " ", "'"};
String str;
str = sb.toString();
for(String reg: tags) {
Out.println(reg);

str = str.replaceAll(reg, "");
}
Out.println(str);
抽象類和介面的區別
聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基本行為的類,並為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變數,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。
介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。多繼承性可通過實現這樣的介面而獲得。介面中的所有方法都是抽象的,沒有一個有程序體。介面只可以定義static final成員變數。介面的實現與子類相似,除了該實現類不能從介面定義中繼承行為。當類實現特殊介面時,它定義(即將程序體給予)所有這種介面的方法。然後,它可以在實現了該介面的類的任何對象上調用介面的方法。由於有抽象類,它允許使用介面名作為引用變數的類型。通常的動態聯編將生效。引用可以轉換到介面類型或從介面類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了介面。
主鍵是確定資料庫中的表的記錄的唯一標識欄位,可以是表中的一個欄位,也可以是表中的多個欄位組成的。一旦確定為主鍵,則該欄位不可為空也不可以重復。比如學生表中的學號就可以定義成該表的欄位
外鍵的定義是相對於主鍵而言的,比如另有一張成績表,表中也出現了學生表中的對應學號欄位,則相對於學生表,學號就是成績表的外鍵
String和StringBuffer的區別
STRING的長度是不可變的,STRINGBUFFER的長度是可變的。如果你對字元串中的內容經常進行操作,特別是內容要修改時,那麼使用StringBuffer,如果最後需要String,那麼使用StringBuffer的toString()方法
try{}catch(){}finally{}結構,try{}內出現異常,try{}內剩下尚未執行的代碼還執行嗎,finally{}內的代碼呢?finally{}後面的代碼呢
執行 finally{}內的代碼最後執行
排序演算法

所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。

分類

在計算機科學所使用的排序演算法通常被分類為:

計算的復雜度(最差、平均、和最好表現),依據串列(list)的大小(n)。一般而言,好的表現是O。(n log n),且壞的行為是Ω(n2)。對於一個排序理想的表現是O(n)。僅使用一個抽象關鍵比較運算的排序演算法總平均上總是至少需要Ω(n log n)。

記憶體使用量(以及其他電腦資源的使用)

穩定度:穩定排序演算法會依照相等的關鍵(換言之就是值)維持紀錄的相對次序。也就是一個排序演算法是穩定的,就是當有兩個有相等關鍵的紀錄R和S,且在原本的串列中R出現在S之前,在排序過的串列中R也將會是在S之前。

一般的方法:插入、交換、選擇、合並等等。交換排序包含冒泡排序(bubble sort)和快速排序(quicksort)。選擇排序包含shaker排序和堆排序(heapsort)。

當相等的元素是無法分辨的,比如像是整數,穩定度並不是一個問題。然而,假設以下的數對將要以他們的第一個數字來排序。

(4, 1) (3, 1) (3, 7) (5, 6)

在這個狀況下,有可能產生兩種不同的結果,一個是依照相等的鍵值維持相對的次序,而另外一個則沒有:

(3, 1) (3, 7) (4, 1) (5, 6) (維持次序)

(3, 7) (3, 1) (4, 1) (5, 6) (次序被改變)

不穩定排序演算法可能會在相等的鍵值中改變紀錄的相對次序,但是穩定排序演算法從來不會如此。不穩定排序演算法可以被特別地時作為穩定。作這件事情的一個方式是人工擴充鍵值的比較,如此在其他方面相同鍵值的兩個物件間之比較,就會被決定使用在原先資料次序中的條目,當作一個同分決賽。然而,要記住這種次序通常牽涉到額外的空間負擔。

排列演算法列表

在這個表格中,n是要被排序的紀錄數量以及k是不同鍵值的數量。

穩定的

冒泡排序(bubble sort) — O(n2)

雞尾酒排序 (Cocktail sort, 雙向的冒泡排序) — O(n2)

插入排序 (insertion sort)— O(n2)

桶排序 (bucket sort)— O(n); 需要 O(k) 額外 記憶體

計數排序 (counting sort) — O(n+k); 需要 O(n+k) 額外 記憶體

歸並排序 (merge sort)— O(n log n); 需要 O(n) 額外記憶體

原地歸並排序 — O(n2)

二叉樹排序 (Binary tree sort) — O(n log n); 需要 O(n) 額外記憶體

鴿巢排序 (Pigeonhole sort) — O(n+k); 需要 O(k) 額外記憶體

基數排序 (radix sort)— O(n·k); 需要 O(n) 額外記憶體

Gnome sort — O(n2)

Library sort — O(n log n) with high probability, 需要 (1+ε)n 額外記憶體

不穩定

選擇排序 (selection sort)— O(n2)

希爾排序 (shell sort)— O(n log n) 如果使用最佳的現在版本

Comb sort — O(n log n)

堆排序 (heapsort)— O(n log n)

Smoothsort — O(n log n)

快速排序 (quicksort)— O(n log n) 期望時間, O(n2) 最壞情況; 對於大的、亂數串列一般相信是最快的已知排序

Introsort — O(n log n)

Patience sorting — O(n log n + k) 最外情況時間, 需要 額外的 O(n + k) 空間, 也需要找到最長的遞增子序列(longest increasing subsequence)

不實用的排序演算法

Bogo排序 — O(n × n!) 期望時間, 無窮的最壞情況。

Stupid sort — O(n3); 遞回版本需要 O(n2) 額外記憶體

Bead sort — O(n) or O(√n), 但需要特別的硬體

Pancake sorting — O(n), 但需要特別的硬體

排序的演算法

排序的演算法有很多,對空間的要求及其時間效率也不盡相同。下面列出了一些常見的排序演算法。這裡面插入排序和冒泡排序又被稱作簡單排序,他們對空間的要求不高,但是時間效率卻不穩定;而後面三種排序相對於簡單排序對空間的要求稍高一點,但時間效率卻能穩定在很高的水平。基數排序是針對關鍵字在一個較小范圍內的排序演算法。

插入排序

冒泡排序

選擇排序

快速排序

堆排序

歸並排序

基數排序

希爾排序

插入排序

插入排序是這樣實現的:

首先新建一個空列表,用於保存已排序的有序數列(我們稱之為"有序列表")。

從原數列中取出一個數,將其插入"有序列表"中,使其仍舊保持有序狀態。

重復2號步驟,直至原數列為空。

插入排序的平均時間復雜度為平方級的,效率不高,但是容易實現。它藉助了"逐步擴大成果"的思想,使有序列表的長度逐漸增加,直至其長度等於原列表的長度。

冒泡排序

冒泡排序是這樣實現的:

首先將所有待排序的數字放入工作列表中。

從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大於他的下一位,則將它與它的下一位交換。

重復2號步驟,直至再也不能交換。

冒泡排序的平均時間復雜度與插入排序相同,也是平方級的,但也是非常容易實現的演算法。

選擇排序

選擇排序是這樣實現的:

設數組內存放了n個待排數字,數組下標從1開始,到n結束。

i=1

從數組的第i個元素開始到第n個元素,尋找最小的元素。

將上一步找到的最小元素和第i位元素交換。

如果i=n-1演算法結束,否則回到第3步

選擇排序的平均時間復雜度也是O(n²)的。

快速排序

現在開始,我們要接觸高效排序演算法了。實踐證明,快速排序是所有排序演算法中最高效的一種。它採用了分治的思想:先保證列表的前半部分都小於後半部分,然後分別對前半部分和後半部分排序,這樣整個列表就有序了。這是一種先進的思想,也是它高效的原因。因為在排序演算法中,演算法的高效與否與列表中數字間的比較次數有直接的關系,而"保證列表的前半部分都小於後半部分"就使得前半部分的任何一個數從此以後都不再跟後半部分的數進行比較了,大大減少了數字間不必要的比較。但查找數據得另當別論了。

堆排序

堆排序與前面的演算法都不同,它是這樣的:

首先新建一個空列表,作用與插入排序中的"有序列表"相同。

找到數列中最大的數字,將其加在"有序列表"的末尾,並將其從原數列中刪除。

重復2號步驟,直至原數列為空。

堆排序的平均時間復雜度為nlogn,效率高(因為有堆這種數據結構以及它奇妙的特徵,使得"找到數列中最大的數字"這樣的操作只需要O(1)的時間復雜度,維護需要logn的時間復雜度),但是實現相對復雜(可以說是這里7種演算法中比較難實現的)。

看起來似乎堆排序與插入排序有些相像,但他們其實是本質不同的演算法。至少,他們的時間復雜度差了一個數量級,一個是平方級的,一個是對數級的。

平均時間復雜度

插入排序 O(n2)

冒泡排序 O(n2)

選擇排序 O(n2)

快速排序 O(n log n)

堆排序 O(n log n)

歸並排序 O(n log n)

基數排序 O(n)

希爾排序 O(n1.25)
一、術語session
在我的經驗里,session這個詞被濫用的程度大概僅次於transaction,更加有趣的是transaction與session在某些語境下的含義是相同的。

session,中文經常翻譯為會話,其本來的含義是指有始有終的一系列動作/消息,比如打電話時從拿起電話撥號到掛斷電話這中間的一系列過程可以稱之為一個session。有時候我們可以看到這樣的話「在一個瀏覽器會話期間,...」,這里的會話一詞用的就是其本義,是指從一個瀏覽器窗口打開到關閉這個期間①。最混亂的是「用戶(客戶端)在一次會話期間」這樣一句話,它可能指用戶的一系列動作(一般情況下是同某個具體目的相關的一系列動作,比如從登錄到選購商品到結賬登出這樣一個網上購物的過程,有時候也被稱為一個transaction),然而有時候也可能僅僅是指一次連接,也有可能是指含義①,其中的差別只能靠上下文來推斷②。

然而當session一詞與網路協議相關聯時,它又往往隱含了「面向連接」和/或「保持狀態」這樣兩個含義,「面向連接」指的是在通信雙方在通信之前要先建立一個通信的渠道,比如打電話,直到對方接了電話通信才能開始,與此相對的是寫信,在你把信發出去的時候你並不能確認對方的地址是否正確,通信渠道不一定能建立,但對發信人來說,通信已經開始了。「保持狀態」則是指通信的一方能夠把一系列的消息關聯起來,使得消息之間可以互相依賴,比如一個服務員能夠認出再次光臨的老顧客並且記得上次這個顧客還欠店裡一塊錢。這一類的例子有「一個TCP session」或者「一個POP3 session」③。

而到了web伺服器蓬勃發展的時代,session在web開發語境下的語義又有了新的擴展,它的含義是指一類用來在客戶端與伺服器之間保持狀態的解決方案④。有時候session也用來指這種解決方案的存儲結構,如「把xxx保存在session里」⑤。由於各種用於web開發的語言在一定程度上都提供了對這種解決方案的支持,所以在某種特定語言的語境下,session也被用來指代該語言的解決方案,比如經常把Java里提供的javax.servlet.http.HttpSession簡稱為session⑥。

鑒於這種混亂已不可改變,本文中session一詞的運用也會根據上下文有不同的含義,請大家注意分辨。
在本文中,使用中文「瀏覽器會話期間」來表達含義①,使用「session機制」來表達含義④,使用「session」表達含義⑤,使用具體的「HttpSession」來表達含義⑥

二、HTTP協議與狀態保持
HTTP協議本身是無狀態的,這與HTTP協議本來的目的是相符的,客戶端只需要簡單的向伺服器請求下載某些文件,無論是客戶端還是伺服器都沒有必要紀錄彼此過去的行為,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關系一樣。

然而聰明(或者貪心?)的人們很快發現如果能夠提供一些按需生成的動態信息會使web變得更加有用,就像給有線電視加上點播功能一樣。這種需求一方面迫使HTML逐步添加了表單、腳本、DOM等客戶端行為,另一方面在伺服器端則出現了CGI規范以響應客戶端的動態請求,作為傳輸載體的HTTP協議也添加了文件上載、cookie這些特性。其中cookie的作用就是為了解決HTTP協議無狀態的缺陷所作出的努力。至於後來出現的session機制則是又一種在客戶端與伺服器之間保持狀態的解決方案。

讓我們用幾個例子來描述一下cookie和session機制之間的區別與聯系。筆者曾經常去的一家咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就需要某種方式來紀錄某位顧客的消費數量。想像一下其實也無外乎下面的幾種方案:
1、該店的店員很厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎麼對待了。這種做法就是協議本身支持狀態。
2、發給顧客一張卡片,上面記錄著消費的數量,一般還有個有效期限。每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以後的消費相聯系起來。這種做法就是在客戶端保持狀態。
3、發給顧客一張會員卡,除了卡號之外什麼信息也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店裡的紀錄本上找到這個卡號對應的紀錄添加一些消費信息。這種做法就是在伺服器端保持狀態。

由於HTTP協議是無狀態的,而出於種種考慮也不希望使之成為有狀態的,因此,後面兩種方案就成為現實的選擇。具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要藉助於cookie機制來達到保存標識的目的,但實際上它還有其他選擇。

三、理解cookie機制
cookie機制的基本原理就如上面的例子一樣簡單,但是還有幾個問題需要解決:「會員卡」如何分發;「會員卡」的內容;以及客戶如何使用「會員卡」。

正統的cookie分發是通過擴展HTTP協議來實現的,伺服器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie。

而cookie的使用是由瀏覽器按照一定的原則在後台自動發送給伺服器的。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用范圍大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給伺服器。意思是麥當勞的會員卡只能在麥當勞的店裡出示,如果某家分店還發行了自己的會員卡,那麼進這家店的時候除了要出示麥當勞的會員卡,還要出示這家店的會員卡。

cookie的內容主要包括:名字,值,過期時間,路徑和域。
其中域可以指定某一個域比如.google.com,相當於總店招牌,比如寶潔公司,也可以指定一個域下的具體某台機器比如www.google.com或者froogle.google.com,可以用飄柔來做比。
路徑就是跟在域名後面的URL路徑,比如/或者/foo等等,可以用某飄柔專櫃做比。
路徑與域合在一起就構成了cookie的作用范圍。
如果不設置過期時間,則表示這個cookie的生命期為瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就消失了。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不存儲在硬碟上而是保存在內存里,當然這種行為並不是規范規定的。如果設置了過期時間,瀏覽器就會把cookie保存到硬碟上,關閉後再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。

存儲在硬碟上的cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗口。而對於保存在內存里的cookie,不同的瀏覽器有不同的處理方式。對於IE,在一個打開的窗口上按Ctrl-N(或者從文件菜單)打開的窗口可以與原窗口共享,而使用其他方式新開的IE進程則不能共享已經打開的窗口的內存cookie;對於Mozilla Firefox0.8,所有的進程和標簽頁都可以共享同樣的cookie。一般來說是用javascript的window.open打開的窗口會與原窗口共享內存cookie。瀏覽器對於會話cookie的這種只認cookie不認人的處理方式經常給採用session機制的web應用程序開發者造成很大的困擾。

下面就是一個goolge設置cookie的響應頭的例子
HTTP/1.1 302 Found
Location: http://www.google.com/intl/zh-CN/
Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Content-Type: text/html

這是使用HTTPLook這個HTTP Sniffer軟體來俘獲的HTTP通訊紀錄的一部分

瀏覽器在再次訪問goolge的資源時自動向外發送cookie

使用Firefox可以很容易的觀察現有的cookie的值
使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。

IE也可以設置在接受cookie前詢問

這是一個詢問接受cookie的對話框。

四、理解session機制
session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。

當程序需要為某個客戶端的請求創建一個session的時候,伺服器首先檢查這個客戶端的請求里是否已包含了一個session標識 - 稱為session id,如果已包含一個session id則說明以前已經為此客戶端創建過session,伺服器就按照session id把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重復,又不容易被找到規律以仿造的字元串,這個session id將被在本次響應中返回給客戶端保存。

保存這個session id的方式可以採用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發揮給伺服器。一般這個cookie的名字都是類似於SEEESIONID,而。比如weblogic對於web應用程序生成的cookie,jsESSIONID=!-145788764,它的名字就是JSESSIONID。

由於cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞回伺服器。經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面,附加方式也有兩種,一種是作為URL路徑的附加信息,表現形式為http://...../xxx;jsessionid=!-145788764
另一種是作為查詢字元串附加在URL後面,表現形式為http://...../xxx?jsessionid=!-145788764
這兩種方式對於用戶來說是沒有區別的,只是伺服器在解析的時候處理的方式不同,採用第一種方式也有利於把session id的信息和正常程序參數區分開來。
為了在整個交互過程中始終保持狀態,就必須在每個客戶端可能請求的路徑後面都包含這個session id。

另一種技術叫做表單隱藏欄位。就是伺服器會自動修改表單,添加一個隱藏欄位,以便在表單提交時能夠把session id傳遞回伺服器。比如下面的表單
<form name="testform" action="/xxx">
<input type="text">
</form>
在被傳遞給客戶端之前將被改寫成
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="!-145788764">
<input type="text">
</form>
這種技術現在已較少應用,筆者接觸過的很古老的iPlanet6(SunONE應用伺服器的前身)就使用了這種技術。
實際上這種技術可以簡單的用對action應用URL重寫來代替。

在談論session機制的時候,常常聽到這樣一種誤解「只要關閉瀏覽器,session就消失了」。其實可以想像一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session來說也是一樣的,除非程序通知伺服器刪除一個session,否則伺服器會一直保留,程序一般都是在用戶做log off的時候發個指令去刪除session。然而瀏覽器從來不會主動在關閉之前通知伺服器它將要關閉,因此伺服器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器後這個session id就消失了,再次連接伺服器時也就無法找到原來的session。如果伺服器設置的cookie被保存到硬碟上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的session id發送給伺服器,則再次打開瀏覽器仍然能夠找到原來的session。

恰恰是由於關閉瀏覽器不會導致session被刪除,迫使伺服器為seesion設置了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,伺服器就可以認為客戶端已經停止了活動,才會把session刪除以節省存儲空間。

五、理解javax.servlet.http.HttpSession
HttpSession是Java平台對session機制的實現規范,因為它僅僅是個介面,具體到每個web應用伺服器的提供商,除了對規范支持之外,仍然會有一些規范里沒有規定的細微差異。這里我們以BEA的Weblogic Server8.1作為例子來演示。

首先,Weblogic Server提供了一系列的參數來控制它的HttpSession的實現,包括使用cookie的開關選項,使用URL重寫的開關選項,session持久化的設置,session失效時間的設置,以及針對cookie的各種設置,比如設置cookie的名字、路徑、域,cookie的生存時間等。

一般情況下,session都是存儲在內存里,當伺服器進程被停止或者重啟的時候,內存里的session也會被清空,如果設置了session的持久化特性,伺服器就會把session保存到硬碟上,當伺服器進程重新啟動或這些信息將能夠被再次使用,Weblogic Server支持的持久性方式包括文件、資料庫、客戶端cookie保存和復制。

復制嚴格說來不算持久化保存,因為session實際上還是保存在內存里,不過同樣的信息被復制到各個cluster內的伺服器進程中,這樣即使某個伺服器進程停止工作也仍然可以從其他進程中取得session。

cookie生存時間的設置則會影響瀏覽器生成的cookie是否是一個會話cookie。默認是使用會話cookie。有興趣的可以用它來試驗我們在第四節里提到的那個誤解。

cookie的路徑對於web應用程序來說是一個非常重要的選項,Weblogic Server對這個選項的默認處理方式使得它與其他伺服器有明顯的區別。後面我們會專題討論。

關於session的設置參考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869

~~我要200分~~

❸ java經典面試題

整數劃分問題
正整數n的劃分數p(n)=q(n,n)
代碼回:答
public static int q(int n,int m){
if((n==1)||(n<1)) return 0;
if (n<m return q(n,n));
if (n==m) return q(n,m-1)+1;
return q(n,m-1)+q(n-m,m);
}

❹ 誰有比較全面的的Java面試題

JAVA 面試題匯總
一、 JAVA 基礎知識
1、面向對象的特徵有哪些方面
1.抽象:
抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。
2.繼承:
繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和實例變數,並且類可以修改或增加新的方法使之更適合特殊的需要。
3.封裝:
封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的介面訪問其他對象。
4. 多態性:
多態性是指允許不同類的對象對同一消息作出響應。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行為共享、代碼共享的優勢,很好的解決了應用程序函數同名問題。
2、String 是最基本的數據類型嗎?
基本數據類型包括byte、int、char、long、float、double、boolean 和short。
java.lang.String 類是final 類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用StringBuffer 類
3、int 和 Integer 有什麼區別
Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。Int 是java 的原始數據類型,Integer是java 為int 提供的封裝類。Java 為每個原始類型提供了封裝類。
原始類型封裝類
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
引用類型和原始類型的行為完全不同,並且它們具有不同的語義。引用類型和原始類型具有不同的特徵和用法,它們包括:大小和速度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的預設值。對象引用實例變數的預設值為 null,而原始類型實例變數的預設值與它們的類型有關。
4、String 和StringBuffer 的區別
JAVA 平台提供了兩個類:String 和StringBuffer,它們可以儲存和操作字元串,即包含多個字元的字元數據。這個String 類提供了數值不可改變的字元串。而這個StringBuffer 類提供的字元串進行修改。當你知道字元數據要改變的時候你就可以使用StringBuffer 。典型地,你可以使用
StringBuffers 來動態構造字元數據。
5、運行時異常與一般異常有何異同?
異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java 編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未被捕獲的運行時異常。
6、說出Servlet 的生命周期,並說出Servlet 和CGI 的區別。
Servlet 被伺服器實例化後,容器運行其init 方法,請求到達時運行其service 方法,service 方法自動派遣運行與請求對應的doXXX 方法(doGet,doPost)等,當伺服器決定將實例銷毀的時候調用其destroy 方法。
與cgi 的區別在於servlet 處於伺服器進程中,它通過多線程方式運行其service 方法,一個實例可以服務於多個請求,並且其實例一般不會銷毀,而CGI 對每個請求都產生新的進程,服務完成後就銷毀,所以效率上低於servlet。
7、說出ArrayList,Vector, LinkedList 的存儲性能和特性
ArrayList 和Vector 都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector 由於使用了synchronized 方法(線程安全),通常性能上較ArrayList差,而LinkedList 使用雙向鏈表實現存儲,按序號索引數據需要進行前向或後向遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入速度較快。
8、EJB 是基於哪些技術實現的?並說出SessionBean 和EntityBean 的區別,StatefulBean 和StatelessBean 的區別。
EJB 包括Session Bean、Entity Bean、Message Driven Bean,基於JNDI、RMI、JAT 等技術實現。
SessionBean 在J2EE 應用程序中被用來完成一些伺服器端的業務操作,例如訪問資料庫、調用其他EJB 組件。EntityBean 被用來代表應用系統中用到的數據。
對於客戶機,SessionBean 是一種非持久性對象,它實現某些在伺服器上運行的業務邏輯。對於客戶機,EntityBean 是一種持久性對象,它代表一個存儲在持久性存儲器中的實體的對象視圖,或是一個由現有企業應用程序實現的實體。
Session Bean 還可以再細分為 Stateful Session Bean 與 Stateless Session Bean ,這兩種的 Session Bean 都可以將系統邏輯放在 method 之中執行,不同的是 Stateful Session Bean 可以記錄呼叫者的狀態,因此通常來說,一個使用者會有一個相對應的 Stateful Session Bean 的實體。
Stateless Session Bean 雖然也是邏輯組件,但是他卻不負責記錄使用者狀態,也就是說當使用者呼叫 Stateless Session Bean 的時候, EJB Container 並不會找尋特定的 Stateless Session Bean 的實體來執行這個 method。換言之,很可能數個使用者在執行某個 Stateless Session Bean 的 methods 時,會是同一個 Bean 的 Instance 在執行。從內存方面來看, Stateful Session Bean 與 Stateless Session Bean 比較, Stateful Session Bean 會消耗 J2EE Server 較多的內存,然而 Stateful Session Bean 的優勢卻在於他可以維持使用者的狀態。
9、Collection 和 Collections 的區別。
Collection 是集合類的上級介面,繼承與他的介面主要有Set 和List.
Collections 是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
10、&和&&的區別。
&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and)。
11、HashMap 和Hashtable 的區別。
HashMap 是Hashtable 的輕量級實現(非線程安全的實現),他們都完成了Map 介面,主要區別在於HashMap 允許空(null)鍵值(key),由於非線程安全,效率上可能高於Hashtable。
HashMap 允許將null 作為一個entry 的key 或者value,而Hashtable 不允許。
HashMap 把Hashtable 的contains 方法去掉了,改成containsvalue 和containsKey。因為contains方法容易讓人引起誤解。Hashtable 繼承自Dictionary 類,而HashMap 是Java1.2 引進的Map interface 的一個實現。最大的不同是,Hashtable 的方法是Synchronize 的,而HashMap 不是,在多個線程訪問Hashtable,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。Hashtable 和HashMap 採用的hash/rehash 演算法都大概一樣,所以性能不會有很大的差異。
12、final, finally, finalize 的區別。
final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。finally 是異常處理語句結構的一部分,表示總是執行。
finalize 是Object 類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。
final—修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract 的,又被聲明為final 的。將變數或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final 的變數必須在聲明時給定初值,而在以後的引用中只能讀取,不可修改。被聲明為final 的方法也同樣只能使用,不能重載。
finally—再異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)。
finalize—方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。
13、sleep() 和 wait() 有什麼區別?
sleep 是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復。調用sleep 不會釋放對象鎖。
wait 是Object 類的方法,對此對象調用wait 方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify 方法(或notifyAll)後本線程才進入對象鎖定池准備獲得對象鎖進入運行狀態。
sleep()方法是使線程停止一段時間的方法。在sleep 時間間隔期滿後,線程不一定立即恢復執行。這是因為在那個時刻,其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)「醒來」的線程具有更高的優先順序 (b)正在運行的線程因為其它原因而阻塞。wait()是線程交互時,如果線程對一個同步對象x 發出一個wait()調用,該線程會暫停執行,被調對象進入等待狀態,直到被喚醒或等待時間到。
14、Overload 和Override 的區別。Overloaded 的方法是否可以改變返回值的類型?
方法的重寫Overriding 和重載Overloading 是Java 多態性的不同表現。重寫Overriding 是父類與子類之間多態性的一種表現,重載Overloading 是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被「屏蔽」了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。
Overloaded 的方法是可以改變返回值的類型。
15、error 和exception 有什麼區別?
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。
exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。
16、同步和非同步有何異同,在什麼情況下分別使用他們?舉例說明。
如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。
當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用非同步編程,在很多情況下採用非同步途徑往往更有效率。
17、abstract class 和interface 有什麼區別?
聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基本行為的類,並為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變數,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。多繼承性可通過實現這樣的介面而獲得。介面中的所有方法都是抽象的,沒有一個有程序體。介面只可以定義static final 成員變數。介面的實現與子類相似,除了該實現類不能從介面定義中繼承行為。當類實現特殊介面時,它定義(即將程序體給予)所有這種介面的方法。然後,它可以在實現了該介面的類的任何對象上調用介面的方法。由於有抽象類,它允許使用介面名作為引用變數的類型。通常的動態聯編將生效。引用可以轉換到介面類型或從介面類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了介面。
18、heap 和stack 有什麼區別。
棧是一種線形集合,其添加和刪除元素的操作應在同一段完成。棧按照後進先出的方式進行處理。堆是棧的一個組成元素
19、forward 和redirect 的區別
forward 是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL 的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道伺服器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。
redirect 就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數重新請求,所以session,request 參數都可以獲取。
20、EJB 與JAVA BEAN 的區別?
Java Bean 是可復用的組件,對Java Bean 並沒有嚴格的規范,理論上講,任何一個Java 類都可以是一個Bean。但通常情況下,由於Java Bean 是被容器所創建(如Tomcat)的,所以Java Bean 應具有一個無參的構造器,另外,通常Java Bean 還要實現Serializable 介面用於實現Bean 的持久性。Java Bean 實際上相當於微軟COM 模型中的本地進程內COM 組件,它是不能被跨進程訪問的。Enterprise Java Bean 相當於DCOM,即分布式組件。它是基於Java 的遠程方法調用(RMI)技術的,所以EJB 可以被遠程訪問(跨進程、跨計算機)。但EJB 必須被布署在諸如Webspere、WebLogic 這樣的容器中,EJB 客戶從不直接訪問真正的EJB 組件,而是通過其容器訪問。EJB 容器是EJB 組件的代理,EJB 組件由容器所創建和管理。客戶通過容器來訪問真正的EJB 組件。
21、Static Nested Class 和 Inner Class 的不同。
Static Nested Class 是被聲明為靜態(static)的內部類,它可以不依賴於外部類實例被實例化。而通常的內部類需要在外部類實例化後才能實例化。
22、JSP 中動態INCLUDE 與靜態INCLUDE 的區別?
動態INCLUDE 用jsp:include 動作實現 <jsp:include page="included.jsp" flush="true"/>它總是會檢查所含文件中的變化,適合用於包含動態頁面,並且可以帶參數。
靜態INCLUDE 用include 偽碼實現, 定不會檢查所含文件的變化, 適用於包含靜態頁面
<%@ include file="included.htm" %>
23、什麼時候用assert。
assertion(斷言)在軟體開發中是一種常用的調試方式,很多開發語言中都支持這種機制。在實現中,assertion 就是在程序中的一條語句,它對一個boolean 表達式進行檢查,一個正確程序必須保證這個boolean 表達式的值為true;如果該值為false,說明程序已經處於不正確的狀態下,系統將給出警告或退出。一般來說,assertion 用於保證程序最基本、關鍵的正確性。assertion 檢查通常在開發和測試時開啟。為了提高性能,在軟體發布後,assertion 檢查通常是關閉的。
斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式為 true。如果表達式計算為false,那麼系統會報告一個 Assertionerror。它用於調試目的:assert(a > 0); // throws an Assertionerror if a <= 0
斷言可以有兩種形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 應該總是產生一個布爾值。
Expression2 可以是得出一個值的任意表達式。這個值用於生成顯示更多調試信息的 String 消息。斷言在默認情況下是禁用的。要在編譯時啟用斷言,需要使用 source 1.4 標記:javac -source 1.4 Test.java
要在運行時啟用斷言,可使用 -enableassertions 或者 -ea 標記。
要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。
要系統類中啟用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啟用或者禁用斷言。
可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用於驗證傳遞給私有方法的參數。不過,斷言不應該用於驗證傳遞給公有方法的參數,因為不管 是否啟用了斷言,公有方法都必須檢查其參數。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試後置條件。另外,斷言不應該以任何方式改變程序 的狀態。
24、GC 是什麼? 為什麼要有GC?
GC 是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java 提供的GC 功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java 語言沒有提供釋放已分配內存的顯示操作方法。
25、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
short s1 = 1; s1 = s1 + 1; (s1+1 運算結果是int 型,需要強制轉換類型)
short s1 = 1; s1 += 1;(可以正確編譯)
26、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)==12
Math.round(-11.5)==-11
round 方法返回與參數最接近的長整數,參數加1/2 後求其floor.
27、String s = new String("xyz" ;創建了幾個String Object?
兩個對象,一個是「xyx」,一個是指向「xyz」的引用對象s。
28、如果系統要使用超大整數(超過long 長度范圍),請你設計一個數據結構來存儲這種超大型數字以及設計一種演算法來實現超大整數加法運算)。
public class BigInt()
{
int[] ArrOne = new ArrOne[1000];
String intString="";
public int[] Arr(String s)

{
intString = s;
for(int i=0;i<ArrOne.leght;i++)
29、Java 有沒有goto?
java 中的保留字,現在沒有在java 中使用。
30、啟動一個線程是用run()還是start()?
啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處於可運行狀態,這意味著它可以由JVM 調度並執行。這並不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。

來個郵箱了,太多了傳不上去。我可以發給你。

❺ java 面試題

Spring的一大特點是利用配置的xml文件實現依賴注入。
所謂依賴注入是指把一個業務對象注入另一個業務對象,從而達到
對象間的松耦合。
下面我們來舉個例子。

http://davidgjy.javaeye.com/blog/437501
還是看看這里吧

那個延遲載入性能好,因為需要使用時才從資料庫里載入,減少沒必要的

延時載入:優點,大數據量時,可以逐條數據獲取.缺點,與資料庫產生長連接.
即時載入,優點,減少資料庫連接,只連接與查詢一次.缺點,大數據量時容易讓資料庫癱瘓
下面的哥們說的對

❻ 有Java面試題嗎

java面試題:如何解決內存溢出

第一對所有的代碼包括頁面中的java代碼都進行一遍徹底的回顧檢查,
1.對那些靜態(static)的對象要特別留神,特別是類型為Map,List,Set的,靜態的變數會一直駐存在內存中,生命周期比較長,不會被垃圾器回收。
2.對於代碼,要審查是否生成了大量的冗餘的對象,還有一些邏輯業務處理的類,
演算法是否過於復雜,調整演算法,對於代碼認真審查,再仔細重構一遍代碼,能提高代碼質量,提高程序運行穩定性。
3.Java中的內存溢出大都是因為棧中的變數太多了。其實內存有的是。建議不用的盡量設成null以便回收,多用局部變數,少用成員變數。
1),變數所包含的對象體積較大,佔用內存較多。
2),變數所包含的對象生命周期較長。
3),變數所包含的對象數據穩定。
4),該類的對象實例有對該變數所包含的對象的共享需求。
4.在我的程序中對靜態變數的優化後,使程序佔用內存量至少提升了5k-10k。所以也不容忽視。
第二還有就是String類相關的東西:
1.字元串累加的時候一定要用StringBuffer的append方法,不要使用+操作符連接兩個字元串。差別很大。而且在循環或某些重復執行的動作中不要去創建String對象,因為String對象是要用StringBuffer對象來處理的,一個String對象應該是產生了 3個對象(大概是這樣:))。
2.字元串length()方法來取得字元串長度的時候不要把length放到循環中,可以在循環外面對其取值。(包括vector的size方法)。特別是循環次數多的時候,盡量把length放到循環外面。
int size = xmlVector.size();
for (int i = 2; i < size; i++) {
...
}
3 .寫代碼的時候處理內存溢出
try{
//do sth
....
}catch (outofmemoryerror e){//可以用一個共通函數來執行.
system.out.print (「no memory! 」);
system.gc();
//do sth again
....
}
1. 對於頻繁申請內存和釋放內存的操作,還是自己控制一下比較好,但是System.gc()的方法不一定適用,最好使用finallize強制執行或者寫自己的finallize方法。 Java 中並不保證每次調用該方法就一定能夠啟動垃圾收集,它只不過會向JVM發出這樣一個申請,到底是否真正執行垃圾收集,一切都是個未知數。

❼ 我要面試了,給些java面試基礎問題,在線等

一、Java基礎知識
1.Java有那些基本數據類型,String是不是基本數據類型,他們有何區別。
2.字元串的操作:
寫一個方法,實現字元串的反轉,如:輸入abc,輸出cba
寫一個方法,實現字元串的替換,如:輸入bbbwlirbbb,輸出bbbhhtccc。
3.數據類型之間的轉換
如何將數值型字元轉換為數字(Integer,Double)
如何將數字轉換為字元
如何取小數點前兩位,並四捨五入。
4.日期和時間
如何取得年月日,小時分秒
如何取得從1970年到現在的毫秒數
如何獲取某個日期是當月的最後一天
如何格式化日期
5.數組和集合
6.文件和目錄(I/O)操作
如何列出某個目錄下的所有文件
如何列出某個目錄下的所有子目錄
判斷一個文件或目錄是否存在
如何讀寫文件
7.Java多態的實現(繼承、重載、覆蓋)
8.編碼轉換,怎樣實現將GB2312編碼的字元串轉換為ISO-8859-1編碼的字元串。
9.Java中訪問資料庫的步驟,Statement和PreparedStatement之間的區別。
10.找出下列代碼可能存在的錯誤,並說明原因:

二、JSP&Servlet技術
1.描述JSP和Servlet的區別、共同點、各自應用的范圍
2.在Web開發中需要處理HTML標記時,應做什麼樣的處理,要篩選那些字元(< > & 「」)
3.在JSP中如何讀取客戶端的請求,如何訪問CGI變數,如何確定某個Jsp文件的真實路徑。
4.描述Cookie和Session的作用,區別和各自的應用范圍,Session工作原理。
5.列出Jsp中包含外部文件的方式,兩者有何區別。
6.說明Jsp中errorPage的作用,應用范圍。
7.介紹在Jsp中如何使用JavaBeans。
8.簡單介紹JSP的標記庫
9.Jsp和Servlet中的請求轉發分別如何實現。

三、J2EE相關知識
1.介紹J2EE、J2SE、J2SE的區別。
2.J2EE是一種技術還是一種平台,他提供了那些技術。
3.什麼是Application Server,它有什麼功能和優點。
4.簡單介紹連接池的優點和原理。
5.Web.xml的作用

四、其他
1.Web安全性的考慮(表單驗證、瀏覽器Basic方式的驗證,應用程序的安全性,SSL,代碼考慮)
2.簡單介紹您所了解的MVC。
3.簡單介紹所了解的XML。
4.文檔和編碼規范
5.Java中的分頁、效率考慮。
6.簡單介紹您所了解的structs。
.xml在項目中的作用
2.s-EJB 與 e-EJB的區別
3.會話面的作用
4.cmp與bmp的優缺點
5.j2me程序的必需的幾個部分
6.c/s與b/s的區別
7.構建一個connect pool,然後再調用它,
8.j2ee平台與dotnet平台的區別

9.ejb的life cycle
10.session bean 和 entity bean的區別
11.ejb中的transaction機制
12.synchronized (生產者和消費)
13.String 和 StringBuffer
14.Serializable
15.MVC (Struts的工作流程)
16.什麼是MDA

17.tcp與udp的區別
18.鏈表與散列表和數組的區別
19.堆和棧的區別
20.ejb的分類及區別
21.你對現在軟體業以及國內軟體業的看法
22.談談java多線程
23.談談文件加密技術
24.軟體開發生命周期
25.路由協議種類及特點
26.java的awt和swing組件的GUI設計的關鍵
27.對於java流的認識

28.簡單描述一下awt與swing區別。
29.簡述java編程中事件處理模式。
30.你編寫過applet嗎?applet的安全許可權如何?試列舉java application或者applet中與servlet/jsp通信可以採用的方式。

31.簡述邏輯操作(如&,|)與條件操作(如&&,||)的區別。
32.簡述 Java Server Page 和 Servlet 的聯系和區別。
33.簡述synchronized和java.util.concurrent.locks.Lock的異同 ?
34.EJB規范規定EJB中禁止的操作有哪些?
35.java除了8種基本類型外,在虛擬機里還有哪一種,有什麼作用?
36.除了使用new關鍵字創建對象意外,試列舉另外三種以上創建實例的方式?
37.classloader中,JDK的API、Classpath中的同web-inf中的class載入方式有什麼區別?
38.列舉三種以上垃圾回收演算法,並比較其優缺點?
39.編寫代碼實現一個線程池

40.描述一下JVM載入class文件的原理機制?
41.試舉例說明一個典型的垃圾回收演算法?
42.請用java寫二叉樹演算法,實現添加數據形成二叉樹功能,並以先序的方式列印出來.
43.請寫一個java程序實現線程連接池功能?
44.給定一個C語言函數,要求實現在java類中進行調用。

45.如何獲得數組的長度?
46.訪問修飾符「public/private/protected/預設的修飾符」的使用
47.用關鍵字final修飾一個類或者方法時,有何意義?
48.掌握類和對象的概念,掌握面向對象編程的本質
49.靜態變數和靜態方法的意義,如何引用一個類的靜態變數或者靜態方法?
50.JAVA語言如何進行異常處理,關鍵字:thorws,throw,try,catch,finally
51.Object類(或者其子類)的finalize()方法在什麼情況下被調用?
52.一個「.java」原文件中是否可以包括多個類(不是內部類)?
53.掌握內部類和介面的概念
54.StringTokenizer類的使用
55.數據結構,如何遍歷List中的元素?
如果要按照鍵值保存或者訪問數據,使用什麼數據結構?
要掌握Collection相關的介面和類的使用
56.使用StringBuffer類與String類進行字元串連接時有何區別?
57.調用Thread類的destroy()方法有什麼後果?
58.多線程,用什麼關鍵字修飾同步方法?stop()和suspend()方法為何不推薦使用?
59.使用socket建立客戶端與伺服器的通信的過程
60.JAVA語言國際化應用,Locale類,Unicode
61.描述反射機制的作用
62.如何讀寫一個文件?
63.在圖形界面中,一個按鈕如何處理滑鼠點擊事件?
64.在圖形界面中,一個表格,如何實現編輯單元格時彈出下拉框?
65.如何載入圖片?
66.什麼是模態對話框?
67.闡述MVC的概念
68.GUI布局管理器的使用,FlowLayout,BorderLayout,GridBagLayout
69.如何構造一棵樹?選擇樹的一個節點時,如何得到這個節點?
70.向編輯框中輸入字元時,如何控制只輸入整數?
71.描述使用JDBC連接資料庫的過程
72.EJB分為幾類?什麼是BMP,CMP?
73.什麼是JNDI?

74.ADO是什麼?ActiveX數據對象,是一個應用級程序介面.
75.四種JDBC方式?目前的版本?
76.EJB有哪幾種?區別是什麼?
77.JavaBean與EJB有什麼區別?
78.軟體開發生命周期有哪幾個階段?
79.軟體開發有哪些因素?
80.軟體開發中如何進行版本控制?
81.UML中,類視圖如何表示類中的繼承與聚合?
82.客戶端游標與伺服器端游標的區別?
83.動態游標與靜態游標的區別?
84.dotnet由哪幾個基本框架組成?
85.Oracle中SGA是什麼?
86.web servers是什麼?
87.UNIX中QT是什麼意思?
88.在軟體開發生命周期中的哪個階段開始測試?
89.dotnet與J2EE的比較?
90.什麼是ActiveX?
91.Java中IDL是什麼?
92.ISO9000和CMM是什麼?IS09000和CMM(軟體能力成熟度模型)認證是國際上通用的軟體質量評估方法.CMM的五個成熟度等級。

❽ 希音java面試有演算法嗎

有。常見的如下:
一是字元串,如果IDE沒有代碼自動補全功能,所以你應該記住下面的這些方法。
二是鏈表,在Java中,鏈表的實現非常簡單,每個節點Node都有一個值val和指向下個節點的鏈接next。鏈表兩個著名的應用是棧Stack和隊列Queue。
三是樹,這里的樹通常是指二叉樹,每個節點都包含一個左孩子節點和右孩子節點。
四是排序,五是遞歸vs.迭代。
六是動態規劃,動態規劃是解決下面這些性質類問題的技術:一個問題可以通過更小子問題的解決方法來解決(即問題的最優解包含了其子問題的最優解,也就是最優子結構性質)。
有些子問題的解可能需要計算多次(也就是子問題重疊性質)。子問題的解存儲在一張表格里,這樣每個子問題只用計算一次。需要額外的空間以節省時間。爬台階問題完全符合上面的四條性質,因此可以用動態規劃法來解決。

閱讀全文

與java面試常見演算法題相關的資料

熱點內容
javadbfreader 瀏覽:307
蘋果手機數字代碼是什麼 瀏覽:66
驅動程序順序安裝腳本 瀏覽:665
word文件里怎樣查重 瀏覽:219
mx5系統基帶版本 瀏覽:184
ntlea全域通win10 瀏覽:171
qq怎麼查看別人的收藏 瀏覽:135
地震三參數matlab程序 瀏覽:57
怎樣給優盤文件加密軟體 瀏覽:7
收拾文件有哪些小妙招 瀏覽:431
pdf文件去底網 瀏覽:253
win10重裝系統需要格式化c盤嗎 瀏覽:424
路由器trx文件 瀏覽:655
淘寶店鋪數據包怎麼做 瀏覽:195
win10鍵盤黏連 瀏覽:332
json如何生成表格 瀏覽:323
怎麼修復sql資料庫表 瀏覽:40
微信微博差別 瀏覽:163
簽到積分換禮品app 瀏覽:812
mfc最近打開文件 瀏覽:672

友情鏈接