更新時間:2019-09-22 09:00:00 來源:動力節點 瀏覽2599次
今天動力節點java培訓機構小編為大家分享“阿里巴巴java面試題級答案”,希望通過此文能夠幫助到大家,下面就隨小編一起來了解一下阿里巴巴java面試題級答案。
一、String,StringBuffer, StringBuilder 的區別是什么?String為什么是不可變的?
1、String是字符串常量,StringBuffer和StringBuilder都是字符串變量。后兩者的字符內容可變,而前者創建后內容不可變。
2、String不可變是因為在JDK中String類被聲明為一個final類。
3、StringBuffer是線程安全的,而StringBuilder是非線程安全的。
線程安全會帶來額外的系統開銷,所以StringBuilder的效率比StringBuffer高。如果對系統中的線程是否安全很掌握,可用StringBuffer,在線程不安全處加上關鍵字Synchronize。
二、Vector,ArrayList, LinkedList的區別是什么?
1、Vector、ArrayList都是以類似數組的形式存儲在內存中,LinkedList則以鏈表的形式進行存儲。
2、List中的元素有序、允許有重復的元素,Set中的元素無序、不允許有重復元素。
3、Vector線程同步,ArrayList、LinkedList線程不同步。
4、LinkedList適合指定位置插入、刪除操作,不適合查找;ArrayList、Vector適合查找,不適合指定位置的插入、刪除操作。
5、ArrayList在元素填滿容器時會自動擴充容器大小的50%,而Vector則是100%,因此ArrayList更節省空間。
三、HashTable, HashMap,TreeMap區別?
1、HashTable線程同步,HashMap非線程同步。
2、HashTable不允許<鍵,值>有空值,HashMap允許<鍵,值>有空值。
3、HashTable使用Enumeration,HashMap使用Iterator。
4、HashTable中hash數組的默認大小是11,增加方式的old*2+1,HashMap中hash數組的默認大小是16,增長方式一定是2的指數倍。
5、TreeMap能夠把它保存的記錄根據鍵排序,默認是按升序排序。
四、Tomcat,Apache,JBoss的區別?
1、Apache是Http服務器,Tomcat是web服務器,JBoss是應用服務器。
2、Apache解析靜態的html文件;Tomcat可解析jsp動態頁面、也可充當servlet容器。
五、Session, Cookie區別?
1、Session由應用服務器維護的一個服務器端的存儲空間;Cookie是客戶端的存儲空間,由瀏覽器維護。
2、用戶可以通過瀏覽器設置決定是否保存Cookie,而不能決定是否保存Session,因為Session是由服務器端維護的。
3、Session中保存的是對象,Cookie中保存的是字符串。
4、Session和Cookie不能跨窗口使用,每打開一個瀏覽器系統會賦予一個SessionID,此時的SessionID不同,若要完成跨瀏覽器訪問數據,可以使用 Application。
5、Session、Cookie都有失效時間,過期后會自動刪除,減少系統開銷。
六、Servlet的生命周期
大致分為4部:Servlet類加載-->實例化-->服務-->銷毀
下圖是Tomcat中Servlet時序圖。
1、Web Client向Servlet容器(Tomcat)發出Http請求。
2、Servlet容器接收Client端的請求。
3、Servlet容器創建一個HttpRequest對象,將Client的請求信息封裝到這個對象中。
4、Servlet創建一個HttpResponse對象。
5、Servlet調用HttpServlet對象的service方法,把HttpRequest對象和HttpResponse對象作為參數傳遞給HttpServlet對象中。
6、HttpServlet調用HttpRequest對象的方法,獲取Http請求,并進行相應處理。
7、處理完成HttpServlet調用HttpResponse對象的方法,返回響應數據。
8、Servlet容器把HttpServlet的響應結果傳回客戶端。
其中的3個方法說明了Servlet的生命周期:
1、init():負責初始化Servlet對象。
2、service():負責響應客戶端請求。
3、destroy():當Servlet對象推出時,負責釋放占用資源。
七、HTTP 報文包含內容
主要包含四部分:
1、request line
2、header line
3、blank line
4、request body
八、Statement與PreparedStatement的區別,什么是SQL注入,如何防止SQL注入
1、PreparedStatement支持動態設置參數,Statement不支持。
2、PreparedStatement可避免如類似 單引號 的編碼麻煩,Statement不可以。
3、PreparedStatement支持預編譯,Statement不支持。
4、在sql語句出錯時PreparedStatement不易檢查,而Statement則更便于查錯。
5、PreparedStatement可防止Sql助于,更加安全,而Statement不行。
什么是SQL注入: 通過sql語句的拼接達到無參數查詢數據庫數據目的的方法。
如將要執行的sql語句為 select * from table where name = "+appName+",利用appName參數值的輸入,來生成惡意的sql語句,如將['or'1'='1'] 傳入可在數據庫中執行。
因此可以采用PrepareStatement來避免Sql注入,在服務器端接收參數數據后,進行驗證,此時PrepareStatement會自動檢測,而Statement不行,需要手工檢測。
九、sendRedirect, foward區別
1、foward是服務器端控制頁面轉向,在客戶端的瀏覽器地址中不會顯示轉向后的地址;sendRedirect則是完全的跳轉,瀏覽器中會顯示跳轉的地址并重新發送請求鏈接。
原理:forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后再將這些內容返回給瀏覽器,瀏覽器根本不知道服務器發送的這些內容是從哪來的,所以地址欄還是原來的地址。
redirect是服務器端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求的那個地址,瀏覽器會用剛才的所有參數重新發送新的請求。
十、關于JAVA內存模型,一個對象(兩個屬性,四個方法)實例化100次,現在內存中的存儲狀態,幾個對象,幾個屬性,幾個方法。
由于JAVA中new出來的對象都是放在堆中,所以如果要實例化100次,將在堆中產生100個對象,一般對象與其中的屬性、方法都屬于一個整體,但如果 屬性和方法是靜態的,就是用static關鍵字聲明的,那么屬于類的屬性和方法永遠只在內存中存在一份。
十一、談談Hibernate的理解,一級和二級緩存的作用,在項目中Hibernate都是怎么使用緩存的。
Hibernate是一個開發的對象關系映射框架(ORM)。它對JDBC進行了非常對象封裝,Hibernate允許程序員采用面向對象的方式來操作關系數據庫。
Hibernate的優點:
1、程序更加面向對象
2、提高了生產率
3、方便移植
4、無入侵性。
缺點:
1、效率比JDBC略差
2、不適合批量操作
3、只能配置一種關聯關系
Hibernate有四種查詢方式:
1、get、load方法,根據id號查詢對象。
2、Hibernate query language
3、標準查詢語言
4、通過sql查詢
Hibernage工作原理:
1、配置hibernate對象關系映射文件、啟動服務器
2、服務器通過實例化Configuration對象,讀取hibernate.cfg.xml文件的配置內容,并根據相關的需求建好表以及表之間的映射關系。
3、通過實例化的Configuration對象建立SeesionFactory實例,通過SessionFactory實例創建Session對象。
4、通過Seesion對象完成數據庫的增刪改查操作。
Hibernate中的狀態轉移
臨時狀態(transient)
1、不處于session緩存中
2、數據庫中沒有對象記錄
java是如何進入臨時狀態的:
1、通過new語句創建一個對象時。
2、剛調用session的delete方法時,從seesion緩存中刪除一個對象時。
持久化狀態(persisted)
1、處于session緩存中
2、持久化對象數據庫中沒有對象記錄
3、seesion在特定的時刻會保存兩者同步
java如何進入持久化狀態:
1、seesion的save()方法。
2、seesion的load().get()方法返回的對象。
3、seesion的find()方法返回的list集合中存放的對象。
4、Session的update().save()方法。
流離狀態(detached)
1、不再位于session緩存中
2、游離對象由持久化狀態轉變而來,數據庫中還沒有相應記錄。
java如何進入流離狀態:Session的close()。Session的evict()方法,從緩存中刪除一個對象。
具體如下圖所示:
Hibernate中的緩存主要有Session緩存(一級緩存)和SessionFactory緩存(二級緩存,一般由第三方提供)。
十二、反射講一講,主要是概念,都在哪需要反射機制,反射的性能,如何優化
反射機制的定義:
是在運行狀態中,對于任意的一個類,都能夠知道這個類的所有屬性和方法,對任意一個對象都能夠通過反射機制調用一個類的任意方法,這種動態獲取類信息及動態調用類對象方法的功能稱為java的反射機制。
反射的作用:
1、動態地創建類的實例,將類綁定到現有的對象中,或從現有的對象中獲取類型。
2、應用程序需要在運行時從某個特定的程序集中載入一個特定的類
十三、談談Hibernate與Ibatis的區別,哪個性能會更高一些
1、Hibernate偏向于對象的操作達到數據庫相關操作的目的;而ibatis更偏向于sql語句的優化。
2、Hibernate的使用的查詢語句是自己的hql,而ibatis則是標準的sql語句。
3、Hibernate相對復雜,不易學習;ibatis類似sql語句,簡單易學。
性能方面:
1、如果系統數據處理量巨大,性能要求極為苛刻時,往往需要人工編寫高性能的sql語句或存錯過程,此時ibatis具有更好的可控性,因此性能優于Hibernate。
2、同樣的需求下,由于hibernate可以自動生成hql語句,而ibatis需要手動寫sql語句,此時采用Hibernate的效率高于ibatis。
十四、對Spring的理解,項目中都用什么?怎么用的?對IOC、和AOP的理解及實現原理
Spring是一個開源框架,處于MVC模式中的控制層,它能應對需求快速的變化,其主要原因它有一種面向切面編程(AOP)的優勢,其次它提升了系統性能,因為通過依賴倒置機制(IOC),系統中用到的對象不是在系統加載時就全部實例化,而是在調用到這個類時才會實例化該類的對象,從而提升了系統性能。這兩個優秀的性能使得Spring受到許多J2EE公司的青睞,如阿里里中使用最多的也是Spring相關技術。
Spring的優點:
1、降低了組件之間的耦合性,實現了軟件各層之間的解耦。
2、可以使用容易提供的眾多服務,如事務管理,消息服務,日志記錄等。
3、容器提供了AOP技術,利用它很容易實現如權限攔截、運行期監控等功能。
Spring中AOP技術是設計模式中的動態代理模式。只需實現jdk提供的動態代理接口InvocationHandler,所有被代理對象的方法都由InvocationHandler接管實際的處理任務。面向切面編程中還要理解切入點、切面、通知、織入等概念。
Spring中IOC則利用了Java強大的反射機制來實現。所謂依賴注入即組件之間的依賴關系由容器在運行期決定。其中依賴注入的方法有兩種,通過構造函數注入,通過set方法進行注入。
十五、線程同步,并發操作怎么控制
Java中可在方法名前加關鍵字syschronized來處理當有多個線程同時訪問共享資源時候的問題。syschronized相當于一把鎖,當有申請者申請該
資源時,如果該資源沒有被占用,那么將資源交付給這個申請者使用,在此期間,其他申請者只能申請而不能使用該資源,當該資源被使用完成后將釋放該資源上的鎖,其他申請者可申請使用。
并發控制主要是為了多線程操作時帶來的資源讀寫問題。如果不加以空間可能會出現死鎖,讀臟數據、不可重復讀、丟失更新等異常。
并發操作可以通過加鎖的方式進行控制,鎖又可分為樂觀鎖和悲觀鎖。
悲觀鎖:
悲觀鎖并發模式假定系統中存在足夠多的數據修改操作,以致于任何確定的讀操作都可能會受到由個別的用戶所制造的數據修改的影響。也就是說悲觀鎖假定沖突總會發生,通過獨占正在被讀取的數據來避免沖突。但是獨占數據會導致其他進程無法修改該數據,進而產生阻塞,讀數據和寫數據會相互阻塞。
樂觀鎖:
樂觀鎖假定系統的數據修改只會產生非常少的沖突,也就是說任何進程都不大可能修改別的進程正在訪問的數據。樂觀并發模式下,讀數據和寫數據之間不會發生沖突,只有寫數據與寫數據之間會發生沖突。即讀數據不會產生阻塞,只有寫數據才會產生阻塞。
十六、描述struts的工作流程
1、在web應用啟動時,加載并初始化ActionServlet,ActionServlet從struts-config.xml文件中讀取配置信息,將它們存放到各個配置對象中。
2、當ActionServlet接收到一個客戶請求時,首先檢索和用戶請求相匹配的ActionMapping實例,如果不存在,就返回用戶請求路徑無效信息。
3、如果ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中。
4、根據配置信息決定是否需要驗證表單,如果需要,就調用ActionForm的validate()方法,如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActionErrors對象,就表示表單驗證成功。
5、ActionServlet根據ActionMapping實例包含的映射信息決定請求轉發給哪個Action,如果相應的Action實例不存在,就先創建一個實例,然后調用Action的execute()方法。
6、Action的execute()方法返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指向的JSP組件。
7、ActionForward對象指向的JSP組件生成動態網頁,返回給客戶。
以上就是動力節點java培訓機構小編為大家分享的“阿里巴巴java面試題級答案”的內容,希望對大家有幫助,更多java面試題請繼續關注動力節點java培訓機構官網,每天會有精彩內容分享與你。
相關java面試題推薦
2019最全最新java面試題及答案:http://www.dabaquan.cn/tutorial_baseinterviewquestions/
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習