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

業餘草發表於2017-08-15

我的部落格:CODE大全www.codedq.net業餘草www.xttblog.com愛分享www.ndislwf.comifxvn.com

執行緒與程式
程式是可併發執行的程式在某個資料集合上的一次計算活動,也是作業系統進行資源分配和排程的基本單位。
執行緒是作業系統程式中能夠併發執行的實體,是處理器排程和分派的基本單位。
每個程式內可包含多個可併發執行的執行緒。
執行緒自己基本不擁有系統資源,只擁有少量必不可少的資源:程式計數器、一組暫存器、棧。
同屬一個程式的執行緒共享程式所擁有的主存空間和資源。
在傳統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(預設的按字典升序):

Set keySet = map.keySet(); 
Collections.sort(keySet); 
for(Iterator ite = keySet.iterator(); ite.hasNext();) { 
String temp = ite.next(); 
System.out.println(“key-value: “+temp+”,”+map.getValue(temp); 
} 

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

Collections.sort(keySet, new Comparator() { 
public int compare(Object o1, Object o2) { 
if(Integer.parseInt(o1.toString())>Integer.parseInt(o2.toString()) 
return 1; 
if(Integer.parseInt(o1.toString())==Integer.parseInt(o2.toString()) 
return 0; 
else 
return -1; 
} 
}); 

二、按value值排序
1)方法一:用兩個list連結串列實現

List keyList = new LinkedList(); 
keyList.addAll(map.keySet()); 
List valueList = new LinkedList(); 
valueList.addAll(map.values()); 
for(int i=0; i

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()方法,取到了相關物件。
相應提交方式可以用get 和post,如:testAction? name=admin
5.使用request物件:
此方法與與傳統的JSP 等傳接引數一樣,即使用request. getParameter(“”)方法
Java異常,error和exception

異常分類圖
異常分類圖

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的方法


collection介面方法圖
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高階大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!

我的部落格:CODE大全www.codedq.net業餘草www.xttblog.com愛分享www.ndislwf.comifxvn.com

相關文章