JavaSE 面試題總結


一、 JavaSE 4

1 面向對象的特征有哪些方面 4

2 String是最基本的數據類型嗎? 4

3 super()this()的區別? 4

4 JAVA的事件委托機制和垃圾回收機制 4

5 JAVA中,如何跳出當前的多重嵌套循環? 4

6 什么是java序列化,如何實現java序列化?(寫一個實例) 4

7 線程的基本概念、線程的基本狀態以及狀態之間的關系? 4

9 什么是Java序列化,如何實現java序列化? 4

10 列舉出JAVA 6 個比較常用的包 4

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

12 寫幾個線程安全類,不安全的,支持排序的類名? 5

13 排序都有哪幾種方法?請列舉。用JAVA實現一個快速排序? 5

14 什么是類的返射機制? 5

15 類的返射機制中的包及核心類? 5

16 得到Class的三個過程是什么? 5

17 STOP()SUSPEND()不推薦使用的原因? 5

18 靜態變量和實例變量的區別? 6

19 構造器的名能不能和類的名字相同? 6

20 在一個主方法類可不可以調用一個非靜態的方法? 6

21 說一下垃圾回收的原理,可以直接從內存中回收嗎? 6

22 Java 的異常有哪幾種,有什么區別? 6

23 Integer int 的區別? 6

24 Java Reflection 是什么? 6

25 寫幾個java.lang.Object 類中的方法名稱。 6

26 數組有沒有length()這個方法,String 有沒有length()這個方法。 6

27 Error exception 的區別與聯系? 6

28 靜態的多態和動態的多態的區別? 6

29 Collections Collection 的區別 6

30 Class.forName 的作用?為什么要用? 6

31 Socket 如何獲取本地ip 地址? 6

32 接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承具體類 6

33 char 型變量中能不能存貯一個中文漢字?為什么? 6

34 clone()方法時,通常都有一行代碼,是什么? 6

35 說說常用集合類有哪些?有哪些方法? 6

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

37 Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 6

38 多線程有幾種實現方法?同步有幾種實現方法? 7

39 內部類可以引用外部類的成員嗎?有沒有什么限制? 7

40 Java 類實現序列化的方法(二種)?如在collection 框架中實現排序,要實現什么樣的接口 7

41 什么是Java 序列化,如何實現java 序列化?或者請解釋Serializable 接口的作用。 7

42 Java 中有幾種類型的流?JDK 為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類? 7

43 JDBC 如何調用存儲過程 7

44 JAVA 事件有哪些模式? 7

45 SOCKET 中有幾中連接方式,各有什么區別? 7

46 Hashtable 的原理 8

47 JDBC 中的PreparedStatement 相比Statement 的好處? 8

48 sleep()wait()區別 8

49 概述反射和序列化 8

50 Java 中實現多態的機制是什么? 8

51 abstract method 是否可同時是static, 是否可同時是native 是否可同時是synchronized? 8

52 如何喚起類中的一個方法? 8

53 如何將數值型字符轉換為數字(IntegerDouble)? 8

54 如何去小數點前兩位,並四舍五入。 8

55 int  Integer 有什么區別? 8

56 String StringBuffer的區別? 9

57 運行時異常與一般異常有何異同? 9

58 說出ArrayList,Vector, LinkedList的存儲性能和特性 9

59 Collection  Collections的區別。 9

60 &&&的區別。 9

61 HashMapHashtable的區別 9

62 Java包括哪些基本數據類型。 9

63 什么是OOP?什么是類?請對比類和對象實例之間的關系 9

64 JDKJREJVM是什么? 9

65 intInteger有什么區別,互相之間如何轉換 9

66 類加載的初始化順序 10

67 final, finally, finalize的區別 10

68 線程的基本概念、線程的基本狀態以及狀態之間的關系 10

69 Overload(重載)Overrided (重寫)的區別。 10

70 Overloaded的方法是否可以改變返回值的類型? 10

71 abstract classinterface有什么區別? 10

72 equals()==”的區別 10

73 &&&的區別。 11

74 Java構造方法的特點 11

75 Final可以修飾什么?修飾后具有什么特點 11

76 接口是否可繼承接口 11

77 抽象類是否可實現(implements)接口? 11

78 抽象類是否可繼承實體類? 11

79 String是最基本的數據類型嗎? 11

80 String s = new String(“abc”);創建了幾個String Object? 11

81 StringStringBufferStringBuilder的區別 11

82 是否可以繼承String類,為什么 11

83 GC是什么? 為什么要有GC? 11

84 異常的體系結構,從類與類之間的關系來回答 11

85 JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什么意義? 12

86 errorexception有什么區別 12

87 常見的runtime exception有哪些 12

88 數組有沒有length()這個方法? String有沒有length()這個方法? 12

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

90 Java有沒有goto 12

91 swtich是否能作用在byte上,是否能作用在long上,是否能作用在String? 12

92 try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后? 12

93 Java有幾種訪問權限控制,請分別詳細說明控制范圍 12

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

95 Equals()hashCode()有什么關系? 13

96 Java反射機制的原理 13

97 @Retention的理解,自定義泛型 13

98 可變參數的用法 13

99、 abstract classinterface有什么區別? 13

100 heapstack有什么區別。 13

101 當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法? 13

102 請說出你所知道的線程同步的方法? 13

103 char型變量中能不能存貯一個中文漢字?為什么? 13

104 如何取得年月日,小時分秒? 13

105 如何取得從1970年到現在的毫秒數 14

106 如何獲取某個日期是當月的最后一天 14

107 如何格式化日期 14

108 編碼轉換,怎樣實現將GB2312編碼的字符串轉換為ISO-8859-1編碼的字符串。 14

109 String s = new String("xyz");創建了幾個String Object? 14

110 floatfloat f=3.4是否正確? 14

111 靜態變量和實例變量的區別? 14

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

113 什么時候用assert 15

二、 集合框架 15

114 從接口、類的角度簡述集合框架體系結構 15

115 說出ArrayList,Vector, LinkedList的存儲性能和特性 15

116 CollectionCollections的區別,HashMapHashtable的區別 15

117 List, Set, Map是否繼承自Collection接口 15

118 Set里的元素是不能重復的,那么用什么方法來區分重復與否呢? 15

119 集合排序的常見二種寫法? 16

120 如何將數組轉換成集合,集合轉換成數組? 16

121 如何對各種集合進行迭代? 16

122 Entryset 16

三、 IO 16

123 java中有幾種類型的流? 16

124 JDK為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類? 16

125 字節流與字符流的轉換方法? 16

126 JavaIO流基礎分類方式(字節流、字符流與基本流、過濾流)及他們之間的關系? 16

127 什么是java序列化,如何實現java序列化? 16

四、 多線程 16

128 多線程有幾種實現方法? 16

129 ThreadRunnable的區別和使用? 16

130 如何實現線程同步? 16

131 sleep()  wait() 有什么區別? 17

132 同步和異步有何異同,在什么情況下分別使用他們?舉例說明。 17

133 如何啟動一個線程? 517

134 線程有哪些狀態,這些狀態是如何轉換的? 17

五、 Socket 17

135 TCPUDP區別和使用 17

 

 

一、 JavaSE

1、 面向對象的特征有哪些方面

  1. 抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。
  2. 繼承:繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,並且類可以修改或增加新的方法使之更適合特殊的需要。
  3. 封裝:封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。
  4. 多態性:多態性是指允許不同類的對象對同一消息作出響應。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行為共享、代碼共享的優勢,很好的解決了應用程序函數同名問題。

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

基本數據類型包括byteintcharlongfloatdoublebooleanshortjava.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用StringBuffer

3、 super()與this()的區別?

This():當前類的對象,super父類對象。

Super():在子類訪問父類的成員和行為,必須受類繼承規則的約束

而this他代表當前對象,當然所有的資源都可以訪問.

在構造函數中,如果第一行沒有寫super(),編譯器會自動插入.但是如果父類沒有不帶參數的構造函數,或這個函數被私有化了(用private修飾).此時你必須加入對父類的實例化構造.而this就沒有這個要求,因為它本身就進行實例化的構造.
而在方法中super和this使用的方法就差不多了.只不過super 要考慮是否能訪問其父類的資源.

4、 JAVA的事件委托機制和垃圾回收機制

java 事件委托機制的概念,一個源產生一個事件並將它送到一個或多個監聽器那里。在這種方案中,監聽器簡單的等待,直到它收到一個事件。一旦事件被接受,監聽器將處理這個事件,然后返回。

垃圾回收機制 垃圾收集是將分配給對象但不再使用的內存回收或釋放的過程。如果一個對象沒有指向它的引用或者其賦值為null,則次對象適合進行垃圾回收

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

break; return 方法。

6、 什么是java序列化,如何實現java序列化?(寫一個實例)

序列化:

可以將一個對象保存到一個文件,所以可以通過流的方式在網絡上傳輸,可以將文件的內容讀取,轉化為一個對象。

處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸於網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。

序列化的實現:

將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements Serializable只是為了標注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。

7、 線程的基本概念、線程的基本狀態以及狀態之間的關系?

線程的基本概念:線程指在程序執行過程中,能夠執行程序代碼的一個執行單位,每個程序至少都有一個線程,也就是程序本身。
Java中的線程有四種狀態分別是:運行、就緒、掛起、結束。

8、 什么是Java序列化,如何實現java序列化?

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

9、 列舉出JAVA 6 個比較常用的包

java.lang;java.util;java.io;java.sql;java.awt;java.net;javax.swing

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

可以。如果這個類的修飾符是public,其類名與文件名必須相同。

11、 寫幾個線程安全類,不安全的,支持排序的類名?

線程安全類:Vector 、Hashtable、Stack。

線程不安全的類:ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap等。

支持排序的類有HashSet、LinkedHashSet、TreeSet 等(Set 接口下的實現都支持排序)

12、 排序都有哪幾種方法?請列舉。用JAVA實現一個快速排序?

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

快速排序的偽代碼。

13、 什么是類的返射機制?

動態獲得對象

通過類(Class對象),可以得出當前類的fields、method、construtor、interface、superClass、modified等,同是可以通過類實例化一個實例、設置屬性、喚醒方法。Spring中一切都是返射、struts、hibernate都是通過類的返射進行開發的。

14、 類的反射機制中的包及核心類?

java.lang.Class

java.lang.refrection.Method

java.lang.refrection.Field

java.lang.refrection.Constructor

java.lang.refrection.Modifier

java.lang.refrection.Interface

15、 得到Class的三個過程是什么?

對象.getClass()

類.class或Integer.type(int)  Integer.class(java.lang.Integer)

Class.forName();

16、 STOP()SUSPEND()不推薦使用的原因?

stop()是因為它不安全。它會解除由線程獲取的所有鎖定,當在一個線程對象上調用stop()方法時,這個線程對象所運行的線程就會立即停止,假如一個線程正在執行:synchronized void { x = 3; y = 4;} 由於方法是同步的,多個線程訪問時總能保證x,y 被同時賦值,而如果一個線程正在執行到x = 3;時,被調用了stop()方法,即使在同步塊中,它也干脆地stop 了,這樣就產生了不完整的殘廢數據。而多線程編程中最最基礎的條件要保證數據的完整性,所以請忘記線程的stop 方法,以后我們再也不要說“停止線程”了。而且如果對象處於一種不連

貫狀態,那么其他線程能在那種狀態下檢查和修改它們。suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread 類中置入一個標志,指出線程應該活動還是掛起。若標志指出線程應該掛起,便用wait()命其進入等待狀態。若標志指出線程應當恢復,則用一個notify()重新啟動線程。

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

靜態變量屬於類,不用實例化就已經存在,所有的實例共享同一個靜態變量,可以通過類名和實例名來訪問。實例變量屬於實例,每個實例都有自己的這個變量,只能通過實例名來訪問。

18、 什么是構造器,構造器的特征

方法名必須和類名相同,無返回值,不能顯示被調用,實例化時自動調用。完成初始化工作。系統會默認提供了一個默認的無參構造器。初始化子類時,會先調用父類的構造器,可以在方法中通過supper()指定調用父類的哪一個構造器。

19、 在一個主方法類可不可以調用一個非靜態的方法?

如果在同一個類中,實例方法可以直接使用方法名調用,靜態方法不能直接調用非靜態方法,需要實例化后,通過對象再調用。

如果在不同類中,實例方法需要先實例化,然后通過對象調用,靜態方法,直接通過類名.方法調用。

20、 說一下垃圾回收的原理,可以直接從內存中回收嗎?

對於GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些對象為"不可達"時,GC就有責任回收這些內存空間。可以。程序員可以手動執行System.gc(),通知GC運行,但是Java語言規范並不保證GC一定會執行。

21、 Java 的異常有哪幾種,有什么區別?

異常是指java程序運行時(非編譯)所發生的非正常情況或錯誤,與現實生活中的事件很相似,現實生活中的事件可以包含事件發生的時間、地點、人物、情節等信息,可以用一個對象來表示,Java使用面向對象的方式來處理異常,它把程序中發生的每個異常也都分別封裝到一個對象來表示的,該對象中包含有異常的信息。

Java對異常進行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為java.lang.ThrowableThrowable下面又派生了兩個子類:ErrorExceptionError表示應用程序本身無法克服和恢復的一種嚴重問題,程序只有死的份了,例如,說內存溢出和線程死鎖等系統問題。Exception表示程序還能夠克服和恢復的問題,其中又分為系統異常和普通異常,系統異常是軟件本身缺陷所導致的問題,也就是軟件開發人員考慮不周所導致的問題,軟件使用者無法克服和恢復這種問題,但在這種問題下還可以讓軟件系統繼續運行或者讓軟件死掉,例如,數組腳本越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉換異常(ClassCastException);普通異常是運行環境的變化或異常所導致的問題,是用戶能夠克服的問題,例如,網絡斷線,硬盤空間不夠,發生這樣的異常后,程序不應該死掉。

java為系統異常和普通異常提供了不同的解決方案,編譯器強制普通異常必須try..catch處理或用throws聲明繼續拋給上層調用方法處理,所以普通異常也稱為checked異常,而系統異常可以處理也可以不處理,所以,編譯器不強制用try..catch處理或用throws聲明,所以系統異常也稱為unchecked異常。

22、 Integer int 的區別?

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

Hibernate中,如果將OID定義為Integer類型,那么Hibernate就可以根據其值是否為null而判斷一個對象是否是臨時的,如果將OID定義為了int類型,還需要在hbm映射文件中設置其unsaved-value屬性為0

另外,Integer提供了多個與整數相關的操作方法,例如,將一個字符串轉換成整數,Integer中還定義了表示整數的最大值和最小值的常量。

23、 Java Reflection 是什么?

reflection反射,

1.Java 反射機制主要提供了以下功能:

在運行時判斷任意一個對象所屬的類。
在運行時構造任意一個類的對象。
在運行時判斷任意一個類所具有的成員變量和方法。
在運行時調用任意一個對象的方法

2Reflection Java被視為動態(或准動態)語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection APIs取得任何一個已知名稱class的內部信息,包括其modifiers(諸如public, static 等等)、superclass(例如Object)、實現之interfaces(例如Serializable),也包括fieldsmethods的所有信息,並可於運行時改變fields內容或調用methods

盡管Java不是動態語言,它卻有着一個非常突出的動態相關機制:Reflection。這個字的意思是反射、映象、倒影,用在Java身上指的是我們可以於運行時加載、探知、使用編譯期間完全未知的classes。換句話說,Java程序可以加載一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其對象實體、或對其fields設值、或喚起其methods。這種看透class”的能力(the ability of the program to examine itself)被稱為introspection(內省、內觀、反省)。Reflectionintrospection是常被並提的兩個術語

java中,無論生成某個類的多少個對象(實例),這些對象都會對應同一個Class對象。

3、在JDK中,主要由以下類來實現Java反射機制,這些類都位於java.lang.reflect包中
    –Class類:代表一個類(這個類很特殊,位於java.lang包下)。
    –Field 類:代表類的成員變量(成員變量也稱為類的屬性)。
    –Method類:代表類的方法。
    –Constructor 類:代表類的構造方法。
    –Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法

 

24、 寫幾個 java.lang.Object類中的方法名稱。

Object()默認構造方法

clone()創建並返回此對象的一個副本。

equals(Object obj)指示某個其他對象是否與此對象相等

finalize()當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。

getClass()返回一個對象的運行時類。

hashCode()返回該對象的哈希碼值。

notify()喚醒在此對象監視器上等待的單個線程。

notifyAll()喚醒在此對象監視器上等待的所有線程。

toString()返回該對象的字符串表示。

wait()導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法。

wait(long timeout)導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。

wait(long timeout, int nanos)導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量。

 

25、 數組有沒有length()這個方法,String 有沒有length()這個方法。

數組沒有length()方法,Stringlength()方法。

26、 ThrowableErrorExceptionRuntimeException的區別與聯系?

1.Throwable 類是 Java 語言中所有錯誤或異常的超類。它的兩個子類是ErrorException

2.Error Throwable 的子類,用於指示合理的應用程序不應該試圖捕獲的嚴重問題。大多數這樣的錯誤都是異常條件。雖然 ThreadDeath 錯誤是一個“正規”的條件,但它也是 Error 的子類,因為大多數應用程序都不應該試圖捕獲它。在執行該方法期間,無需在其 throws 子句中聲明可能拋出但是未能捕獲的 Error 的任何子類,因為這些錯誤可能是再也不會發生的異常條件。

3.Exception 類及其子類是 Throwable 的一種形式,它指出了合理的應用程序想要捕獲的條件。

4.RuntimeException 是那些可能在 Java 虛擬機正常運行期間拋出的異常的超類。可能在執行方法期間拋出但未被捕獲的RuntimeException 的任何子類都無需在 throws 子句中進行聲明。它是Exception的子類。

 

27、 ErrorException的區別?

Error的繼承關系:java.lang.Object -> java.lang.Throwable -> java.lang.Error

Exception的繼承關系:java.lang.Object -> java.lang.Throwable -> java.lang.Error

 

Exception

1.可以是可被控制(checked) 或不可控制的(unchecked)

2.表示一個由程序員導致的錯誤

3.應該在應用程序級被處理

 

Error

1.總是不可控制的(unchecked)

2.經常用來用於表示系統錯誤或低層資源的錯誤

3.如何可能的話,應該在系統級被捕捉

28、 靜態的多態和動態的多態的區別?

靜態多態性指的是程序在編譯時,系統就能決定調用哪個函數,如重載。

動態多態性指在運行中才能動態確定操作指針所指的對象,主要通過虛函數和重寫來實現。

java 的多態機制遵循一個原則:當父類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法

概念理解起來有點抽象。還是看個例子吧。

靜態多態性:

add(int a);

add(int a,int b);

add(double a);

add(double a,double b);

 

動態多態性

public class A{ }

public class AB extends A{ }

public class AC extends A{ }

29、 Collections Collection 的區別

java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現。Collection接口的意義是為各種具體的集合提供了最大化的統一操作方式。

 

java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化,就像一個工具類,服務於JavaCollection框架。

30、 Class.forName 的作用?為什么要用?

Class.forName : 返回與給定的字符串名稱相關聯 類 或 接口 的Class對象。

至於什么時候用,可以考慮一下這個問題,給你一個字符串變量,它代表一個類的包名和類名,你怎么實例化它?

A a = (A)Class.forName( "pacage.A" ).newInstance();這和 A a =new A();是一樣的效果。

jvm在裝載類時會執行類的靜態代碼段,要記住靜態代碼是和class綁定的,class裝載成功就表示執行了你的靜態代碼了,而且以后不會再執行這段靜態代碼了。

Class.forName(xxx.xx.xx)的作用是要求JVM查找並加載指定的類,也就是說JVM會執行該類的靜態代碼段。

動態加載和創建Class 對象,比如想根據用戶輸入的字符串來創建對象

31、 Socket 如何獲取本地ip 地址?

java中從Socket中獲取IP地址通過SocketgetInetAddress()方法即可獲得Socket中的Ip地址。其中Socket中還可以通過getLocalAddress()獲取Socket綁定的本地地址。

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

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

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

33、 char 型變量中能不能存貯一個中文漢字?為什么?

無法存儲。因為char型具有的空間比漢字占有的空間要小。char型變量,占用空間為一個字節。漢字根據不同編碼方式,最少需要兩個字節,最多可能有三個字節甚至6個字節。所以單個char變量是無法存儲下中文漢字的。

34、 clone()方法時,通常都有一行代碼,是什么?

Clone 有缺省行為,super.clone();他負責產生正確大小的空間,並逐位復制

35、 說說常用集合類有哪些?有哪些方法?

通常我們使用的集合類都大多是由List、Set、Map 這三類接口派生出來的類,例如:ArrayList、Vector、LinkedList、Stack、TreeSet、Hashtable、HashMap 等集合類的大部分方法都是由Collection 接口定義的,主要包括有:add(E e)、remove(Object e)、addAll(),remove()、contains(Object obj)、clear()等。

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

不可以。因為非static 方法是要與對象關聯在一起的,必須創建一個對象后,才可以在該對象上進行方法調用,而static 方法調用時不需要創建對象,可以直接調用。

37、 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.floor(11.6)的結果為11,Math.floor(-11.6)的結果是-12;最難掌握的是round 方法,它表示“四舍五入”,算法為Math.floor(x+0.5),即將原來的數字加上0.5 后再向下取整, 所以, Math.round(11.5) 的結果為12 ,

Math.round(-11.5)的結果為-11。

38、 多線程有幾種實現方法?同步有幾種實現方法?

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

a. wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。

b. sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException 異常。

c. notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM 確定喚醒哪個線程,而且不是按優先級。

d. allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。

39、 內部類可以引用成員嗎?有沒有什么限制?

完全可以。如果不是靜態內部類,那沒有什么限制!如果你把靜態嵌套類當作內部類的一種特例,那在這種情況下不可以訪問外部類的普通

成員變量,而只能訪問外部類中的靜態成員。

40、 Java 類實現序列化的方法(二種)?如在collection 框架中實現排序,要實現什么樣的接口

java.io.Serializable 接口或實現Externalizable 接口。

Collection 框架中實現比較要實現Comparable 接口或Comparator 接口,並實現比較方法

41、 什么是Java 序列化,如何實現java 序列化?或者請解釋Serializable 接口的作用。

序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸於網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。序列化的實現:將需要被序列化的類實現Serializable 接口,該接口沒有需要實現的方法,implements Serializable 只是為了標注該對象是可被序列化的,然后使用一個輸出流( 如: FileOutputStream) 來構造一個ObjectOutputStream( 對象流) 對象, 使用ObjectOutputStream 對象的writeObject(Object obj)方法就可以將參數為obj 的對象寫出,

那么在另一端,通過ObjectInputStream 對象的readObject(Object obj)獲取到字節流數據后,要將字節流轉換成原對象,這叫反序列化,以便將數據存儲在文件中或在網絡傳輸。Serializable 接口描述啟用其序列化功能,未實現此接口的類將無法使其任何狀態序列化或反序列化。Serializable 接口沒有方法或字段,僅用於標識可序列化的語義,標識實現了該接口的對象屬性可被序列化

42、 Java 中有幾種類型的流?JDK 為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?

字節流,字符流兩種類型流。字節流繼承於InputStream、OutputStream;字符流繼承於Reader、Writer。其它與IO 操作相關的類都是派生至上述4 個抽象類,如字節相關的:FileInputStream、FileOutputStream 類;字符相關的:BufferedReader、Buffered  Writer類

43、 JDBC 如何調用存儲過程

通過JDBC組件中的CallableStatement接口實現調用存儲過程。

核心代碼如下: Class.forName("com.mysql.jdbc.Driver");

   Connection conn= DriverManager.getConnection("jdbc:mysql:///test","root","root"); CallableStatement cstmt = cn.prepareCall("{call insert_Student(?,?,?)}"); cstmt.registerOutParameter(3,Types.INTEGER);

cstmt.setString(1, "wangwu");

cstmt.setInt(2, 25); cstmt.execute();

44、 JAVA 事件有哪些模式?

1、事件直接驅動模式。它的特點是直接而且快,是必須經常使用的,主要適合於迅速處理前台的命令,通常就是我們說的command(命令)模式。

2.監控式事件模式。主要借助第三者來監控和觸發事件,就是通常我們說的觀察者模式。特點是: 有一個觀察者置身事外在定期獨立運行着,我們將我們要監聽的事件向這個觀察者注冊,這樣觀察者就代替我們來監聽這個事件,應用客戶端通過觀察者來獲得事件狀況。

45、 SOCKET 中有幾中連接方式,各有什么區別?

Sockets 有兩種主要的操作方式:面向連接(TCP/IP)的和無連接(UDP)的。無連接的操作使用數據報協議,無連接的操作是快速的和高效的,但是數據安全性不佳. 面向連接的操作使用TCP 協議.面向連接的操作比無連接的操作效率更低,但是數據的安全性更高

46、 Hashtable 的原理

通過節點的關鍵碼確定節點的存儲位置,即給定節點的關鍵碼k,通過一定的函數關系H(散列函數),得到函數值H(k),將此值解釋為該節點的存儲地址

47、 JDBC 中的PreparedStatement 相比Statement 的好處?

預編譯語句java.sql. ,擴展自Statement,不但具有Statement的所有能力而且具有更強大的功能。不同的是,PreparedStatement 是在創建語句對象的同時給出要執行的sql 語句。這樣,sql 語句就會被系統進行預編譯,執行的速度會有所增加,

尤其是在執行大語句的時候,效果更加理想

48、 sleep()wait()區別

sleep() 方法:線程主動放棄CPU,使得線程在指定的時間內進入阻塞狀態,不能得到CPU 時間,指定的時間一過,線程重新進入可執行狀態。典型地,sleep() 被用在等待某個資源就緒的情形:測試發現條件不滿足后,讓線程阻塞一段時間后重新測

試,直到條件滿足為止。

wait( ) :與notify()配套使用,wait()使得線程進入阻塞狀態,它有兩種形式,一種允許指定以毫秒為單位的一段時間作為參數,另一種沒有參數,當指定時間參數時對應的notify() 被調用或者超出指定時間時線程重新進入可執行狀態,后者則必須對應的notify() 被調用

49、 概述反射和序列化

Reflection:是Java 被視為動態語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection APIs 取得任何一個已知名稱的class 的內部信息,包括其modifiers(諸如public, static 等等)、superclass(例如Object)、實現之interfaces(例如Cloneable),也包括fields 和methods 的所有信息,並可於運行時改變fields 內容或喚起methods。序列化:就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸於網絡之間。序列化是為了解決在對對象流進行讀寫操作時的問題。

50、 Java 中實現多態的機制是什么?

重寫,重載

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

51、 abstract method 是否可同時是static, 是否可同時是native 是否可同時是synchronized?

abstractmethod 不可以是static的,因為抽象的方法是要被子類實現的native方法表示該方法要用另外一種依賴平台的編程語言實現的,不存在着被子類實現的問題,所以,它也不能是抽象的,不能與abstract混用;

關於synchronizedabstract合用的問題,我覺得也不行,因為在我幾年的學習和開發中,從來沒見到過這種情況,並且我覺得synchronized應該是作用在一個具體的方法上才有意義。而且,方法上的synchronized同步所使用的同步鎖對象是this,而抽象方法上無法確定this是什么。

52、 如何喚起類中的一個方法?

產生一個Class數組,說明方法的參數

通過Class對象及方法參數得到Method

通過method.invoke(實例,參數值數組)喚醒方法

53、 如何將數值型字符轉換為數字(Integer,Double)?

Integer.parseInt(“1234”)

Double.parseDouble(“123.2”)

54、 如何去小數點前兩位,並四舍五入。

double d=1256.22d;

d=d/100;

System.out.println(Math.round(d)*100);

55、 int Integer 有什么區別?

Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。Intjava的原始數據類型,Integerjavaint提供的封裝類。Java為每個原始類型提供了封裝類。 原始類型封裝類booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用類型和原始類型的行為完全不同,並且它們具有不同的語義。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的缺省值。對象引用實例變量的缺省值為 null,而原始類型實例變量的缺省值與它們的類型有關。

56、 String StringBuffer的區別? 

JAVA平台提供了兩個類:StringStringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當你知道字符數據要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態構造字符數據。

57、 運行時異常與一般異常有何異同? 

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

58、 說出ArrayList,Vector, LinkedList的存儲性能和特性

ArrayListVector都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由於使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快。

59、 Collection Collections的區別。

Collection是集合類的上級接口,繼承與他的接口主要有Set List。Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。

60、 &&&的區別

&位運算符,表示按位與運算,&&邏輯運算符,表示邏輯與(and

61、 HashMapHashtable的區別

HashMapHashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap允許空(null)鍵值(key,由於非線程安全,效率上可能高於Hashtable
HashMap允許將null作為一個entrykey或者value,而Hashtable不允許。
HashMapHashtablecontains方法去掉了,改成containsvaluecontainsKey。因為contains方法容易讓人引起誤解。 Hashtable繼承自Dictionary類,而HashMapJava1.2引進的Map interface的一個實現。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。 HashtableHashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。

62、 Java包括哪些基本數據類型。

byte int short long float double char boolean

63、 什么是OOP?什么是類?請對比類和對象實例之間的關系

面向對象編程;

類是具有相同屬性和行為的對象的結合;
對象是某個類的一個實例,類有0或多個對象;

64、 JDKJREJVM是什么?

java開發包,java運行環境,java虛擬機

65、 intInteger有什么區別,互相之間如何轉換

int是基本數據類型,Integer是封裝類;
int無默認值,Integer默認值為0
Integer a = new Integer(1);

int b = a.intValue();

66、 類加載的初始化順序

父類--靜態變量 
父類--靜態初始化塊 
子類--靜態變量 
子類--靜態初始化塊 
父類--變量 
父類--初始化塊 
父類--構造器 
子類--變量 
子類--初始化塊 
子類--構造器

67、 final, finally, finalize的區別

final修飾屬性、方法、類:屬性不可改變、方法不可重寫、類不可繼承;
finally在異常處理時進行清除操作,不管是否捕捉到異常,finaly塊中的代碼都會執行;
finalize方法是在垃圾收集器刪除對象之前對這個對象調用的。

68、 線程的基本概念、線程的基本狀態以及狀態之間的關系

一個程序中可以有多條執行線索同時執行,一個線程就是程序中的一條執行線索,每個線程上都關聯有要執行的代碼,即可以有多段程序代碼同時運行,每個程序至少都有一個線程,即main 方法執行的那個線程。如果只是一個cpu,它怎么能夠同時執行多段程序呢?這是從宏觀上來看的,cpu 一會執行a 線索,一會執行b 線索,切換時間很快,給人的感覺是a,b 在同時執行,好比大家在同一個辦公室上網,只有一條鏈接到外部網線,其實,這條網線一會為a 傳數據,一會為b 傳數據,由於切換時間很短暫,所以,大家感覺都在同時上網。狀態:就緒,運行,synchronize 阻塞,wait 和sleep 掛起,結束。wait 必須在synchronized內部調用。調用線程的start 方法后線程進入就緒狀態,線程調度系統將就緒狀態的線程轉為運行狀態,遇到synchronized 語句時,由運行狀態轉為阻塞,當synchronized 獲得鎖后,由阻塞轉為運行,在這種情況可以調用wait 方法轉為掛起狀態,當線程關聯的代碼執行完后,線程變為結束狀態。  

69、 Overload(重載)Overrided (重寫)的區別。

多態性的不同體現
重載:同一個類中,方法名相同,參數不同
重寫:父子類中,方法名相同、參數相同、返回值類型原則上要求相同,但子類的方法權限不允許小於父類,不允許拋出比父類更多的異常。

 

位置

方法名

參數表

返回值

訪問修飾符

方法重寫

子類

相同

相同

相同或是其子類

不能比父類更嚴格

方法重載

同類

相同

不相同

無關

無關

70、 Overloaded的方法是否可以改變返回值的類型?

可以

71、 abstract class和interface有什么區別?

聲明方法的存在而不去實現它的類叫抽象類。不能創建抽象類的實例;然而可以創建安一個變量,其類型是一個抽象類,並讓他指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。
接口是抽象類的變體,接口中所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口只可以定義static final成員變量

72、 equals()和“==”的區別

==比較地址,equals比較內容,equalstrue== 不一定為true

73、 &和&&的區別。

&是位運算符,按位與 &&是邏輯運算符,邏輯與

74、 Java構造方法的特點

沒有返回值、方法名與類名相同、不能由編程人員調用、可以定義多個構造方法,如果沒有,編譯時系統會自動插入一個無參構造方法,這個構造方法不執行任何代碼、可以重載。

75、 Final可以修飾什么?修飾后具有什么特點

變量:常量,只能被賦值一次,值不可改變
方法:不可重寫
類:不可繼承,沒有子類

76、 接口是否可繼承接口

可以

77、 抽象類是否可實現(implements)接口?

可以

78、 抽象類是否可繼承實體類?

可以繼承,但是和實體類的繼承一樣,也要求父類可繼承,並且擁有子類可訪問到的構造器。

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

不是,它是final類型的。

80、 String s = new String(“abc”);創建了幾個String Object?

2個,一個是String對象池中的“xyz”,一個是堆中的對象,指向池中的“xyz”至於s,是放在棧中的引用,不是對象。

81、 String、StringBufferStringBuilder的區別.

 

String是不可變的對象,每次對String類型進行改變的時候其實是產生了一個新的String對象,然后指針指向新的String對象;
StringBuffer是線程安全的可變字符序列,需要同步,則使用。
StringBuilder線程不安全,速度更快,單線程使用。
String是一個類,但卻是不可變的,所以String創建的算是一個字符串常量,StringBufferStringBuilder都是可變的。所以每次修改String對象的值都是新建一個對象再指向這個對象。而使用StringBuffer則是對StringBuffer對象本身進行操作。所以在字符串經常改變的情況下,使用StringBuffer要快得多。)

82、 是否可以繼承String類,為什么

不可以,string類是final

83、 GC是什么? 為什么要有GC? 

 

通過System.gc   runtime.gc , finllize  (都在java.lang包下)這兩個方法來執行

 

java垃圾回收器,Java是由C++發展來的。它擯棄了C++中一些繁瑣容易出錯的東西。其中有一條就是這個GC
GC是垃圾收集的意思(Gabage Collection,內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。

84、 異常的體系結構,從類與類之間的關系來回答

java.lang.Throwable
ErrorException
RuntimeException和非運行時異常,非運行時異常需要處理。

85、 JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什么意義?

Try:執行部分,產生異常

Catch:捕捉異常

Finally:不管有沒有異常都執行

Throws:在方法聲明處聲明要拋出的異常,調用者必須對其進行處理。

Throw:拋出一個異常

 

try中可以拋出異常,一般與聲明的異常相同。

 

自定義異常要繼承於ExceptionException的子類

86、 errorexception有什么區別

error是錯誤,程序基本無能為力。exception是因為程序設計的瑕疵而引起的問題或者一般性問題,是程序必須處理的。

87、 常見的runtime exception有哪些

ClassCastExcetionNullPointerExceptionNumberFormatExceptionOutOfMemoryExceptionArrayIndexOfBoundsExceptionArithmeticException, 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

非運行時異常:IO異常、SQL異常、NoSuchMethod異常

88、 數組有沒有length()這個方法? String有沒有length()這個方法?

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

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

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

90、 Java有沒有goto

gotojava保留字,但沒有實現;但是有label

91、 swtich是否能作用在byte上,是否能作用在long上,是否能作用在String?

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

92、 try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?

會執行,在return前執行

93、 Java有幾種訪問權限控制,請分別詳細說明控制范圍

訪問修飾符

本類

同包

子類           

其他

private

 

 

 

默認(friendly)

 

 

protected

 

public

94、 當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,並可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞

:是值傳遞。Java 編程語言只有值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是該對象的引用一個副本。指向同一個對象,對象的內容可以在被調用的方法中改變,但對象的引用(不是引用的副本)是永遠不會改變的。

95、 Equals()hashCode()有什么關系?

equals()相等的兩個對象,hashcode()一定相等; equals()不相等的兩個對象, hashcode()有可能相等。

96、 可變參數的用法

核心就是這個方法, 把參數is理解成一個數組就是了:

private static void function(int... is) {

  for (int i = 0; i < is.length; i++) {

    System.out.print(is[i]+"  ");

  }

}

 

97、 abstract classinterface有什么區別?

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

98、 heapstack有什么區別。

棧是一種線形集合,其添加和刪除元素的操作應在同一段完成。棧按照后進先出的方式進行處理。堆是棧的一個組成元素

 

99、 當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?

不能,一個對象的一個synchronized方法只能由一個線程訪問。

100、 請說出你所知道的線程同步的方法?

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

101、 char型變量中能不能存貯一個中文漢字?為什么?

能夠定義成為一個中文的,因為java中以unicode編碼,一個char占16個字節,所以放一個中文是沒問題的

102、 如何取得年月日,小時分秒?

Calendar c=Calendar.getInstance();

c.set(Calendar.YEAR,2004);

c.set(Calendar.MONTH,0);

c.set(Calendar.DAY_OF_MONTH,31);

System.out.println(c.get(Calendar.YEAR)+"  "+(c.get(Calendar.MONTH)+1)+"  "+c.get(Calendar.DAY_OF_MONTH));

103、 如何取得從1970年到現在的毫秒數

Java.util.Date dat=new Date();

long now=dat.getTime();

104、 如何獲取某個日期是當月的最后一天?

當前日期加一天,若當前日期與結果的月份不相同,就是最后一天。

 

取下一個月的第一天,下一個月的第一天-1

 

public static void main(String[] args) {

Calendar c=Calendar.getInstance();

c.set(Calendar.YEAR,2004);

c.set(Calendar.MONTH,0);

c.set(Calendar.DAY_OF_MONTH,30);

Calendar c1=(Calendar)c.clone();

System.out.println(c.get(Calendar.YEAR)+"  "+(c.get(Calendar.MONTH)+1)+"  "+c.get(Calendar.DAY_OF_MONTH));

 

c.add(Calendar.DAY_OF_MONTH,1);

if(c.get(Calendar.MONTH)!=c1.get(Calendar.MONTH)) {

System.out.println("是最后一天");

}else {

System.out.println("不是取后一天");

}

}

105、 如何格式化日期?

Import java.text. SimpleDateFormat;

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

Date dat=new Date();

//把日期轉化為字符串

String str=sdf.format(dat);

System.out.println(str);

//將字符串轉化為日期

Java.util.Date d1=sdf.parse(“yyyy-mm-dd”);

106、 編碼轉換,怎樣實現將GB2312編碼的字符串轉換為ISO-8859-1編碼的字符串。

String a=new String("".getBytes("gb2312"),"iso-8859-1");

String a=new String("".getBytes("iso-8859-1"));

107、 String s = new String("xyz");創建了幾個String Object?

New了一個,”XYZ”本來又是一個,兩個。

108、 float型float f=3.4是否正確?

報錯,應當是float f=3.4f

如果是float f=3(整數)正確

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

static i = 10; //常量

class A a;  a.i =10;//可變

靜態方法可以調用靜態變量。

實現方法可以調用靜態變量、實例變量

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

不可以,如果其中包含對象的method();不能保證對象初始化。

111、 什么時候用assert

assertion (斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。在實現中,assertion就是在程序中的一條語句,它對一個 boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值為true;如果該值為false,說明程序已經處於不正確的狀態下,系統將給出警告或退出。一般來說,assertion用於保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啟。為了提高性能,在軟件發布后,assertion檢查通常是關閉的。

 

二、 集合框架

112、 從接口、類的角度簡述集合框架體系結構

 

113、 說出ArrayList,Vector, LinkedList的存儲性能和特性

ArrayListVector都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由於使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快。

114、 CollectionCollections的區別,HashMapHashtable的區別

Collection是集合類的上級口,繼承於它的借口主要有SetList

Collections是針對集合類的一個幫助類,他提供了一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作;

 

HashMapHashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap允許空(null)鍵值(key,由於非線程安全,效率上可能高於Hashtable

HashMap允許將null作為一個entrykey或者value,而Hashtable不允許。

HashMapHashtablecontains方法去掉了,改成containsvaluecontainsKey。因為contains方法容易讓人引起誤解。 Hashtable繼承自Dictionary類,而HashMapJava1.2引進的Map interface的一個實現。

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

HashtableHashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。

 

 

Ps: 集合的幫助類是java.util.Collections  

       數組的幫助類是 arrays;

115、 List, Set, Map是否繼承自Collection接口

ListSet是,Map不是;

116、 Set里的元素是不能重復的,那么用什么方法來區分重復與否呢?

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

117、 集合排序的常見二種寫法?

“集合框架”中有兩種比較接口:Comparable接口和Comparator接口。像StringIntegerJava內建類實現Comparable接口以提供一定排序方式,但這樣只能實現該接口一次。對於那些沒有實現Comparable接口的類、或者自定義的類,您可以通過Comparator接口來定義您自己的比較方式。

118、 如何將數組轉換成集合,集合轉換成數組?

數組轉集合:List list = Arrays.asList(new String[]{“abc”,”abc”});

集合轉數組:toArray()

119、 如何對各種集合進行迭代?

Listadd()get()for();
Setadd()、通過Iterator取、iterator();
Mapput()、通過keySet()entrySet()迭代

120、 Entryset

entrySetkeySet更快

三、 IO

121、 java中有幾種類型的流?

字符流、字節流;
輸入流、輸出流;

122、 JDK為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?

InputStreamOutputStreamReaderWriter

123、 字節流與字符流的轉換方法?

InputStreamReader OutputStreamWriter

124、 JavaIO流基礎分類方式(字節流、字符流與基本流、過濾流)及他們之間的關系?

125、 什么是java序列化,如何實現java序列化?

實現序列化接口SerializableObjectOutputStreamObjectInputStram

四、 多線程

126、 多線程有幾種實現方法?

實現Runnable接口,實現run方法,new Thread(對象).start();繼承Thread類,new一個對象,對象.start()啟動。

127、 ThreadRunnable的區別和使用?

Thread類的start不能覆蓋;Runnablerun方法由Threadstart調用

128、 如何實現線程同步?

synchronized:在同一時刻,只能被一個線程訪問。要求對象先持有對象上的鎖。代碼執行完會自動釋放鎖。
wait()notify()

129、 sleep() wait() 有什么區別?

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

130、 同步和異步有何異同,在什么情況下分別使用他們?舉例說明。

如果數據將在線程間共享。例如正在寫的數據以后可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那么這些數據就是共享數據,必須進行同步存取。當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時, 就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。

131、 虛擬機如何啟動一個線程?

start方法

132、 線程有哪些狀態,這些狀態是如何轉換的?

創建狀態:new Thread

可運行狀態:Runnablestart方法啟動線程后,分配了除cpu外的其他資源yield方法后,IO完成、join中斷、sleep借宿、同步鎖被釋放

運行中狀態:Running,占有cpu,系統真正執行run方法

阻塞狀態:Blockedsleep方法、join方法、wait方法,synchronized進入同步塊后

死亡狀態:Deadrun運行結束或者異常退出

 

 

 

 

 

Java多線程面試問題

1. 進程和線程之間有什么不同?

一個進程是一個獨立(self contained)的運行環境,它可以被看作一個程序或者一個應用。而線程是在進程中執行的一個任務。Java運行環境是一個包含了不同的類和程序的單一進程。線程可以被稱為輕量級進程。線程需要較少的資源來創建和駐留在進程中,並且可以共享進程中的資源。

2. 多線程編程的好處是什么?

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

3. 用戶線程和守護線程有什么區別?

當我們在Java程序中創建一個線程,它就被稱為用戶線程。一個守護線程是在后台執行並且不會阻止JVM終止的線程。當沒有用戶線程在運行的時候,JVM關閉程序並且退出。一個守護線程創建的子線程依然是守護線程。

4. 我們如何創建一個線程?

有兩種創建線程的方法:一是實現Runnable接口,然后將它傳遞給Thread的構造函數,創建一個Thread對象;二是直接繼承Thread類。若想了解更多可以閱讀這篇關於如何在Java中創建線程的文章。

5. 有哪些不同的線程生命周期?

當我們在Java程序中新建一個線程時,它的狀態是New。當我們調用線程的start()方法時,狀態被改變為Runnable。線程調度器會為Runnable線程池中的線程分配CPU時間並且講它們的狀態改變為Running。其他的線程狀態還有Waiting,Blocked 和Dead。讀這篇文章可以了解更多關於線程生命周期的知識。

6. 可以直接調用Thread類的run()方法么?

當然可以,但是如果我們調用了Thread的run()方法,它的行為就會和普通的方法一樣,為了在新的線程中執行我們的代碼,必須使用Thread.start()方法。

7. 如何讓正在運行的線程暫停一段時間?

我們可以使用Thread類的Sleep()方法讓線程暫停一段時間。需要注意的是,這並不會讓線程終止,一旦從休眠中喚醒線程,線程的狀態將會被改變為Runnable,並且根據線程調度,它將得到執行。

8. 你對線程優先級的理解是什么?

每一個線程都是有優先級的,一般來說,高優先級的線程在運行時會具有優先權,但這依賴於線程調度的實現,這個實現是和操作系統相關的(OS dependent)。我們可以定義線程的優先級,但是這並不能保證高優先級的線程會在低優先級的線程前執行。線程優先級是一個int變量(從1-10),1代表最低優先級,10代表最高優先級。

9. 什么是線程調度器(Thread Scheduler)和時間分片(Time Slicing)?

線程調度器是一個操作系統服務,它負責為Runnable狀態的線程分配CPU時間。一旦我們創建一個線程並啟動它,它的執行便依賴於線程調度器的實現。時間分片是指將可用的CPU時間分配給可用的Runnable線程的過程。分配CPU時間可以基於線程優先級或者線程等待的時間。線程調度並不受到Java虛擬機控制,所以由應用程序來控制它是更好的選擇(也就是說不要讓你的程序依賴於線程的優先級)。

10. 在多線程中,什么是上下文切換(context-switching)?

上下文切換是存儲和恢復CPU狀態的過程,它使得線程執行能夠從中斷點恢復執行。上下文切換是多任務操作系統和多線程環境的基本特征。

11. 你如何確保main()方法所在的線程是Java程序最后結束的線程?

我們可以使用Thread類的joint()方法來確保所有程序創建的線程在main()方法退出前結束。這里有一篇文章關於Thread類的joint()方法

12.線程之間是如何通信的?

當線程間是可以共享資源時,線程間通信是協調它們的重要的手段。Object類中wait()\notify()\notifyAll()方法可以用於線程間通信關於資源的鎖的狀態。點擊這里有更多關於線程wait, notify和notifyAll.

13.為什么線程通信的方法wait(), notify()和notifyAll()被定義在Object類里?

Java的每個對象中都有一個鎖(monitor,也可以成為監視器) 並且wait(),notify()等方法用於等待對象的鎖或者通知其他線程對象的監視器可用。在Java的線程中並沒有可供任何對象使用的鎖和同步器。這就是為什么這些方法是Object類的一部分,這樣Java的每一個類都有用於線程間通信的基本方法

14. 為什么wait(), notify()和notifyAll()必須在同步方法或者同步塊中被調用?

當一個線程需要調用對象的wait()方法的時候,這個線程必須擁有該對象的鎖,接着它就會釋放這個對象鎖並進入等待狀態直到其他線程調用這個對象上的notify()方法。同樣的,當一個線程需要調用對象的notify()方法時,它會釋放這個對象的鎖,以便其他在等待的線程就可以得到這個對象鎖。由於所有的這些方法都需要線程持有對象的鎖,這樣就只能通過同步來實現,所以他們只能在同步方法或者同步塊中被調用。

15. 為什么Thread類的sleep()和yield()方法是靜態的?

Thread類的sleep()和yield()方法將在當前正在執行的線程上運行。所以在其他處於等待狀態的線程上調用這些方法是沒有意義的。這就是為什么這些方法是靜態的。它們可以在當前正在執行的線程中工作,並避免程序員錯誤的認為可以在其他非運行線程調用這些方法。

16.如何確保線程安全?

Java中可以有很多方法來保證線程安全——同步,使用原子類(atomic concurrent classes),實現並發鎖,使用volatile關鍵字,使用不變類和線程安全類。在線程安全教程中,你可以學到更多。

17. volatile關鍵字在Java中有什么作用?

當我們使用volatile關鍵字去修飾變量的時候,所以線程都會直接讀取該變量並且不緩存它。這就確保了線程讀取到的變量是同內存中是一致的。

18. 同步方法和同步塊,哪個是更好的選擇?

同步塊是更好的選擇,因為它不會鎖住整個對象(當然你也可以讓它鎖住整個對象)。同步方法會鎖住整個對象,哪怕這個類中有多個不相關聯的同步塊,這通常會導致他們停止執行並需要等待獲得這個對象上的鎖。

19.如何創建守護線程?

使用Thread類的setDaemon(true)方法可以將線程設置為守護線程,需要注意的是,需要在調用start()方法前調用這個方法,否則會拋出IllegalThreadStateException異常。

20. 什么是ThreadLocal?

ThreadLocal用於創建線程的本地變量,我們知道一個對象的所有線程會共享它的全局變量,所以這些變量不是線程安全的,我們可以使用同步技術。但是當我們不想使用同步的時候,我們可以選擇ThreadLocal變量。

每個線程都會擁有他們自己的Thread變量,它們可以使用get()\set()方法去獲取他們的默認值或者在線程內部改變他們的值。ThreadLocal實例通常是希望它們同線程狀態關聯起來是private static屬性。在ThreadLocal例子這篇文章中你可以看到一個關於ThreadLocal的小程序。

21. 什么是Thread Group?為什么建議使用它?

ThreadGroup是一個類,它的目的是提供關於線程組的信息。

ThreadGroup API比較薄弱,它並沒有比Thread提供了更多的功能。它有兩個主要的功能:一是獲取線程組中處於活躍狀態線程的列表;二是設置為線程設置未捕獲異常處理器(ncaught exception handler)。但在Java 1.5中Thread類也添加了setUncaughtExceptionHandler(UncaughtExceptionHandler eh) 方法,所以ThreadGroup是已經過時的,不建議繼續使用。

1

2

3

4

5

6

7

8

t1.setUncaughtExceptionHandler(new UncaughtExceptionHandler(){

 

@Override

public void uncaughtException(Thread t, Throwable e) {

System.out.println("exception occured:"+e.getMessage());

}

 

});

22. 什么是Java線程轉儲(Thread Dump),如何得到它?

線程轉儲是一個JVM活動線程的列表,它對於分析系統瓶頸和死鎖非常有用。有很多方法可以獲取線程轉儲——使用Profiler,Kill -3命令,jstack工具等等。我更喜歡jstack工具,因為它容易使用並且是JDK自帶的。由於它是一個基於終端的工具,所以我們可以編寫一些腳本去定時的產生線程轉儲以待分析。讀這篇文檔可以了解更多關於產生線程轉儲的知識。

23. 什么是死鎖(Deadlock)?如何分析和避免死鎖?

死鎖是指兩個以上的線程永遠阻塞的情況,這種情況產生至少需要兩個以上的線程和兩個以上的資源。

分析死鎖,我們需要查看Java應用程序的線程轉儲。我們需要找出那些狀態為BLOCKED的線程和他們等待的資源。每個資源都有一個唯一的id,用這個id我們可以找出哪些線程已經擁有了它的對象鎖。

避免嵌套鎖,只在需要的地方使用鎖和避免無限期等待是避免死鎖的通常辦法,閱讀這篇文章去學習如何分析死鎖

24. 什么是Java Timer類?如何創建一個有特定時間間隔的任務?

java.util.Timer是一個工具類,可以用於安排一個線程在未來的某個特定時間執行。Timer類可以用安排一次性任務或者周期任務。

java.util.TimerTask是一個實現了Runnable接口的抽象類,我們需要去繼承這個類來創建我們自己的定時任務並使用Timer去安排它的執行。

這里有關於java Timer的例子

25. 什么是線程池?如何創建一個Java線程池?

一個線程池管理了一組工作線程,同時它還包括了一個用於放置等待執行的任務的隊列。

java.util.concurrent.Executors提供了一個 java.util.concurrent.Executor接口的實現用於創建線程池。線程池例子展現了如何創建和使用線程池,或者閱讀ScheduledThreadPoolExecutor例子,了解如何創建一個周期任務。

 

Java並發面試問題

1. 什么是原子操作?在Java Concurrency API中有哪些原子類(atomic classes)?

原子操作是指一個不受其他操作影響的操作任務單元。原子操作是在多線程環境下避免數據不一致必須的手段。

int++並不是一個原子操作,所以當一個線程讀取它的值並加1時,另外一個線程有可能會讀到之前的值,這就會引發錯誤。

為了解決這個問題,必須保證增加操作是原子的,在JDK1.5之前我們可以使用同步技術來做到這一點。到JDK1.5,java.util.concurrent.atomic包提供了int和long類型的裝類,它們可以自動的保證對於他們的操作是原子的並且不需要使用同步。可以閱讀這篇文章來了解Java的atomic類

2. Java Concurrency API中的Lock接口(Lock interface)是什么?對比同步它有什么優勢?

Lock接口比同步方法和同步塊提供了更具擴展性的鎖操作。他們允許更靈活的結構,可以具有完全不同的性質,並且可以支持多個相關類的條件對象。

它的優勢有:

可以使鎖更公平

可以使線程在等待鎖的時候響應中斷

可以讓線程嘗試獲取鎖,並在無法獲取鎖的時候立即返回或者等待一段時間

可以在不同的范圍,以不同的順序獲取和釋放鎖

閱讀更多關於鎖的例子

3. 什么是Executors框架?

Executor框架同java.util.concurrent.Executor 接口在Java 5中被引入。Executor框架是一個根據一組執行策略調用,調度,執行和控制的異步任務的框架。

無限制的創建線程會引起應用程序內存溢出。所以創建一個線程池是個更好的的解決方案,因為可以限制線程的數量並且可以回收再利用這些線程。利用Executors框架可以非常方便的創建一個線程池,閱讀這篇文章可以了解如何使用Executor框架創建一個線程池

4. 什么是阻塞隊列?如何使用阻塞隊列來實現生產者-消費者模型?

java.util.concurrent.BlockingQueue的特性是:當隊列是空的時,從隊列中獲取或刪除元素的操作將會被阻塞,或者當隊列是滿時,往隊列里添加元素的操作會被阻塞。

阻塞隊列不接受空值,當你嘗試向隊列中添加空值的時候,它會拋出NullPointerException。

阻塞隊列的實現都是線程安全的,所有的查詢方法都是原子的並且使用了內部鎖或者其他形式的並發控制。

BlockingQueue 接口是java collections框架的一部分,它主要用於實現生產者-消費者問題。

閱讀這篇文章了解如何使用阻塞隊列實現生產者-消費者問題。

5. 什么是Callable和Future?

Java 5在concurrency包中引入了java.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一個對象或者拋出一個異常。

Callable接口使用泛型去定義它的返回類型。Executors類提供了一些有用的方法去在線程池中執行Callable內的任務。由於Callable任務是並行的,我們必須等待它返回的結果。java.util.concurrent.Future對象為我們解決了這個問題。在線程池提交Callable任務后返回了一個Future對象,使用它我們可以知道Callable任務的狀態和得到Callable返回的執行結果。Future提供了get()方法讓我們可以等待Callable結束並獲取它的執行結果。

閱讀這篇文章了解更多關於Callable,Future的例子

6. 什么是FutureTask?

FutureTask是Future的一個基礎實現,我們可以將它同Executors使用處理異步任務。通常我們不需要使用FutureTask類,單當我們打算重寫Future接口的一些方法並保持原來基礎的實現是,它就變得非常有用。我們可以僅僅繼承於它並重寫我們需要的方法。閱讀Java FutureTask例子,學習如何使用它。

7.什么是並發容器的實現?

Java集合類都是快速失敗的,這就意味着當集合被改變且一個線程在使用迭代器遍歷集合的時候,迭代器的next()方法將拋出ConcurrentModificationException異常。

並發容器支持並發的遍歷和並發的更新。

主要的類有ConcurrentHashMap, CopyOnWriteArrayList 和CopyOnWriteArraySet,閱讀這篇文章了解如何避免ConcurrentModificat

ionException

8. Executors類是什么?

Executors為Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable類提供了一些工具方法。

Executors可以用於方便的創建線程池。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

五、 Socket

133、 TCPUDP區別和使用

TCP:面向連接,流的形式進行數據傳遞,更可靠;Socket,ServerSocket

UDP:使用報文數據包,不面向連接;DatagramSocket、DatagramPacket

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM