java工程師個人簡歷自我評價_JAVA軟件工程師面試簡歷的自我評價(3)
java工程師個人簡歷自我評價_JAVA軟件工程師面試簡歷的自我評價
更多熱門的Java工程師面 試簡歷、筆試題、薪資待遇
☟歡迎賞析☟
j☞java工
j☞Java工
Java工程師面試題及答案
一、String,StringBuffer, StringBuilder 的區(qū)別是什么?String為什么是不可變的?
1. String是字符串常量,StringBuffer和StringBuilder是字符串變量。StringBuffer是線程安全的,StringBuilder是非線程安全的。具體來說String是一個不可變的對象,每次修改String對象實際上是創(chuàng)新新對象,并將引用指向新對象。效率很低。StringBuffer
是可變的,即每次修改只是針對其本身,大部分情況下比String效率高,StringBuffer保證同步(synchronized),所以線程安全。StringBuilder沒有實現(xiàn)同步,所以非線程安全。但效率應該比StringBuffer高。StringBuffer使用時最好指定容量,這樣會比不指定容量快30%-40%,甚至比不指定容量的StringBuilder還快。
二、VECTOR,ARRAYLIST, LINKEDLIST的區(qū)別是什么?
vector是同步的,arraylist和linkedlist不是同步的。底層方面,vector與arraylist都是基于object[]array實現(xiàn)的,但考慮vector線程安全,所以arraylist效率上回比vector較快。元素隨機訪問上,vector與arraylist是基本相同的,時間復雜度是O(1),linkedlist的隨機訪問元素的復雜度為O(n)。但在插入刪除數(shù)據(jù)上,linkedlist則比arraylist要快很多。linkedlist比arraylist更占內(nèi)存,因為linkedlist每個節(jié)點上還要存儲對前后兩個節(jié)點的引用。
三、HASHTABLE, HASHMAP,TreeMap區(qū)別
Hashmap和HashTable都實現(xiàn)了Map接口,但HashTable是線程安全的,HashMap是非線程安全的。HashMap中允許key-value值均為null,但HashTable則不允許。HashMap適合單線程,HashTable適合多線程。HashTAble中的hash數(shù)字默認大小是11,增加方式為old*2+1,HashMap中的hash默認大小為16,且均為2的指數(shù)。TreeMap則可以將保持的數(shù)據(jù)根據(jù)key值進行排列,可以按照指定的排序方式。默認為升序。
四、ConcurrentHashMap和HashTable的區(qū)別
兩者均應用于多線程中,但當HashTable增大到一定程度時,其性能會急劇下降。因為迭代時會被鎖很長時間。但ConcurrentHashMap則通過引入分割來保證鎖的個數(shù)不會很大。簡而言之就是HashTable會鎖住真?zhèn)€map,而ConcurrentHashMap則只需要鎖住map的一個部分。
五、Tomcat,apache,jboss的區(qū)別
Tomcat是servlet容器,用于解析jsp,servlet。是一個輕量級的高效的容器;缺點是不支持EJB,只能用于Java應用。
Apache是http服務器(web服務器),類似于IIS可以用來建立虛擬站點,編譯處理靜態(tài)頁面。支持SSL技術,支持多個虛擬主機等功能。
Jboss是應用服務器,運行EJB的javaee應用服務器,遵循javaee規(guī)范,能夠提供更多平臺的支持和更多集成功能,如數(shù)據(jù)庫連接,JCA等。其對servlet的支持是通過集成其他servlet容器來實現(xiàn)的。如tomcat。
六、GET POST區(qū)別
get是從服務器上獲取數(shù)據(jù),post是向服務器發(fā)送數(shù)據(jù)。
get是把參數(shù)數(shù)據(jù)隊列加到提交表單的action屬性所指的URL中,值和表單內(nèi)各個字段一一對應,在url中可以看到。post是通過HTTPpost機制,將表單內(nèi)各個字段與其內(nèi)容放置在html header內(nèi)一起傳送到action屬性所指的url地址。
對于get方式,服務區(qū)端用request.QueryString獲取變量值,對于post方式,服務器端用request.Form獲取提交的數(shù)據(jù)。get傳送的數(shù)據(jù)量較小,post較大,一般不受限制。get安全性比post要低,但執(zhí)行效率較高。
七、SESSION, COOKIE區(qū)別
session數(shù)據(jù)放在服務器上,cookie則放在客戶瀏覽器上。cookie不太安全,因為可以分析出本地cookie,并進行cookie欺騙,考慮安全應使用session。session會在一定時間內(nèi)保存在服務器上,當訪問增多時,會比較占用服務器的性能,考慮減輕服務器壓力則應該使用cookie。單個cookie保持的數(shù)據(jù)不超過4k,很多瀏覽器都限制要給站點最多保存20個cookie。
八、Servlet的生命周期
主要分三個階段:初始化——調(diào)用init()方法,響應客戶請求階段——調(diào)用service()方法,終止階段——調(diào)用destroy方法。工作原理:客戶發(fā)送一個請求,servlet調(diào)用service方法對請求進行響應,即對請求方式進行匹配,選擇調(diào)用doGet、doPost方法等,然后進入對于的方法中調(diào)用邏輯層的方法,實現(xiàn)對客戶的響應。自定義的servlet必須首先servlet接口。
具體生命周期包括:裝載Servlet、服務器創(chuàng)建Servlet實例、服務器調(diào)用Servlet的init()方法、客戶請求到達服務器、服務器創(chuàng)建請求對象、服務創(chuàng)建相應對象、服務器激活Servlet的service方法,請求對象和響應對象作為service()方法的參數(shù)、service()方法獲得關于請求對象的信息,處理請求,訪問其他資源,獲得需要的信息、service()方法可能激活其他方法以處理請求,如doGet(),doPost()
九、HTTP 報文包含內(nèi)容
請求方法包括GET,POST,HEAD,PUT,TRACE,OPTIONS,DELETE。請求頭如:Host、User-Agent、Connection、Accept-Charset等。請求頭部的最后會有一個空行,表示請求頭部結束,接下來為請求正文,這一行非常重要,必不可少。請求正文為可選部分,如get就沒有。
十、Statement與PreparedStatement的區(qū)別,什么是SQL注入,如何防止SQL注入
使用PreparedStatement可以提升代碼的可讀性和可維護性,可以盡最大可能提高性能。因為Statement每次執(zhí)行一個SQL命令都會對其編譯,但PreparedStatement則只編譯一次。PreparedStatement就類似于流水線生產(chǎn)。另一方面PreparedStatement可以極大提高安全性:它對傳遞過來的參數(shù)進行了強制參數(shù)類型轉(zhuǎn)換,確保插入或查詢數(shù)據(jù)時,與底層數(shù)據(jù)庫格式匹配。
SQL注入:就是通過將sql命令插入到web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執(zhí)行惡意SQL命令。如sql命令:select id from test where name='1' or 1=1; drop table test,但用PreparedStatement就可以避免這種問題。
十一、redirect, forward區(qū)別
redirect:服務器根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址。所以地址欄顯示是新的url。forward是指服務器請求資源,直接訪問目標地址url,把響應的內(nèi)容讀取過來并再發(fā)送給瀏覽器,瀏覽器并不知道資源從哪里來,所以地址欄不變。
redirect不能共享數(shù)據(jù),forward轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到頁面可以貢獻request中的數(shù)據(jù)。redirect用于注銷,forward用于登陸。forward效率高于redirect。
十二、關于JAVA內(nèi)存模型,一個對象(兩個屬性,四個方法)實例化100次,現(xiàn)在內(nèi)存中的存儲狀態(tài),幾個對象,幾個屬性,幾個方法。
Java新建的對象都放在堆里,如果實例化100次,堆中產(chǎn)生100個對象,一般對象與其屬性和方法屬于一個整體,但如果屬性和方法是靜態(tài)的,則屬性和方法只在內(nèi)存中存一份。
十三、談談Hibernate的理解,一級和二級緩存的作用,在項目中Hibernate都是怎么使用緩存的
一級緩存為session基本的緩存,是內(nèi)置的不能卸載。一個Session做了一個查詢操作,它會把這個結果放在一級緩存中,如果短時間內(nèi)這個session又做了同一個操作,那么hibernate就直接從一級緩存中獲取數(shù)據(jù)。
二級緩存是SessionFactory的緩存,分為內(nèi)置緩存和外置緩存兩類。即查詢結果放在二級緩存中,如果同一個sessionFactory創(chuàng)建的某個session執(zhí)行了相同的操作,hibernate就會從二級緩存中獲取結果。適合放在二級緩存中的數(shù)據(jù)包括:很少被修改的數(shù)據(jù),不是很重要的數(shù)據(jù),允許出現(xiàn)偶偶并發(fā)的數(shù)據(jù),不會被并發(fā)訪問的數(shù)據(jù),參考數(shù)據(jù)。不適合放在二級緩存中的數(shù)據(jù):經(jīng)常被修改的數(shù)據(jù),財務數(shù)據(jù),絕對不允許出現(xiàn)并發(fā),與其他應用共享的數(shù)據(jù)。
十四、反射講一講,主要是概念,都在哪需要反射機制,反射的性能,如何優(yōu)化
能夠分析類能力的程序稱為反射。反射機制可以用來:在運行中分析類的能力,在運行中查看對象,如編寫一個toString方法供所有類使用。實現(xiàn)通用的數(shù)據(jù)操作代碼。利用Method對象,這個對象很像C++的指針。
反射性能優(yōu)化方法主要為設置不用做安全檢查。
十五、談談Hibernate與Ibatis的區(qū)別,哪個性能會更高一些
Ibatis相當較為簡單,容易上手,Hibernate比較復雜,門檻較高。如果系統(tǒng)需要處理數(shù)據(jù)量很大,性能要求很高,需要執(zhí)行高度優(yōu)化的sql語句才能達到性能要求,則此時Ibatis會比較好。
對不同數(shù)據(jù)庫支持方面Hibernate較好,因為Ibatis需要修改的字段較多。另外Hibernate現(xiàn)已成為主流的o/r Mapping框架,開發(fā)效率高。
十六、對Spring的理解,項目中都用什么?怎么用的?對IOC、和AOP的理解及實現(xiàn)原理
十七、線程同步,并發(fā)操作怎么控制
線程同步不一定就是同時,而是協(xié)同步驟,或協(xié)同步調(diào)。線程同步就是多個線程在邏輯上互有因果關系,所以要對其執(zhí)行順序進行協(xié)調(diào)。
線程并發(fā)是指同一時間間隔內(nèi),多個線程同時執(zhí)行。如果線程在時間上能夠區(qū)分,那么就可以上線程休眠指定的時間來進行同步,可用sleep()方法完成。如果線程在時間上不能區(qū)分,但在邏輯順序上可以區(qū)分的話,那么可用jion()方法來完成,一個先執(zhí)行完,然后執(zhí)行另一個。如果線程設計較為復雜,那么就只有通過wait(),notify()方法來完成了
十八、描述struts的工作流程。
簡略過程就是web應用啟動,接收用戶請求并進行匹配,返回用戶請求信息。
1. 在web應用啟動時,加載并初始化ActionServlet,ActionServlet從struct-config.xml文件中讀取配置信息,把它們存放到各個配置對象中。
2. 當ActionServlet接收到一個客戶請求時,首先檢索和用戶請求相配的ActionMapping實例,如果不存在,返回用戶請求路徑無效信息。
3. 如ActionForm實例不存在,則創(chuàng)建一個ActionForm對象,把客戶提交的表單數(shù)據(jù)保存到ActionForm對象中。
4. 根據(jù)配置信息決定是否需要表單驗證。如果需要驗證,就調(diào)用ActionForm的Validate()方法。如果Valiedate()方法返回null或返回一個不包含ActionMessage的ActionErrors對象,則表示表單驗證成功。
5. ActionServlet更加ActionMapping實例包含的映射信息決定請請求轉(zhuǎn)發(fā)給哪個Action。如果相應的Action實例不存在,則先創(chuàng)建這個實例,然后調(diào)用Action的execute()方法。
6. Action的execute()方法返回一個ActionForward對象,ActionServlet再把客戶請求轉(zhuǎn)發(fā)給ActionForward對象指向的JSP組建。
7. ActionForward對象指向的jsp組件生成的動態(tài)網(wǎng)頁,返回給客戶。
十九、Tomcat的session處理,如果讓你實現(xiàn)一個tomcatserver,如何實現(xiàn)session機制
當一個session開始時,Servlet容器會創(chuàng)建一個HttpSession對象,在某些情況下把這些HttpSession對象從內(nèi)存中轉(zhuǎn)移到文件系統(tǒng)中或數(shù)據(jù)庫中。需要訪問的時候?qū)⑺鼈冚d入到內(nèi)存中。這樣的好處就是節(jié)省內(nèi)存,當web服務器產(chǎn)生故障時,還可以從文件系統(tǒng)或數(shù)據(jù)庫中恢復Session的數(shù)據(jù)。管理session有兩個類:1)StandardManager,這是一個默認的類,當tomcat啟動或重載時將會session對象保存到指定文件中。2)PersistentManager,管理方式更加靈活,具有容錯能力,可以及時把Session備份到Session Store中,可以控制內(nèi)存中Session的數(shù)量。
二十、關于Cache(Ehcache,Memcached)
Memcache:分布式內(nèi)存對象緩存系統(tǒng),占用其他機子的內(nèi)存。很多互聯(lián)網(wǎng),負載均衡三臺(以三臺為例)web服務器可以共享一臺Memcache的資源。傳遞的信息以鍵值對的形式存儲。傳遞的數(shù)據(jù)要實現(xiàn)序列化。
Oscache:頁面級緩存(網(wǎng)上強調(diào)最多的東西),占用本機的內(nèi)存資源???以選擇緩存到硬盤,如存取到硬盤重啟服務也可重新獲得上次持久化的資源,而如果緩存到內(nèi)存就不行。一般沒必要緩存到硬盤,因為I/O操作也是比較耗資源,和從數(shù)據(jù)庫取往往優(yōu)勢很小。Oscache存取數(shù)據(jù)的作用域分為application和session兩種。
EhCache:Hibernate緩存,DAO緩存,安全性憑證緩存(Acegi),Web緩存,應用持久化和分布式緩存。EhCache在默認情況下,即在用戶未提供自身配置文件ehcache.xml或ehcache-failsafe.xml時,EhCache會依據(jù)其自身Jar存檔包含的ehcache-failsafe.xml文件所定制的策略來管理緩存。如果用戶在classpath下提供了ehcache.xml或ehcache-failsafe.xml文件,那么EhCache將會應用這個文件。如果兩個文件同時提供,那么EhCache會使用ehcache.xml文件的配置。
二一、sql的優(yōu)化相關問題
1. 對查詢優(yōu)化,避免全表掃描
2. 盡量避免where子句中對段進行null值判斷,否則將導致引擎放棄使用索引而進行全表掃描。
3. 盡量避免where子句中出現(xiàn)!=或<>,否則將導致引擎放棄使用索引而進行全表掃描。
4. 盡量避免where子句中出現(xiàn)or來連接條件。
5. 慎用in和not in,否則導致全表掃描
6. where中不要用函數(shù)操作。
7. Update 語句,如果只更改1、2個字段,不要Update全部字段,否則頻繁調(diào)用會引起明顯的性能消耗,同時帶來大量日志。
8. 對于多張大數(shù)據(jù)量(這里幾百條就算大了)的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差。
9. 盡可能的使用 varchar/nvarchar 代替 char/nchar,節(jié)省空間,提高查詢效率
10. select count(*) from table;這樣不帶任何條件的count會引起全表掃描,并且沒有任何業(yè)務意義,是一定要杜絕的。
二二、oracle中 rownum與rowid的理解,一千條記錄我查200到300的記錄怎么查?
二三、如何分析ORACLE的執(zhí)行計劃?
二四、 DB中索引原理,種類,使用索引的好處和問題是什么?
原理:因為檢索磁盤比對數(shù)據(jù),需要大量的時間和IO,所以就需要構造某列的數(shù)據(jù)的btree、hash值、位圖索引。一般的索引能快速的查找比對,而索引的值記錄了磁盤的位置,直接讀取數(shù)據(jù)庫字段對應位置的內(nèi)容。
索引好處:加快數(shù)據(jù)檢索速度、加速表與表之間的連接特別是實現(xiàn)數(shù)據(jù)的參考完整性方面有特別的意義、減少查詢中分組和排序的時間,使用優(yōu)化隱藏器,提高系統(tǒng)性能。
缺點:創(chuàng)建和維護索引需要時間,索引需要占用物理空間,當對表中的數(shù)據(jù)驚醒增刪改時所有也需要動態(tài)維護。
二五、JVM垃圾回收實現(xiàn)原理。垃圾回收的線程優(yōu)先級。
JVM的堆空間中主要分為年輕代、年老代和永久代。年輕代和年老代是存儲動態(tài)產(chǎn)生的對象。永久代主要是存儲java類信息,包括解析得到的方法屬性、字段等等。永久代基本不參與垃圾回收。年輕代分為一個eden區(qū)和兩個相同的survior區(qū)。剛開始創(chuàng)建的對象都放置在eden區(qū)。這樣主要是為了將生命周期短的對象盡量留在年輕代中。當eden區(qū)申請不到空間時,進行minorGC,把存活的對象拷貝到survior。年老代主要存放生命周期比較長的對象,如緩存對象。具體JVM垃圾回收過程如下:
1、對象在Eden區(qū)完成內(nèi)存分配。2、當Eden區(qū)滿了,在創(chuàng)建對象就會申請不到空間,則觸發(fā)minorGC,進行young(eden區(qū)和1survivor區(qū)的垃圾回收)。3、在minorGC時,Eden不能被回收的對象唄放入到空的survior(即Eden肯定被清空),另一個survivor里不能被GC回收的地想也會被放入到這個survivor,始終保證一個survivor是空的。4、當完成第三步的時候、如果發(fā)現(xiàn)survivor滿了,則這些對象唄copy到old區(qū),或者survivor并沒有滿,但有些對象已經(jīng)足夠old了,也被放入到old區(qū)。當old區(qū)北放滿之后,進行fullGC。
二六、jvm 最大內(nèi)存設置。設置的原理。結合垃圾回收講講。
JVM內(nèi)存可以分為堆內(nèi)存和非堆內(nèi)存,堆內(nèi)存給開發(fā)人員用的,非堆內(nèi)存給JVM本身用的,用來存放類型信息,即使GC時也不會釋放空間。
堆內(nèi)存設置:
-Xms 初始堆內(nèi)存,默認物理內(nèi)存1/64,也是最小分配堆內(nèi)存,當空余堆內(nèi)存小于40%時,會增加到-Xms的最大限制。
-Xmx 最大堆內(nèi)存分配,默認物理內(nèi)存1/4,當空余堆內(nèi)存大于70%時,會減小打-Xms的最小限制。
非堆內(nèi)存設置:
-XX:PermSize 非堆內(nèi)存的初始值,默認物理內(nèi)存的1/64,也是最小非堆內(nèi)存。
-XX:MaxPermSize 非堆內(nèi)存最大值,默認物理內(nèi)存的1/4。
查看堆大小命令為Runtime.getRuntime().maxMemory()。
二七、jvm怎樣通過參數(shù)調(diào)整內(nèi)存大小
本地環(huán)境變量中JVM參數(shù)設置:
new一個JAVA_OPTS:
variable name: JAVA_OPTS
variable value: -Xms256M -Xmx512M -XX:PermSize=256M -XX:MaxPermSize=512M
eclipse中參數(shù)設置:在缺省VM參數(shù)中輸入:-Xmx128m -Xms64m -Xmn32m -Xss16m
>>>下一頁更多精彩“java工程師待遇前景”