天天看點

阿裡JAVA開發面試常問問題總結

線程與程序

程序是可并發執行的程式在某個資料集合上的一次計算活動,也是作業系統進行資源配置設定和排程的基本機關。

線程是作業系統程序中能夠并發執行的實體,是處理器排程和分派的基本機關。

每個程序内可包含多個可并發執行的線程。

線程自己基本不擁有系統資源,隻擁有少量必不可少的資源:程式計數器、一組寄存器、棧。

同屬一個程序的線程共享程序所擁有的主存空間和資源。

在傳統os中,擁有資源、獨立排程和分派的基本機關都是程序,在引入線程的系統中,線程是排程和分派的基本機關,而程序是擁有資源的基本機關。

在同一個程序内線程切換不會産生程序切換,由一個程序内的線程切換到另一個程序内的線程時,将會引起程序切換。

線程切換

上下文切換的開銷

當cpu從執行一個線程切換到執行另外一個線程的時候,它需要先存儲目前線程的本地的資料,程式指針等,然後載入另一個線程的本地資料,程式指針等,最後才開始執行。這種切換稱為“上下文切換”(“context switch”)。cpu會在一個上下文中執行一個線程,然後切換到另外一個上下文中執行另外一個線程。

單線程與多線程

多線程可以提高程式的并行性,可以把任務分開有序執行,有效利用cpu資源,提高響應速度。但是并不代表它比單線程處理的速度快,在進行密集計算時,單線程的速度要比多線程快些。

多線程的缺點:

1)增加資源消耗

線程在運作的時候需要從計算機裡面得到一些資源。除了cpu,線程還需要一些記憶體來維持它本地的堆棧。它也需要占用作業系統中一些資源來管理線程。

多個線程在建立和切換時,消耗的時間和資源更多

2)多個線程共享1個cpu,需要cpu不停地切換執行線程。

java某些類為什麼要實作serializable接口?

當一個類實作了serializable接口(該接口僅為标記接口,不包含任何方法定義),表示該類可以序列化.序列化的目的是将一個實作了serializable接口的對象轉換成一個位元組序列,可以把該位元組序列儲存起來(例如:儲存在一個檔案裡),以後可以随時将該位元組序列恢複為原來的對象。

序列化可以将記憶體中的類寫入檔案或資料庫中。比如将某個類序列化後存為檔案,下次讀取時隻需将檔案中的資料反序列化就可以将原先的類還原到記憶體中。也可以将類序列化為流資料進行傳輸。總的來說就是将一個已經執行個體化的類轉成檔案存儲,下次需要執行個體化的時候隻要反序列化即可将類執行個體化到記憶體中并保留序列化時類中的所有變量和狀态。 甚至可以将該位元組序列放到其他計算機上或者通過網絡傳輸到其他計算機上恢複,隻要該計 算機平台存在相應的類就可以正常恢複為原來的對象。

序列化的實作:将需要被序列化的類實作serializable接口,該接口沒有需要實作的方法,implements serializable隻是為了标注該對象是可被序列化的,然後使用一個輸出流(如:fileoutputstream)來構造一個objectoutputstream(對象流)對象,接着,使用objectoutputstream對象的writeobject(object obj)方法就可以将參數為obj的對象寫出(即儲存其狀态),要恢複的話則用輸入流。

hashmap與hashtable的差別?以及如何使用,以及他的一些方法?

1、hashmap不是線程安全的

hashmap是一個接口,是map接口的子接口,是将鍵映射到值的對象,其中鍵和值都是對象,并且不能包含重複鍵,但可以包含重複值。hashmap允許null key和null value,而hashtable不允許。

2、hashtable是線程安全的一個collection。

hashmap是hashtable的輕量級實作(非線程安全的實作),他們都完成了map接口,主要差別在于hashmap允許空(null)鍵值(key),由于非線程安全,效率上可能高于hashtable。hashmap允許将null作為一個entry的key或者value,而hashtable不允許。 hashmap把hashtable的contains方法去掉了,改成containsvalue和containskey。因為contains方法容易讓人引起誤解。 hashtable繼承自dictionary類,而hashmap是java1.2引進的map接口的一個實作。 最大的不同是,hashtable的方法是synchronize的,而hashmap不是,在多個線程通路hashtable時,不需要自己為它的方法實作同步,而hashmap 就必須為之提供外同步。 hashtable和hashmap采用的hash/rehash算法都大概一樣,是以性能不會有很大的差别。

總結:

hashmap線程不安全 允許有null的鍵和值 效率高一點、 方法不是synchronize的,要提供外同步 有containsvalue和containskey方法

hashtable 線程安全 不允許有null的鍵和值 效率稍低、 方法是synchronize的 有contains方法方法

hashtable 繼承于dictionary 類 hashtable 比hashmap 要舊

hashmap 是java1.2 引進的map interface 的一個實作,hashmap是hashtable的輕量級實作。

利用hashmap對蘋果的重量進行排序

一、按key值排序

假設hashmap存儲的鍵-值對為(string,integer),按key排序可以調用jdk函數sort(預設的按字典升序):

如果想要按字典的降序排列,則需改寫sort方法裡面的比較器comparator:

二、按value值排序

1)方法一:用兩個list連結清單實作

struts2攔截器

大部分時候,攔截器方法都是通過代理的方式來調用的。struts 2的攔截器實作相對簡單。當請求到達struts 2的servletdispatcher時,struts 2會查找配置檔案,并根據其配置執行個體化相對的攔截器對象,然後串成一個清單(list),最後一個一個地調用清單中的攔截器。事實上,我們之是以能夠如此靈活地使用攔截器,完全歸功于“動态代理”的使用。動态代理是代理對象根據客戶的需求做出不同的處理。對于客戶來說,隻要知道一個代理對象就行了。那struts2中,攔截器是如何通過動态代理被調用的呢?當action請求到來的時候,會由系統的代理生成一個action的代理對象,由這個代理對象調用action的execute()或指定的方法,并在struts.xml中查找與該action對應的攔截器。如果有對應的攔截器,就在action的方法執行前(後)調用這些攔截器;如果沒有對應的攔截器則執行action的方法。其中系統對于攔截器的調用,是通過actioninvocation來實作的。

struts2接受參數的方式

1.用action的屬性:

在action 裡面定義要接收的參數,并提供相應的setter,getter,和送出參數的名稱一緻,并不用做資料類型的轉換。

相應送出方式可以用get 和post,如:testaction? name=admin

2.使用domainmodel:

在action 裡面不用很多的屬性,而是用model 層用到的模型,儲存它的一個對象。相應送出方式可以用get 和post,

如:testaction? resbananrc.name=admin

3.使用dto–資料傳輸對象

它的作用是接收參數,傳遞參數,并不是項目中的實體類。如使用者注冊時,會用到确認密碼,是以要先把參數接收過

來,做處理後,再傳遞給相應方法去建立user 對象。送出參數的方式的domain model 方式的相同。

4.使用modeldriven:

在建立action 的時候,action 實作了modeldriven 接口,去調用接口的getmodel()方法,取到了相關對象。

5.使用request對象:

此方法與與傳統的jsp 等傳接參數一樣,即使用request. getparameter(“”)方法

java異常,error和exception

阿裡JAVA開發面試常問問題總結

異常分類圖

1.error:所有都繼承自error,表示緻命的錯誤,比如記憶體不夠,位元組碼不合法等。 error是程式無法處理的錯誤,比如outofmemoryerror、threaddeath等。這些異常發生時,java虛拟機(jvm)一般會選擇線程終止。 2.exception:這個屬于應用程式級别的異常,這類異常必須捕捉。 exception是程式本身可以處理的異常,這種異常分兩大類運作時異常和非運時異常。

mysql檢視運作狀态

1、用指令行的show語句 直接在指令行下登入mysql,運作show status。 2、用mysql自帶的mysqladmin工具檢視status,使用以下指令:mysqladmin -uroot -p密碼 status

關于collection的方法

阿裡JAVA開發面試常問問題總結

collection接口方法圖

servlet的dopost、doget方法以及一些内置對象

serlvet接口隻定義了一個服務方法就是service,而httpservlet類實作了該方法并且要求調用下列的方法之一:

doget:處理get請求

dopost:處理post請求

當發出用戶端請求的時候,調用service 方法并傳遞一個請求和響應對象。servlet首先判斷該請求是get 操作還是post 操作。然後它調用下面的一個方法:doget 或 dopost。如果請求是get就調用doget方法,如果請求是post就調用dopost方法。doget和dopost都接受請求(httpservletrequest)和響應(httpservletresponse)。 doget 是接收網頁用get方法時調用的 dopost 是用來接收post方法的 get方法就像你在網頁的位址欄裡看到的一堆亂碼,也就是url後面有參數 post就是用表單傳過去的,就好象把資料都打成包發過去一樣

1.request對象:

用戶端的請求資訊被封裝在request對象中,通過它才能了解到客戶的需求,然後做出響應。它是httpservletrequest類的執行個體。

2.response對象:

response對象包含了響應客戶請求的有關資訊,但在jsp中很少直接用到它。它是httpservletresponse類的執行個體。

3.session對象:

session對象指的是用戶端與伺服器的一次會話,從用戶端連到伺服器的一個webapplication開始,直到用戶端與伺服器斷開連接配接為止。它是httpsession類的執行個體.

4.out對象:

out對象是jspwriter類的執行個體,是向用戶端輸出内容常用的對象

5.page對象:

page對象就是指向目前jsp頁面本身,有點像類中的this指針,它是java.lang.object類的執行個體

6.application對象:

application對象實作了使用者間資料的共享,可存放全局變量。它開始于伺服器的啟動,直到伺服器的關閉,在此期間,此對象将一直存在;這樣在使用者的前後連接配接或不同使用者之間的連接配接中,可以對此對象的同一屬性進行操作;在任何地方對此對象屬性的操作,都将影響到其他使用者對此的通路。伺服器的啟動和關閉決定了application對象的生命。它是servletcontext類的執行個體。

7.exception對象:

exception對象是一個例外對象,當一個頁面在運作過程中發生了例外,就産生這個對象。如果一個jsp頁面要應用此對象,就必須把iserrorpage設為true,否則無法編譯。他實際上是java.lang.throwable的對象

8.pagecontext對象:

pagecontext對象提供了對jsp頁面内所有的對象及名字空間的通路,也就是說他可以通路到本頁所在的session,也可以取本頁面所在的application的某一屬性值,他相當于頁面中所有功能的集大成者,它的本類名也叫pagecontext。

9.config對象:

config對象是在一個servlet初始化時,jsp引擎向它傳遞資訊用的,此資訊包括servlet初始化時所要用到的參數(通過屬性名和屬性值構成)以及伺服器的有關資訊(通過傳遞一個servletcontext對象)

1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加群。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間内進修、跳槽拿高薪的可以加群。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發架構掌握熟練的,可以加群。

4、覺得自己很牛b,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加群。

6.阿裡java進階大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶着大家全面、科學地建立自己的技術體系和技術認知!