一些經典的java面試題(轉載)


1、一個".java"源文件中是否可以包括多個類(不是內部類)?有什麼限制?

可以有多個類,但只能有一個 public 的類,並且 public 的類名必須與文件名相一致。

2、說說&和&&的區別。

&和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都爲 true 時,整個運算結果才爲 true,否則,只要有一方爲 false,則結果爲 false。

&&還具有短路的功能,即如果第一個表達式爲 false,則不再計算第二個表達式,例如,對於if(str != null&&!str.equals( “”))表達式,當str 爲 null 時,後面的表達式不會執行,所以不會出現NullPointerException 如果將&&改爲&,則會拋出 NullPointerException 異常。

If(x==33 &++y>0) y 會增長,If(x==33&& ++y>0)不會增長

&還可以用作位運算符,當&操作符兩邊的表達式不是boolean 類型時,&表示我們通常使用0x0f 來與一個整數進行&運算,來獲取該整數的最低4個 bit 位,例如,0x31 &

0x0f 的結果爲0x01。

3、在 JAVA 中如何跳出當前的多重嵌套循環?

在 Java 中,要想跳出多重循環,可以在外面的循環語句前定義一個標號,然後在裏層循環體的代碼中使用帶有標號的break 語句,即可跳出外層循環。例如,

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

for(intj=0;j<10;j++)                        {

System.out.println(“i=” + i + “,j=” + j); if(j == 5) break ok;

}

}

另外,我個人通常並不使用標號這種方式,而是讓外層的循環條件表達式的結果可以受到裏層循環體代碼的控制,例如,要在二維數組中查找到某個數字。

int arr[][] ={{1,2,3},{4,5,6,7},{9}};

boolean found = false;

for(inti=0;i<arr.length&& !found;i++)     {

for(int j=0;j<arr[i].length;j++){System.out.println(“i=” + i + “,j=” + j); if(arr[i][j] ==5) {

found = true; break;

}

}

}

4、IO流的分類

根據處理數據類型的不同分爲:字符流和字節流

根據數據流向不同分爲:輸入流和輸出流

字符流和字節流

字符流的由來: 因爲數據編碼的不同,而有了對字符進行高效操作的流對象。本質其實就是基於字節流讀取時,去查了指定的碼錶。字節流和字符流的區別:

(1)讀寫單位不同:字節流以字節(8bit)爲單位,字符流以字符爲單位,根據碼錶映射字符,一次可能讀多個字節。

(2)處理對象不同:字節流能處理所有類型的數據(如圖片、avi等),而字符流只能處理字符類型的數據。

(3)字節流在操作的時候本身是不會用到緩衝區的,是文件本身的直接操作的;而字符流在操作的時候下後是會用到緩衝區的,是通過緩衝區來操作文件,我們將在下面驗證這一點。

結論:優先選用字節流。首先因爲硬盤上的所有文件都是以字節的形式進行傳輸或者保存的,包括圖片等內容。但是字符只是在內存中才會形成的,所以在開發中,字節流使用廣泛。

輸入流和輸出流

對輸入流只能進行讀操作,對輸出流只能進行寫操作,程序中需要根據待傳輸數據的不同特性而使用不同的流。


 

 

5、switch 語句能否作用在 byte 上,能否作用在 long 上,能否作用在 String

 

上?

在 switch(expr1)中,expr1只能是一個整數表達式或者枚舉常量(更大字體),整數表達式可以是 int 基本類型或 Integer 包裝類型,由於,byte,short,char 都可以隱含轉換爲 int,按位與操作,所以,這些類型以及這些類型的包裝類型也是可以的。顯然,long 和 String 類型都不符合 switch 的語法規定,並且不能被隱式轉換成 int 類型,所以,它們不能作用於swtich 語句中。

 

6、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

 

對於 short s1= 1; s1 = s1 + 1;由於 s1+1運算時會自動提升表達式的類型,所以結果是 int型,再賦值給 short 類型 s1時,編譯器將報告需要強制轉換類型的錯誤。

 

對於 shorts1 = 1; s1 += 1; 由於 +=是 java 語言規定的運算符,java 編譯器會對它進行特殊處理,因此可以正確編譯。

 

7、char 型變量中能不能存貯一箇中文漢字?爲什麼?

 

char 型變量是用來存儲 Unicode 編碼的字符的,unicode 編碼字符集中包含了漢字,所以,char 型變量中當然可以存儲漢字啦。不過,如果某個特殊的漢字沒有被包含在 unicode 編碼字符集中,那麼,這個 char 型變量中就不能存儲這個特殊漢字。補充說明:unicode 編碼佔用兩個字節,所以,char 類型的變量也是佔用兩個字節。

 

8、用最有效率的方法算出 2 乘以 8 等於幾?

 

2 << 3,因爲將一個數左移 n 位,就相當於乘以了2的 n 次方,那麼,一個數乘以8只要將其左移3位即可,而位運算cpu 直接支持的,效率最高,所以,2乘以8等於幾的最效率的方法是2 << 3。

 

9、使用 final 關鍵字修飾一個變量時,是引用不能變,還是引用的對象不能變?

 

使用 final 關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內容還是可以改變的。例如,對於如下語句:

 

final StringBuffer a=newStringBuffer("immutable");

 

執行如下語句將報告編譯期錯誤:

 

a=new StringBuffer("");

 

但是,執行如下語句則可以通過編譯:

 

a.append(" broken!");

 

10、"=="和 equals 方法究竟有什麼區別?

“==”是看兩個對象是否是同一個對象,也就是兩個對象引用是否指向同一個對象(Java分配的內存地址一樣)當然如果用於int,long,double就不是看兩個值是否相等了。 
equals()是比較兩個對象的內容是否相等,一般如果用戶自己不定義針對自己的類的equals()方法,那麼就會使用Object的活着你的類的父類的這個方法。如果你的類裏沒有對象引用的域,就不必要覆蓋equals()(注意String域也是對象)String有自己的equals()方法(它已經覆蓋了Object的該方法了。 
如果你的類中的域有對象引用,那麼你需要重寫equals() 
因爲Object的equals()的工作實質是對你的所有的域進行“==”比較歷遍,所以如果你的域有對象引用,“==”比較就又變成了對域的對象引用是否指向同一個對象了
 

11、靜態變量和實例變量的區別?

 

在語法定義上的區別:靜態變量前要加 static 關鍵字,而實例變量前則不加。

 

在程序運行時的區別:實例變量屬於某個對象的屬性,必須創建了實例對象,其中的實例變量纔會被分配空間,才能使用這個實例變量。靜態變量不屬於某個實例對象,而是屬於類,所以也稱爲類變量,只要程序加載了類的字節碼,不用創建任何實例對象,靜態變量就會被分配空間,靜態變量就可以被使用了。總之,實例變量必須創建對象後纔可以通過這個對象來使用,靜態變量則可以直接使用類名來引用。

 

12、是否可以從一個 static 方法內部發出對非 static 方法的調用?

 

不可以。因爲非 static 方法是要與對象關聯在一起的,必須創建一個對象後,纔可以在該對象上進行方法調用,而static 方法調用時不需要創建對象,可以直接調用。也就是說,當一個static 方法被調用時,可能還沒有創建任何實例對象,如果從一個static 方法中發出對非 static 方法的調用,那個非 static 方法是關聯到哪個對象上的呢?這個邏輯無法成立,所以,一個 static 方法內部發出對非 static 方法的調用。

 

13、Integer 與 int 的區別

 

int 是 java 提供的8種原始數據類型之一。Java爲每個原始類型提供了封裝類,Integer 是 java 爲 int 提供的封裝類。int 的默認值爲0,而Integer 的默認值爲 null,即 Integer 可以區分出未賦值和值爲0的區別,int 則無法表達出未賦值的情況,例如,要想表達出沒有參加考試和考試成績爲0的區別,則只能使用Integer。在 JSP 開發中,Integer 的默認爲 null,所以用 el 表達式在文本框中顯示時,值爲空白字符串,而 int 默認的默認值爲0,所以用 el 表達式在文本框中顯示時,結果爲0,所以,int 不適合作爲 web 層的表單數據的類型。

 

 

 

14、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

 

Math 類中提供了三個與取整有關的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對應,例如,ceil 的英文意義是天花板,該方法就表示向上取整,

 

Math.ceil(11.3)的結果爲12,Math.ceil(-11.3)的結果是-11;floor 的英文意義是地板,該方法就表示向下取整,Math.ceil(11.6)的結果爲11,Math.ceil(-11.6)的結果是-12;最難掌握的是round 方法,它表示“四捨五入”,算法爲Math.floor(x+0.5),即將原來的數字加上0.5後再向下取整,所以,Math.round(11.5)的結果爲12,Math.round(-11.5)的結果爲-11。

 

15、請說出作用域 public,private,protected,以及不寫時的區別

 

這四個作用域的可見範圍如下表所示。

 

說明:如果在修飾的元素上面沒有寫任何訪問修飾符,則表示 friendly。

 

作用域

當前類

同一包(package)

子孫類

其他包(package)

 

 

 

 

 

public

 

 

 

 

 

protected

×

 

 

 

 

 

friendly

×

×

 

 

 

 

 

private

×

×

×

 

 

 

 

 

 

16、Overload 和 Override 的區別。Overloaded 的方法是否可以改變返回值

 

的類型?

 

Overload 是重載的意思,Override 是覆蓋的意思,也就是重寫。

 

重載 Overload 表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同)。

 

重寫 Override 表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因爲子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權限只能比父類的更大,不能更小。如果父類的方法是private 類型,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。

 

override 可以翻譯爲覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對接口方法的實現,在接口中一般只是對方法進行了聲明,而我們在實現時,就需要實現接口聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點:

 

1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;

 

2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;

 

3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;

 

4、被覆蓋的方法不能爲private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。

 

overload 對我們來說可能比較熟悉,可以翻譯爲重載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然後再調用時,VM 就會根據不同的參數樣式,來選擇合適的方法執行。在使用重載要注意以下的幾點:

1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是 fun(int,float),

但是不能爲 fun(int,int));

 

2、不能通過訪問權限、返回類型、拋出的異常進行重載;

 

3、方法的異常類型和數目不會對重載造成影響;

 

4、對於繼承來說,如果某一方法在父類中是訪問權限是 priavte,那麼就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。

 

17、構造器 Constructor 是否可被 override?

 

構造器 Constructor 不能被繼承,因此不能重寫 Override,但可以被重載 Overload。

 

18、接口是否可繼承接口?抽象類是否可實現(implements)接口?抽象類是否可

 

繼承具體類(concrete class)?抽象類中是否可以有靜態的 main 方法?

 

接口可以繼承接口。抽象類可以實現(implements)接口,抽象類可以繼承具體類。抽象類中可以有靜態的main 方法。

 

只有記住抽象類與普通類的唯一區別:就是不能創建實例對象和允許有abstract 方法。

 

19、寫 clone()方法時,通常都有一行代碼,是什麼?

 

clone 有缺省行爲,

 

super.clone();

 

因爲首先要把父類中的成員複製到位,然後纔是複製自己的成員。

 

20、java 中實現多態的機制是什麼?

靠的是父類或接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。

 

21、abstract class 和 interface 有什麼區別?

含有 abstract 修飾符的 class 即爲抽象類,abstract 類不能創建的實例對象。含有 abstract 方法的類必須定義爲 abstract class,abstractclass 類中的方法不必是抽象的。abstractclass類中定義抽象方法必須在具體(Concrete)子類中實現,所以,不能有抽象構造方法或抽象靜態方法。如果的子類沒有實現抽象父類中的所有抽象方法,那麼子類也必須定義爲abstract類型。接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認爲 public abstract 類型,接口中的成員變量類型默認爲 public static final。

兩者的語法區別:

1.抽象類可以有構造方法,接口中不能有構造方法。

 

2.抽象類中可以有普通成員變量,接口中沒有普通成員變量

 

3.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。

 

4. 抽象類中的抽象方法的訪問類型可以是 public,protected和(默認類型),但接口中的抽象方法只能是 public 類型的,並且默認即爲 publicabstract 類型。

 

5.抽象類中可以包含靜態方法,接口中不能包含靜態方法

 

6.抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是 public static final 類型,並且默認即爲public static final 類型。

7. 一個類可以實現多個接口,但只能繼承一個抽象類。

 

兩者在應用上的區別:

 

接口更多的是在系統架構設計方法發揮作用,主要用於定義模塊之間的通信契約。而抽象類在代碼實現方面發揮作用,可以實現代碼的重用,

 

 

 

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

 

基本數據類型包括 byte、int、char、long、float、double、boolean 和 short。

 

java.lang.String 類是 final 類型的,因此不可以繼承這個類、不能修改這個類。爲了提高效率節省空間,我們應該用 StringBuffer 類

 

23、String s = "Hello";s = s + " world!";這兩行代碼執行後,原始的 String

 

對象中的內容到底變了沒有?

沒有。因爲 String 被設計成不可變(immutable)類,所以它的所有對象都是不可變對象。在這段代碼中,s 原先指向一個 String 對象,內容是 "Hello",然後我們對 s 進行了+操作,那麼s 所指向的那個對象是否發生了改變呢?答案是沒有。這時,s 不指向原來那個對象了,而指向了另一個 String 對象,內容爲"Hello world!",原來那個對象還存在於內存之中,只是 s 這個引用變量不再指向它了。

 

 

String 對象建立之後不能再改變,所以對於每一個不同的字符串,都需要一個String 對象來表示。這時,應該考慮使用 StringBuffer 類,它允許修改,而不是每個不同的字符串都要生成一個新的對象。並且,這兩種類的對象轉換十分容易。同時,我們還可以知道,如果要使用內容相同的字符串,不必每次都new 一個 String。

24、是否可以繼承 String 類?

 

String 類是 final 類故不可以繼承。

 

25、什麼是Java集合API

Java集合框架API是用來表示和操作集合的統一框架,它包含接口、實現類、以及幫助程序員完成一些編程的算法。簡言之,API在上層完成以下幾件事:

1.編程更加省力,提高城程序速度和代碼質量

2.非關聯的API提高互操作性

3.節省學習使用新API成本

4.節省設計新API的時間

5.鼓勵、促進軟件重用

具體來說,有6個集合接口,最基本的是Collection接口,由三個接口Set、List、SortedSet繼承,另外兩個接口是Map、SortedMap,這兩個接口不繼承Collection,表示映射而不是真正的集合

 

26、什麼是Iterator,Iterator與ListIterator有什麼區別?

 

一些集合類提供了內容遍歷的功能,通過java.util.Iterator接口。這些接口允許遍歷對象的集合。依次操作每個元素對象。當使用Iterators時,在獲得Iterator的時候包含一個集合快照。通常在遍歷一個Iterator的時候不建議修改集合本身。

Iterator:只能正向遍歷集合,適用於獲取移除元素。

ListIerator:繼承Iterator,可以雙向列表的遍歷,同樣支持元素的修改。

 

27、什麼是HaspMap和Map?怎樣使Hashmap同步?

Map是接口,Java 集合框架中一部分,用於存儲鍵值對,HashMap是用哈希算法實現Map的類。

HashMap可以通過Map m = Collections.synchronizedMap(hashMap)來達到同步的效果。

28、爲什麼Vector類認爲是廢棄的或者是非官方地不推薦使用?或者說爲什麼我們應該一直使用ArrayList而不是Vector

你應該使用ArrayList而不是Vector是因爲默認情況下你是非同步訪問的,Vector同步了每個方法,你幾乎從不要那樣做,通常有想要同步的是整個操作序列。同步單個的操作也不安全(如果你迭代一個Vector,你還是要加鎖,以避免其它線程在同一時刻改變集合)。而且效率更慢。當然同樣有鎖的開銷即使你不需要,這是個很糟糕的方法在默認情況下同步訪問。你可以一直使用Collections.sychronizedList來裝飾一個集合。

事實上Vector結合了“可變數組”的集合和同步每個操作的實現。這是另外一個設計上的缺陷。Vector還有些遺留的方法在枚舉和元素獲取的方法,這些方法不同於List接口,如果這些方法在代碼中程序員更趨向於想用它。儘管枚舉速度更快,但是他們不能檢查如果集合在迭代的時候修改了,這樣將導致問題。儘管以上諸多原因,oracle也從沒宣稱過要廢棄Vector.

 

29、Java的23種設計模式?

 

Factory(工廠模式),     Builder(建造模式),      Factory Method(工廠方法模式),
Prototype(原始模型模式),Singleton(單例模式),   Facade(門面模式),
Adapter(適配器模式),    Bridge(橋樑模式),        Composite(合成模式),
Decorator(裝飾模式),    Flyweight(享元模式),     Proxy(代理模式),
Command(命令模式),      Interpreter(解釋器模式), Visitor(訪問者模式),
Iterator(迭代子模式),   Mediator(調停者模式),    Memento(備忘錄模式),
Observer(觀察者模式),   State(狀態模式),        Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式)

 

30、GC是什麼? 爲什麼要有GC

 

GC是垃圾收集的意思(Gabage Collection)。內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而自動回收對象所佔的內存。

 

31、BS與CS的聯繫與區別。

C/S是Client/Server的縮寫。服務器通常採用高性能的PC、工作站或小型機,並採用大型數據庫系統,如Oracle、Sybase、Informix或 SQL Server。客戶端需要安裝專用的客戶端軟件。B/S是Brower/Server的縮寫,客戶機上只要安裝一個瀏覽器(Browser),如

Netscape Navigator或Internet Explorer,服務器安裝Oracle、Sybase、Informix或 SQLServer等數據庫。在這種結構下,用戶界面完全通過WWW瀏覽器實現,一部分事務邏輯在前端實現,但是主要事務邏輯在服務器端實現。瀏覽器通過Web Server 同數據庫進行數據交互。

 

32、描述一下JVM加載class文件的原理機制?

 

在Java中,類裝載器把一個類裝入Java虛擬機中,要經過三個步驟來完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗、準備、解析
裝載:查找和導入類或接口的二進制數據;
鏈接:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;
校驗:檢查導入類或接口的二進制數據的正確性;
準備:給類的靜態變量分配並初始化存儲空間;
解析:將符號引用轉成直接引用;
初始化:激活類的靜態變量,初始化Java代碼和靜態Java代碼塊

33、ArrayList和Vector的區別?HashMap和Hashtable的區別?

 

ArrayList與Vector主要從二方面來說:

1.同步性:Vector是線程安全的,也就是說是同步的;而ArrayList是線程序不安全的,不是同步的。

2.數據增長:當需要增長時,Vector默認增長爲原來一培,而ArrayList卻是原來的一半。

HashMap與HashTable主要從三方面來說:
    1.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現。
    2.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的。
    3.值:只有HashMap可以讓你將空值作爲一個表的條目的key或value。

34、介紹JAVA中的Collection FrameWork(包括如何寫自己的數據結構)?

 

Collection FrameWork如下:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection是最基本的集合接口,一個Collection代表一組Object,即Collection的元素(Elements)。
Map提供key到value的映射

 

35、String與StringBuffer的區別?

 

String的長度是不可變的,StringBuffer的長度是可變的。如果你對字符串中的內容經常進行操作,特別是內容要修改時,那麼使用StringBuffer。StringBuffer轉換成String使用StringBuffer的toString()方法。

 

36、談談final,finally,finalize的區別?

 

final修飾符:如果一個類被聲明爲final,意味着它不能再派生出新的子類。因此一個類不能既被聲明爲 abstract的,又被聲明爲final的。將變量或方法聲明爲final,可以保證它們在使用中不被改變。被聲明爲final的變量必須在聲明時給定初值,而在以後的引用中只能讀取,不可修改。被聲明爲final的方法也同樣只能使用,不能重寫。

finally:異常處理時提供 finally 塊來執行清理工作。如果拋出一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)。

finalize方法:Java 虛擬機允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時調用。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。不能確定java虛擬機何時調用該方法

 

37、int 和 Integer 有什麼區別?

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

原始類型/封裝類:boolean/Boolean,char/Character,byte/Byte,short/Short,int/Integer,long/Long,float/Float,double/Double。

newInteger(1);

i.intValue();

拆箱/裝箱

 

38、排序都有哪幾種方法?

 

排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸併排序,分配排序(箱排序、基數排序)。

 

39、JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以拋出異常嗎?

Java通過面向對象的方法進行異常處理。在Java中,每個異常都是一個對象,它是Throwable類或其它子類的實例。當一個方法出現異常後便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法可以捕獲到這個異常並進行處理。Java的異常處理是通過5個關鍵詞來實現的:try、catch、throw、throws和finally。一般情況下是用try來執行一段程序,如果出現異常,系統會拋出一個異常,這時候你可以通過它的類型來捕捉(catch)它,或最後(finally)由缺省處理器來處理。

try語句用來執行一段已檢查異常程序。try的後面應包含一個catch子句來指定你想要捕捉的"異常"類型。

throw語句用來明確地拋出一個"異常"。

throws用來標明一個成員函數可能拋出的各種"異常"。

finally爲確保一段代碼不管發生什麼"異常"都被執行一段代碼。


 

40、什麼是java序列化,如何實現java序列化?

 

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

 

41、說出一些常用的類,包,接口,請各舉5個?

常用的類:

StringBuffer,String,Integer,HashMap,ArrayList,BufferedReader,BufferedWriter,FileReader,FileWirter

常用的包:

java.lang,java.io,java.util,java.sql,javax.servlet,javax.servlet.http

常用的接口:

Collection, List, Map,Set,Iterator,Comparable

 

42、List的子類特點?

ArrayList :

底層數據結構是數組,查詢快,增刪慢,線程不安全,效率高

Vector:

底層數據結構是數組,查詢快,增刪慢,線程安全,效率低

LinkedList:

底層數據結構是鏈表,查詢慢,增刪快,線程不安全,效率高

 

43、Jdo 是什麼?

JDO 是 Java 對象持久化的新的規範,爲java data object 的簡稱,也是一個用於存取某種數據倉庫中的對象的標準化API。JDO 提供了透明的對象存儲,因此對開發人員來說,存儲數據對象完全不需要額外的代碼(如JDBC API 的使用)。這些繁瑣的例行工作已經轉移到JDO 產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外,JDO 很靈活,因爲它可以在任何數據底層上運行。JDBC 只是面向關係數據庫(RDBMS) JDO 更通用,提供到任何數據底層的存儲功能,比如關係數據庫、文件、XML 以及對象數據庫(ODBMS)等等,使得應用可移植性更強。

44、多線程:

  多線程(英語:multithreading),是指從軟件或者硬件上實現多個線程併發執行的技術。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多於一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及芯片級多處理(Chip-level multithreading)或同時多線程(Simultaneous multithreading)處理器。[1]  在一個程序中,這些獨立運行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理(Multithreading)”。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多於一個線程(臺灣譯作“執行緒”),進而提升整體處理性能。

45、多線程編程的好處是什麼?

在多線程程序中,多個線程被併發的執行以提高程序的效率,CPU不會因爲某個線程需要等待資源而進入空閒狀態。多個線程共享堆內存(heapmemory),因此創建多個線程去執行一些任務會比創建多個進程更好。舉個例子,Servlets比CGI更好,是因爲Servlets支持多線程而CGI不支持。

46、面向對象設計原則:

 面向對象七大設計原則

 1. 開閉原則 2.里氏替換原則 3.單一職責原則 4. 接口隔離原則 5.依賴倒置原則 6.迪米特原則 7.組合/聚合複用原則

47、簡述分佈式:

什麼是分佈式計算?所謂分佈式計算是一門計算機科學,它研究如何把一個需要非常巨大的計算能力才能解決的問題分成許多小的部分,然後把這些部分分配給許多計算機進行處理,最後把這些計算結果綜合起來得到最終的結果。分佈式網絡存儲技術是將數據分散的存儲於多臺獨立的機器設備上。分佈式網絡存儲系統採用 可擴展的系統結構,利用多臺存儲服務器分擔存儲負荷,利用位置服務器定位存儲信息,不但解決了傳統集中式存儲系統中單存儲服務器的瓶頸問題,還提高了系統的可靠性、可用性和擴展性。

48、併發:

操作系統中,併發是指一個時間段中有幾個程序都處於已啓動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。在關係數據庫中,允許多個用戶同時訪問和更改共享數據的進程。SQL Server 使用鎖定以允許多個用戶同時訪問和更改共享數據而彼此之間不發生衝突。

49、反射技術:

其實就是動態加載 個指定的類,並獲取該類中的所有的內容。 且將字節碼 件封裝成對象,並將字節碼 件中的內容都封裝成對象,這樣便於操作這些成員。簡單說:反射技術可以對 個類進 解剖。

反射的好處:增強了程序的擴展性。

反射的基本步驟:

1、獲得Class 對象,就是獲取到指定的名稱的字節碼 件對象。

2、實例化對象,獲得類的屬性、 法或構造函數。

3、訪問屬性、調  法、調 構造函數創建對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章