一、String.valueof()、(String)、toString()的區別java
答案:web
(String)進行轉換的時候,若是類型不匹配會拋出類型轉換異常。所以在轉化的時候若是不肯定該類型是否爲String類型,須要先用instanceof進行類型判斷。編程
toString()是java.lang.Object類裏已有的public方法。在使用時要注意,必須保證object不是null值,不然將拋出NullPointerException異常。toString()不會關注類型的轉換,toString()方法返回的是該對象的字符串。設計模式
String.valueOf()是String的靜態方法,可直接經過String調用。String.valueOf()方法會將非空的對象直接調用其toString方法。可是爲空的狀況下會返回"null"而不是null。數組
二、重載(Overload)和重寫(Override)安全
答案:多線程
重載:重載是指同一個類中的多個方法具備相同的名字,但這些方法具備不一樣的參數列表,即參數的數量或參數類型不能徹底相同。併發
a.經過傳遞給它們的不一樣參數個數和參數類型來決定具體使用哪一個方法,也就是多態性。框架
b.返回值類型能夠相同也能夠不一樣。不能以返回值類型做爲重載函數的區分標準。ide
重寫:重寫是存在子父類之間的,子類定義的方法與父類中的方法具備相同的方法名字,相同的參數列表和相同的返回類型。
子類能夠繼承父類中的方法,而不須要從新編寫相同的方法。但有時子類並不想原封不動的繼承父類的方法,而是想作必定的修改。重寫又稱覆蓋。
a.子類中不能重寫父類中的final方法可是必須重寫父類中的abstract方法。
區別:
方法的重載和重寫都是實現多態的方式,區別在於前者實現的是編譯時的多態性,然後者實現的是運行時的多態性。重載發生在一個類中,同名的方法若是有不一樣的參數列表(參數類型不一樣、參數個數不一樣或者兩者都不一樣)則視爲重載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的參數列表,有兼容的返回類型,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常。重載對返回類型沒有特殊的要求,不能根據返回類型進行區分。
三、面向對象特徵之一---多態性
答案:
存在多態的前提條件:
a.有繼承的關係
b.子類重寫父類的方法
c.父類的引用指向子類的對象
多態性是面向對象編程的一種特性,和方法無關。分爲靜態多態性和動態多態性。
一樣的一個方法可以根據輸入數據的不一樣,作出不一樣的處理,即方法的重載--有不一樣的參數列表==>靜態多態性。
當子類繼承自父類的相同方法,輸入數據同樣,但要作出有別於父類的響應時,就要重寫父類方法,即在子類中重寫該方法--相同參數列表,不一樣實現==>動態多態性。
四、String、StringBuffer與StringBuilder之間的區別
答案:
運行速度:StringBuilder>StringBuffer>String
String爲字符串常量,而StringBuilder和StringBuffer均爲字符串變量,即String對象一旦建立以後該對象是不可更改的,但後二者的對象是變量,是能夠更改的。
線程安全:在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的。
String適用於少許的字符串操做的狀況。
StringBuffer適用於多線程下在字符緩衝區進行大量操做的狀況。
StringBuilder適用於單線程下在字符緩衝區進行大量操做的狀況。
五、list、set、map的區別
答案:
list、set都是繼承自Collection接口,map不是。
list存放元素有序,可重複。set存放元素無序,不可重複
list查找元素效率高,插入和刪除元素效率低。set查找元素效率低,插入和刪除元素效率高。
六、過濾器(Filter)與攔截器(Interceptor)的區別
使用範圍不一樣:
Filter只能用於Web程序中。而攔截器既能夠用於Web程序,也能夠用於Application、Swing程序中。
規範不一樣:
Filter是在Servlet規範中定義的,是Servlet容器支持的。而攔截器是在Spring容器中內的,是Spring框架支持的。
使用的資源不一樣:
同其餘的代碼塊同樣,攔截器也是一個Spring的組件,歸Spring管理,配置在Spring文件中,所以能使用Spring裏的任何資源,對象,例如Service對象、數據源、事務管理等,經過IOC注入到攔截器便可。而Filter不能。
深度不一樣:
Filter只在Servlet先後起做用。而攔截器可以深刻到方法先後、異常拋出先後等,所以攔截器的使用具備更大的彈性。因此Spring構架的程序中,須要優先使用攔截器。
一、攔截器是基於Javad的反射機制,而過濾器是基於函數回調。
二、攔截器不依賴與Servlet容器,過濾器依賴與Servlet容器。
三、攔截器只能對action請求起做用,而過濾器則能夠對幾乎全部的請求起做用。
四、在action的生命週期中,攔截器能夠屢次被調用,而過濾器只能在容器初始化時被調用一次。
五、攔截器能夠獲取獲取IOC容器中的各個bean,而過濾器就不行。
六、攔截器須要在Spring配置文件中配置,過濾器只須要在web.xml中配置。
七、簡述單例模式
Java中單例模式是一種常見的設計模式,單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。
單例模式的特色
a.單例類只能有一個實例。
b.單例類必須本身建立本身的惟一實例。
c.單例類必須給全部其餘對象提供這一實例。
單例模式的好處
a.控制資源的使用,經過線程同步來控制資源的併發訪問。
b.控制實例產生的數量,達到節約資源的目的。
八、HashMap和HashTable的區別
不一樣點:
a.HashMap是非線程安全的,而HashTable是線程安全的。(HashTable的實現方法裏都添加了synchronized關鍵字來確保線程同步,在多線程環境下若使用HashMap須要使用Collections.synchronizedMap()方法)。由於HashTable是線程安全的,因此效率比HashMap低。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
b.HashMap的鍵和值均可覺得空。HashTable的鍵和值都不能夠爲空。
c.HashMap的初始容量爲16,HashTable初始容量爲11,二者填充因子默認都是0.75.
d.HashMap擴容時當前容量翻倍即:capacity*2,HashTable擴容時是容量翻倍+1即:capactiy*2-1。
e.二者計算hash的方法不一樣。
相同點:
HashMap和HashTable都實現Map接口。
HashMap和HashTable的底層實現都是數組+鏈表結構實現。
判斷是否含有某個鍵:
HashMap中的get()方法返回null值時,便可以表示HashMap中沒有該鍵,也能夠表示該鍵所對應的值是null。所以,在HashMap中不能用get()方法來判斷HashMap中是否存在某個鍵,而應該用containsKey()方法來判斷。HashTable的鍵值都不能爲null,因此能夠用get()方法來判斷是否包含某個鍵。
九、&和&&、|和||的區別
單&時,左邊不管真假,右邊都進行運算。
雙&&時,若是左邊爲真,右邊參與運算。若是左邊爲假,右邊不參與運算。
單|時,左邊不管真假,右邊都進行運算。
雙||時,左邊爲真,右邊不參與運算。
十、位運算符(^,|,&)
按位與、按位或、異或的計算方式都是轉換爲二進制再計算,不一樣的是運算規則。
&(按位與)
按位與 運算規則爲:兩個爲真才爲真。
例:1&1=1,1&0=0,0&1=0,0&0=0
3 & 5
3的二進制位是0000 0011 , 5的二進制位是0000 0101
011 & 101爲001 最終值爲0000 0001 故3 & 5等於1
|(按位或)
按位或 運算規則爲:一個爲真即爲真。
例:1|0=1,1|1=1,0|0=0,0|1=1
6 | 2
6的二進制位0000 0110 , 2的二進制位0000 0010
110 | 010爲110 最終值爲0000 0110 故6 | 2等於6
^(異或)
異或的運算規則爲:
例:1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0
5的二進制位是0000 0101 , 9的二進制位是0000 1001,也就是0101 ^ 1001,結果爲1100 , 00001100的十進制位是12
十一、Java類的初始化順序(靜態代碼塊 、構造函數等的執行順序)
沒有繼承的狀況下:
執行順序:
1.靜態成員變量
2.靜態代碼塊
3.普通成員變量
4.普通代碼塊
5.構造函數
總結:
1.靜態>普通
2.變量>代碼塊>構造函數
3.構造函數是最後執行的
子類繼承父類的狀況下:
1.父類的靜態成員變量
2.父類的靜態代碼塊
3.子類的靜態成員變量
4.子類的靜態代碼塊
5.父類的成員變量
6.父類的代碼塊
7.父類的構造函數
8.子類的成員變量
9.子類的代碼塊
10.子類的構造函數
總結:
1.先父類再子類
2.若是子類有靜態成員變量和靜態代碼塊,則執行完父類的靜態成員變量和靜態代碼塊後,接着執行子類的靜態成員變量和靜態代碼塊,不然直接按照父類的變量>代碼塊>構造函數,再執行子類的變量>代碼塊>構造函數
3.須要注意的是子類的靜態變量和靜態代碼塊是優先於父類的普通成員變量和代碼塊以及構造函數的。
十二、Java中sleep和wait的區別
一、來自不一樣的類
sleep來自Thread類。wait來自Object類。
sleep是Thread類中的靜態方法,誰調用的誰休眠,即便在a線程裏調用了b的sleep方法,實際仍是a休眠。
二、有沒有釋放鎖(釋放資源)
sleep方法沒有釋放鎖,wait方法釋放了鎖,使其它線程可使用同步控制快或者方法。
sleep不出讓系統資源;wait是進入線程等待持等待,出讓系統資源。其它線程能夠佔用cpu。
sleep能夠加時間限制指定它自動喚醒過來。若是時間不到只能用interrupt()強行打斷。wait通常不會加時間限制,由於wait線程的運行資源不夠,再出來也沒用,要等待其它線程調用notify/notifyAll喚醒等待池中全部線程,纔會進入就緒隊列等待OS分配的系統資源。
就是說sleep有時間限制的就像鬧鐘同樣到時候就叫了,而wait是無限期的,除非用戶主動notify
Thread.Sleep(0)的做用是「觸發操做系統馬上從新進行一次CPU競爭」。
3.使用範圍不一樣
sleep能夠在任何地方使用。wait只能在同步控制方法或者同步控制塊中使用。
4.是否須要捕獲異常
sleep必須捕獲異常。wait不須要捕獲異常。
1三、Java線程的生命週期
1四、Java多線程中start()和run()的區別
Java的線程是經過java.lang.Thread類來實現的。能夠經過建立Thread的實例來建立新的線程。每一個線程都是經過某個特定Thread對象所對應的run()方法來完成其操做的,經過run()方法執行線程體。經過start()方法來啓動一個線程。
多線程原理:
調用start()後,線程會被放到等待隊列,等待cpu調度,並不必定立刻開始執行,只是將這個線程置於可執行狀態。而後經過JVM,線程Thread會調用run()方法,執行本線程的線程體。先調用start後調用run,這麼麻煩,爲了避免直接調用run?就是爲了實現多線程的優勢,沒這個start不行。
多線程就是分時利用CPU,宏觀上讓全部線程一塊兒執行 ,也叫併發。