JavaSE 面試題總結

1、 JavaSE 4java

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

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

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

4 JAVA的事件委託機制和垃圾回收機制 4面試

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

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

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

9九、 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

2、 集合框架 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

3、 IO 16

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

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

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

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

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

4、 多線程 16

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

129 ThreadRunnable的區別和使用? 16

130 如何實現線程同步? 16

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

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

133 如何啓動一個線程? 517

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

5、 Socket 17

135 TCPUDP區別和使用 17

 

 

1、 JavaSE

一、 面向對象的特徵有哪些方面

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

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

基本數據類型包括byteintcharlongfloatdoublebooleanshortjava.lang.String類是final類型的,所以不能夠繼承這個類、不能修改這個類。爲了提升效率節省空間,咱們應該用StringBuffer

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

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

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

而this他表明當前對象,固然全部的資源均可以訪問.

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

四、 JAVA的事件委託機制和垃圾回收機制

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

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

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

break; return 方法。

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

序列化:

能夠將一個對象保存到一個文件,因此能夠經過流的方式在網絡上傳輸,能夠將文件的內容讀取,轉化爲一個對象。

處理對象流的機制,所謂對象流也就是將對象的內容進行流化。能夠對流化後的對象進行讀寫操做,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操做時所引起的問題。

序列化的實現:

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

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

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

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

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

九、 列舉出JAVA 6 個比較經常使用的包

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

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

能夠。若是這個類的修飾符是public,其類名與文件名必須相同。

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

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

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

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

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

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

快速排序的僞代碼。

1三、 什麼是類的返射機制?

動態得到對象

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

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

java.lang.Class

java.lang.refrection.Method

java.lang.refrection.Field

java.lang.refrection.Constructor

java.lang.refrection.Modifier

java.lang.refrection.Interface

1五、 獲得Class的三個過程是什麼?

對象.getClass()

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

Class.forName();

1六、 STOP()SUSPEND()不推薦使用的緣由?

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

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

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

靜態變量屬於類,不用實例化就已經存在,全部的實例共享同一個靜態變量,能夠經過類名和實例名來訪問。實例變量屬於實例,每一個實例都有本身的這個變量,只能經過實例名來訪問。

1八、 什麼是構造器,構造器的特徵

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

1九、 在一個主方法類可不能夠調用一個非靜態的方法?

若是在同一個類中,實例方法能夠直接使用方法名調用,靜態方法不能直接調用非靜態方法,須要實例化後,經過對象再調用。

若是在不一樣類中,實例方法須要先實例化,而後經過對象調用,靜態方法,直接經過類名.方法調用。

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

對於GC來講,當程序員建立對象時,GC就開始監控這個對象的地址、大小以及使用狀況。一般,GC採用有向圖的方式記錄和管理堆(heap)中的全部對象。經過這種方式肯定哪些對象是"可達的",哪些對象是"不可達的"。當GC肯定一些對象爲"不可達"時,GC就有責任回收這些內存空間。能夠。程序員能夠手動執行System.gc(),通知GC運行,可是Java語言規範並不保證GC必定會執行。

2一、 Java 的異常有哪幾種,有什麼區別?

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

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

java爲系統異常和普通異常提供了不一樣的解決方案,編譯器強制普通異常必須try..catch處理或用throws聲明繼續拋給上層調用方法處理,因此普通異常也稱爲checked異常,而系統異常能夠處理也能夠不處理,因此,編譯器不強制用try..catch處理或用throws聲明,因此係統異常也稱爲unchecked異常。

2二、 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中還定義了表示整數的最大值和最小值的常量。

2三、 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類:提供了動態建立數組,以及訪問數組的元素的靜態方法

 

2四、 寫幾個 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() 方法,或者其餘某個線程中斷當前線程,或者已超過某個實際時間量。

 

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

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

2六、 ThrowableErrorExceptionRuntimeException的區別與聯繫?

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

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

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

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

 

2七、 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.如何可能的話,應該在系統級被捕捉

2八、 靜態的多態和動態的多態的區別?

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

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

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{ }

2九、 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 對象,好比想根據用戶輸入的字符串來建立對象

3一、 Socket 如何獲取本地ip 地址?

java中從Socket中獲取IP地址經過SocketgetInetAddress()方法便可得到Socket中的Ip地址。其中Socket中還能夠經過getLocalAddress()獲取Socket綁定的本地地址。

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

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

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

3三、 char 型變量中能不能存貯一箇中文漢字?爲何?

沒法存儲。由於char型具備的空間比漢字佔有的空間要小。char型變量,佔用空間爲一個字節。漢字根據不一樣編碼方式,最少須要兩個字節,最多可能有三個字節甚至6個字節。因此單個char變量是沒法存儲下中文漢字的。

3四、 clone()方法時,一般都有一行代碼,是什麼?

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

3五、 說說經常使用集合類有哪些?有哪些方法?

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

3六、 是否能夠從一個static 方法內部發出對非static 方法的調用?

不能夠。由於非static 方法是要與對象關聯在一塊兒的,必須建立一個對象後,才能夠在該對象上進行方法調用,而static 方法調用時不須要建立對象,能夠直接調用。

3七、 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。

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

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

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

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

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

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

3九、 內部類能夠引用成員嗎?有沒有什麼限制?

徹底能夠。若是不是靜態內部類,那沒有什麼限制!若是你把靜態嵌套類看成內部類的一種特例,那在這種狀況下不能夠訪問外部類的普通

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

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

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

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

4一、 什麼是Java 序列化,如何實現java 序列化?或者請解釋Serializable 接口的做用。

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

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

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

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

4三、 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();

4四、 JAVA 事件有哪些模式?

一、事件直接驅動模式。它的特色是直接並且快,是必須常用的,主要適合於迅速處理前臺的命令,一般就是咱們說的command(命令)模式。

2.監控式事件模式。主要藉助第三者來監控和觸發事件,就是一般咱們說的觀察者模式。特色是: 有一個觀察者置身事外在按期獨立運行着,咱們將咱們要監聽的事件向這個觀察者註冊,這樣觀察者就代替咱們來監聽這個事件,應用客戶端經過觀察者來得到事件情況。

4五、 SOCKET 中有幾中鏈接方式,各有什麼區別?

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

4六、 Hashtable 的原理

經過節點的關鍵碼肯定節點的存儲位置,即給定節點的關鍵碼k,經過必定的函數關係H(散列函數),獲得函數值H(k),將此值解釋爲該節點的存儲地址

4七、 JDBC 中的PreparedStatement 相比Statement 的好處?

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

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

4八、 sleep()wait()區別

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

試,直到條件知足爲止。

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

4九、 概述反射和序列化

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 的方法是能夠改變返回值的類型。

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

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

關於synchronizedabstract合用的問題,我以爲也不行,由於在我幾年的學習和開發中,歷來沒見到過這種狀況,而且我以爲synchronized應該是做用在一個具體的方法上纔有意義。並且,方法上的synchronized同步所使用的同步鎖對象是this,而抽象方法上沒法肯定this是什麼。

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

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

經過Class對象及方法參數獲得Method

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

5三、 如何將數值型字符轉換爲數字(Integer,Double)?

Integer.parseInt(「1234」)

Double.parseDouble(「123.2」)

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

double d=1256.22d;

d=d/100;

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

5五、 int Integer 有什麼區別?

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

5六、 String StringBuffer的區別? 

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

5七、 運行時異常與通常異常有何異同? 

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

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

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

5九、 Collection Collections的區別。

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

60、 &&&的區別

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

6一、 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算法都大概同樣,因此性能不會有很大的差別。

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

byte int short long float double char boolean

6三、 什麼是OOP?什麼是類?請對比類和對象實例之間的關係

面向對象編程;

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

6四、 JDKJREJVM是什麼?

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

6五、 intInteger有什麼區別,互相之間如何轉換

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

int b = a.intValue();

6六、 類加載的初始化順序

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

6七、 final, finally, finalize的區別

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

6八、 線程的基本概念、線程的基本狀態以及狀態之間的關係

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

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

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

 

位置

方法名

參數表

返回值

訪問修飾符

方法重寫

子類

相同

相同

相同或是其子類

不能比父類更嚴格

方法重載

同類

相同

不相同

無關

無關

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

能夠

7一、 abstract class和interface有什麼區別?

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

7二、 equals()和「==」的區別

==比較地址,equals比較內容,equalstrue== 不必定爲true

7三、 &和&&的區別。

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

7四、 Java構造方法的特色

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

7五、 Final能夠修飾什麼?修飾後具備什麼特色

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

7六、 接口是否可繼承接口

能夠

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

能夠

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

能夠繼承,可是和實體類的繼承同樣,也要求父類可繼承,而且擁有子類可訪問到的構造器。

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

不是,它是final類型的。

80、 String s = new String(「abc」);建立了幾個String Object?

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

8一、 String、StringBufferStringBuilder的區別.

 

String是不可變的對象,每次對String類型進行改變的時候實際上是產生了一個新的String對象,而後指針指向新的String對象;
StringBuffer是線程安全的可變字符序列,須要同步,則使用。
StringBuilder線程不安全,速度更快,單線程使用。
String是一個類,但倒是不可變的,因此String建立的算是一個字符串常量,StringBufferStringBuilder都是可變的。因此每次修改String對象的值都是新建一個對象再指向這個對象。而使用StringBuffer則是對StringBuffer對象自己進行操做。因此在字符串常常改變的狀況下,使用StringBuffer要快得多。)

8二、 是否能夠繼承String類,爲何

不能夠,string類是final

8三、 GC是什麼? 爲何要有GC? 

 

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

 

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

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

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

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

Try:執行部分,產生異常

Catch:捕捉異常

Finally:無論有沒有異常都執行

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

Throw:拋出一個異常

 

try中能夠拋出異常,通常與聲明的異常相同。

 

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

8六、 errorexception有什麼區別

error是錯誤,程序基本無能爲力。exception是由於程序設計的瑕疵而引發的問題或者通常性問題,是程序必須處理的。

8七、 常見的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異常

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

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

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

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

90、 Java有沒有goto

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

9一、 swtich是否能做用在byte上,是否能做用在long上,是否能做用在String?

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

9二、 try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,何時被執行,在return前仍是後?

會執行,在return前執行

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

訪問修飾符

本類

同包

子類           

其餘

private

 

 

 

默認(friendly)

 

 

protected

 

public

9四、 當一個對象被看成參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏究竟是值傳遞仍是引用傳遞

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

9五、 Equals()hashCode()有什麼關係?

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

9六、 可變參數的用法

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

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

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

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

  }

}

 

9七、 abstract classinterface有什麼區別?

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

9八、 heapstack有什麼區別。

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

 

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

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

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

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

10一、 char型變量中能不能存貯一箇中文漢字?爲何?

可以定義成爲一箇中文的,由於java中以unicode編碼,一個char佔16個字節,因此放一箇中文是沒問題的

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

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

10三、 如何取得從1970年到如今的毫秒數

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

long now=dat.getTime();

10四、 如何獲取某個日期是當月的最後一天?

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

 

取下一個月的第一天,下一個月的第一天-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("不是取後一天");

}

}

10五、 如何格式化日期?

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

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

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

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

10七、 String s = new String("xyz");建立了幾個String Object?

New了一個,」XYZ」原本又是一個,兩個。

10八、 float型float f=3.4是否正確?

報錯,應當是float f=3.4f

若是是float f=3(整數)正確

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

static i = 10; //常量

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

靜態方法能夠調用靜態變量。

實現方法能夠調用靜態變量、實例變量

1十、 是否能夠從一個static方法內部發出對非static方法的調用?

不能夠,若是其中包含對象的method();不能保證對象初始化。

1十一、 何時用assert

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

 

2、 集合框架

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

 

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

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

11四、 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;

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

ListSet是,Map不是;

11六、 Set裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢?

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

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

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

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

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

集合轉數組:toArray()

11九、 如何對各類集合進行迭代?

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

120、 Entryset

entrySetkeySet更快

3、 IO

12一、 java中有幾種類型的流?

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

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

InputStreamOutputStreamReaderWriter

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

InputStreamReader OutputStreamWriter

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

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

實現序列化接口SerializableObjectOutputStreamObjectInputStram

4、 多線程

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

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

12七、 ThreadRunnable的區別和使用?

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

12八、 如何實現線程同步?

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

12九、 sleep() wait() 有什麼區別?

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

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

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

13一、 虛擬機如何啓動一個線程?

start方法

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

建立狀態: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能夠用於方便的建立線程池。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5、 Socket

13三、 TCPUDP區別和使用

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

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

相關文章
相關標籤/搜索