一、Java基礎(chǔ)
1.String類為什么是final的。
https://www.cnblogs.com/ikuman/archive/2013/08/27/3284410.html
主要是為了“效率”?和?“安全性”?的緣故。若?String允許被繼承,?由于它的高度被使用率,?可能會降低程序的性能,所以String被定義成final。
2.HashMap的源碼,實現(xiàn)原理,底層結(jié)構(gòu)。
http://blog.csdn.net/tuke_tuke/article/details/51588156
首先有一個每個元素都是鏈表(可能表述不準確)的數(shù)組,當添加一個元素(key-value)時,就首先計算元素key的hash值,以此確定插入數(shù)組中的位置,但是可能存在同一hash值的元素已經(jīng)被放在數(shù)組同一位置了,這時就添加到同一hash值的元素的后面,他們在數(shù)組的同一位置,但是形成了鏈表,同一各鏈表上的Hash值是相同的,所以說數(shù)組存放的是鏈表。而當鏈表長度太長時,鏈表就轉(zhuǎn)換為紅黑樹,這樣大大提高了查找的效率。
3.反射中,Class.forName和classloader的區(qū)別
java中class.forName()和classLoader都可用來對類進行加載。
class.forName()前者除了將類的.class文件加載到j(luò)vm中之外,還會對類進行解釋,執(zhí)行類中的static塊。
而classLoader只干一件事情,就是將.class文件加載到j(luò)vm中,不會執(zhí)行static中的內(nèi)容,只有在newInstance才會去執(zhí)行static塊。
4.session和cookie的區(qū)別和聯(lián)系,session的生命周期,多個服務部署時session管理。
5.Java中的隊列都有哪些,有什么區(qū)別。
6.Java的內(nèi)存模型以及GC算法
7.Java7、Java8的新特性(baidu問的,好BT)
8.Java數(shù)組和鏈表兩種結(jié)構(gòu)的操作效率,在哪些情況下(從開頭開始,從結(jié)尾開始,從中間開始),哪些操作(插入,查找,刪除)的效率高
9.Java內(nèi)存泄露的問題調(diào)查定位:jmap,jstack的使用等等
如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java?stack和native?stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發(fā)生問題。另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java?stack和native?stack的信息,?如果現(xiàn)在運行的java程序呈現(xiàn)hung的狀態(tài),jstack是非常有用的。
10. string、stringbuilder、stringbuffer區(qū)別
11. hashtable和hashmap的區(qū)別
13 .異常的結(jié)構(gòu),運行時異常和非運行時異常,各舉個例子
http://blog.csdn.net/qq_27093465/article/details/52268531
14. String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他們之間用 == 比較的結(jié)果
15. String 類的常用方法
16. Java?的引用類型有哪幾種
17.?抽象類和接口的區(qū)別
18. java的基礎(chǔ)類型和字節(jié)大小。
19. Hashtable,HashMap,ConcurrentHashMap?底層實現(xiàn)原理與線程安全問題(建議熟悉?jdk?源碼,才能從容應答)
20. 如果不讓你用Java?Jdk提供的工具,你自己實現(xiàn)一個Map,你怎么做。說了好久,說了HashMap源代碼,如果我做,就會借鑒HashMap的原理,說了一通HashMap實現(xiàn)
21. Hash沖突怎么辦?哪些解決散列沖突的方法?
1.開放定址法(線性探測再散列,二次探測再散列,偽隨機探測再散列)
2.再哈希法
3.鏈地址法(Java hashmap就是這么做的)
22. HashMap沖突很厲害,最差性能,你會怎么解決?從O(n)提升到log(n)咯,用二叉排序樹的思路說了一通
二叉樹--http://www.jb51.net/article/77278.htm
二、Java IO
1. 講講IO里面的常見類,字節(jié)流、字符流、接口、實現(xiàn)類、方法阻塞。
輸入流就是從外部文件輸入到內(nèi)存,輸出流主要是從內(nèi)存輸出到文件。我們用Eclipse開發(fā)小程序在控制臺輸入數(shù)據(jù)就屬于輸入流,即從控制臺輸入到內(nèi)存。
IO里面常見的類,第一印象就只知道IO流中有很多類,IO流主要分為字符流和字節(jié)流。字符流中有抽象類InputStream和OutputStream,它們的子類FileInputStream,F(xiàn)ileOutputStream,BufferedOutputStream等。字符流BufferedReader和Writer等。都實現(xiàn)了Closeable, Flushable, Appendable這些接口。程序中的輸入輸出都是以流的形式保存的,流中保存的實際上全都是字節(jié)文件。
Java中的阻塞式方法是指在程序調(diào)用改方法時,必須等待輸入數(shù)據(jù)可用或者檢測到輸入結(jié)束或者拋出異常,否則程序會一直停留在該語句上,不會執(zhí)行下面的語句。比如read()和readLine()方法。
2. 講講NIO。--http://www.importnew.com/22623.html
3. String?編碼UTF-8?和GBK的區(qū)別?
答:UTF-8是國際通用的編碼,通用性比較好,GBK是國家編碼,支持中文,但是相比UTF-8的通用性差,不過UTF-8占用的數(shù)據(jù)庫比較大,所以相對反應速度要慢。
4. 什么時候使用字節(jié)流、什么時候使用字符流?
字符流處理的單元為2個字節(jié)的Unicode字符,操作字符、字符數(shù)組或字符串,
字節(jié)流處理單元為1個字節(jié),操作字節(jié)和字節(jié)數(shù)組。
所以字符流是由Java虛擬機將字節(jié)轉(zhuǎn)化為2個字節(jié)的Unicode字符為單位的字符而成的,
所以它對多國語言支持性比較好!
如果是音頻文件、圖片、歌曲,就用字節(jié)流好點,
如果是關(guān)系到中文(文本)的,用字符流好點
5.?遞歸讀取文件夾下的文件,代碼怎么實現(xiàn)
三、Java Web
1. session和cookie的區(qū)別和聯(lián)系,session的生命周期,多個服務部署時session管理。--http://blog.csdn.net/u012635819/article/details/50678602
2. servlet的一些相關(guān)問題--http://blog.csdn.net/chdjj/article/details/18882973
3. webservice相關(guān)問題
任何問題都需要從它的根源說起,所以簡單說一下WebService的工作原理??蛻舳苏{(diào)用一個WebService的方法,首先需要將方法名和需要傳遞的參數(shù)包裝成XML(也就是SOAP包),通常是通過HTTP傳遞到服務器端,然后服務器端解析這段XML,得到被調(diào)用方法名稱和傳遞來的參數(shù),進而調(diào)用WebService實例的相應方法。方法執(zhí)行完成之后,將返回的結(jié)果再包裝成XML(SOAP響應)發(fā)送到客戶端,客戶端解析這段XML,進而得到返回結(jié)果。這里關(guān)鍵的地方在于中間加入了對象和XML相互轉(zhuǎn)換的過程。
4. jdbc連接,forname方式的步驟,怎么聲明使用一個事務。舉例并具體代碼
1) 原子性(atomicity):事務是數(shù)據(jù)庫的邏輯工作單位,而且是必須是原子工作單位,對于其數(shù)據(jù)修改,要么全部執(zhí)行,要么全部不執(zhí)行。
2) 一致性(consistency):事務在完成時,必須是所有的數(shù)據(jù)都保持一致狀態(tài)。在相關(guān)數(shù)據(jù)庫中,所有規(guī)則都必須應用于事務的修改,以保持所有數(shù)據(jù)的完整性。
3) 隔離性(isolation):一個事務的執(zhí)行不能被其他事務所影響。
4) 持久性(durability):一個事務一旦提交,事物的操作便永久性的保存在DB中。即使此時再執(zhí)行回滾操作也不能撤消所做的更改。
5. 無框架下配置web.xml的主要配置內(nèi)容
6. jsp和servlet的區(qū)別
所以JSP在本質(zhì)上就是Servlet,但是兩者的創(chuàng)建方式不一樣。Servlet都是由JAVA程序代碼構(gòu)成,用于流程控制和事務處理,通過Servlet來生成動態(tài)網(wǎng)頁很不直觀。而JSP由HTML代碼和JSP標簽構(gòu)成,可以方便地編寫動態(tài)網(wǎng)頁.
另外總結(jié)一下,JSP與Servlet主要有兩方面的不同:編譯:JSP修改后可以立即看到結(jié)果,不需要編譯;而Servelt缺需要編譯。轉(zhuǎn)換:JSP是動態(tài)網(wǎng)頁開發(fā)技術(shù),是運行在服務器端的腳本語言,而Servlet是web服務器端編程技術(shù)。所以JSP運行時就是轉(zhuǎn)換為Servlet,也就是java程序來執(zhí)行
1、抽象類與接口的區(qū)別。
--第一點.?接口是抽象類的變體,接口中所有的方法都是抽象的。而抽象類是聲明方法的存在而不去實現(xiàn)它的類。
第二點.?接口可以多繼承,抽象類不行
第三點.?接口定義方法,不能實現(xiàn),而抽象類可以實現(xiàn)部分方法。
第四點.?接口中基本數(shù)據(jù)類型為static 而抽類象不是的。
2、final關(guān)鍵字的使用和區(qū)別。
對于基本類型,final使數(shù)值恒定不變;而對用對象引用,final使引用恒定不變。?
final修飾的基本類型,一旦被初始化后,不能再被賦值。?
當用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類你永遠不會讓他被繼承,就可以用final進行修飾。?
異常分類和處理機制。--http://blog.csdn.net/hguisu/article/details/6155636
JDK版本區(qū)別。--http://blog.csdn.net/shareus/article/details/50736159
StringBuilder內(nèi)部實現(xiàn)機制。
反射機制的使用。
反射機制的優(yōu)缺點:
?優(yōu)點:
? ? 運行期類型的判斷,動態(tài)類加載,動態(tài)代理使用反射。
?缺點:
? ? 性能是一個問題,反射相當于一系列解釋操作,通知jvm要做的事情,性能比直接的java代碼要慢很多。
匿名內(nèi)部類的使用。--https://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html
匿名內(nèi)部類也就是沒有名字的內(nèi)部類
正因為沒有名字,所以匿名內(nèi)部類只能使用一次,它通常用來簡化代碼編寫
但使用匿名內(nèi)部類還有個前提條件:必須繼承一個父類或?qū)崿F(xiàn)一個接口
緩存的使用場景
Memcache與Redis的比較
如何實現(xiàn)Redis的分片
二、框架
1.struts1和struts2的區(qū)別
2.struts2和springMVC的區(qū)別
1、Struts2是類級別的攔截, 一個類對應一個request上下文,SpringMVC是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構(gòu)本身上SpringMVC就容易實現(xiàn)restful url,而struts2的架構(gòu)實現(xiàn)起來要費勁,因為Struts2中Action的一個方法可以對應一個url,而其類屬性卻被所有方法共享,這也就無法用注解或其他方式標識其所屬方法了。
2、由上邊原因,SpringMVC的方法之間基本上獨立的,獨享request response數(shù)據(jù),請求數(shù)據(jù)通過參數(shù)獲取,處理結(jié)果通過ModelMap交回給框架,方法之間不共享變量,而Struts2搞的就比較亂,雖然方法之間也是獨立的,但其所有Action變量是共享的,這不會影響程序運行,卻給我們編碼 讀程序時帶來麻煩,每次來了請求就創(chuàng)建一個Action,一個Action對象對應一個request上下文。
3、由于Struts2需要針對每個request進行封裝,把request,session等servlet生命周期的變量封裝成一個一個Map,供給每個Action使用,并保證線程安全,所以在原則上,是比較耗費內(nèi)存的。
4、?攔截器實現(xiàn)機制上,Struts2有以自己的interceptor機制,SpringMVC用的是獨立的AOP方式,這樣導致Struts2的配置文件量還是比SpringMVC大。
5、SpringMVC的入口是servlet,而Struts2是filter(這里要指出,filter和servlet是不同的。以前認為filter是servlet的一種特殊),這就導致了二者的機制不同,這里就牽涉到servlet和filter的區(qū)別了。
6、SpringMVC集成了Ajax,使用非常方便,只需一個注解@ResponseBody就可以實現(xiàn),然后直接返回響應文本即可,而Struts2攔截器集成了Ajax,在Action中處理時一般必須安裝插件或者自己寫代碼集成進去,使用起來也相對不方便。
7、SpringMVC驗證支持JSR303,處理起來相對更加靈活方便,而Struts2驗證比較繁瑣,感覺太煩亂。
8、Spring MVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高(當然Struts2也可以通過不同的目錄結(jié)構(gòu)和相關(guān)配置做到SpringMVC一樣的效果,但是需要xml配置的地方不少)。
9、?設(shè)計思想上,Struts2更加符合OOP的編程思想, SpringMVC就比較謹慎,在servlet上擴展。
10、SpringMVC開發(fā)效率和性能高于Struts2。
11、SpringMVC可以認為已經(jīng)100%零配置。
1. hibernate和ibatis的區(qū)別
2. 講講mybatis的連接池。
3. spring框架中需要引用哪些jar包,以及這些jar包的用途
4. springMVC的原理
5. springMVC注解的意思
6. spring中beanFactory和ApplicationContext的聯(lián)系和區(qū)別
7. spring注入的幾種方式(循環(huán)注入)
8. spring如何實現(xiàn)事物管理的
9. springIOC
10. spring AOP的原理
11. hibernate中的1級和2級緩存的使用方式以及區(qū)別原理(Lazy-Load的理解)
12. Hibernate的原理體系架構(gòu),五大核心接口,Hibernate對象的三種狀態(tài)轉(zhuǎn)換,事務管理。
3.spring框架中需要引用哪些jar包,以及這些jar包的用途
4.srpingMVC的原理
5.springMVC注解的意思
6.spring中beanFactory和ApplicationContext的聯(lián)系和區(qū)別
7.spring注入的幾種方式
8.spring如何實現(xiàn)事物管理的
9.springIOC和AOP的原理
https://www.cnblogs.com/gaopeng527/p/5290997.html
10.hibernate中的1級和2級緩存的使用方式以及區(qū)別原理
11.spring中循環(huán)注入的方式
12.Spring事務的管理
13.Hibernate與MyBatis的比較
14.Hibernate延遲加載的機制
四、JVM
1. Java的內(nèi)存模型以及GC算法
2. jvm性能調(diào)優(yōu)都做了什么
3. 介紹JVM中7個區(qū)域,然后把每個區(qū)域可能造成內(nèi)存的溢出的情況說明
4. 介紹GC 和GC Root不正常引用。
5. 自己從classload?加載方式,加載機制說開去,從程序運行時數(shù)據(jù)區(qū),講到內(nèi)存分配,講到String常量池,講到JVM垃圾回收機制,算法,hotspot。反正就是各種擴展
6. jvm?如何分配直接內(nèi)存,?new?對象如何不分配在堆而是棧上,常量池解析
7.?數(shù)組多大放在?JVM?老年代(不只是設(shè)置?PretenureSizeThreshold?,問通常多大,沒做過一問便知)
8.?老年代中數(shù)組的訪問方式
9. GC?算法,永久代對象如何?GC?,?GC?有環(huán)怎么處理
10.?誰會被?GC?,什么時候?GC
11.?如果想不被?GC?怎么辦
12.?如果想在?GC?中生存?1?次怎么辦
GC算法有哪些
垃圾回收器有哪些
如何調(diào)優(yōu)JVM--http://pengjiaheng.iteye.com/blog/552456
三、多線程
1.Java創(chuàng)建線程之后,直接調(diào)用start()方法和run()的區(qū)別
2.常用的線程池模式以及不同線程池的使用場景
3.newFixedThreadPool此種線程池如果線程數(shù)達到最大值后會怎么辦,底層原理。
4.多線程之間通信的同步問題,synchronized鎖的是對象,衍伸出和synchronized相關(guān)很多的具體問題,例如同一個類不同方法都有synchronized鎖,一個對象是否可以同時訪問?;蛘咭粋€類的static構(gòu)造方法加上synchronized之后的鎖的影響。
5.了解可重入鎖的含義,以及ReentrantLock 和synchronized的區(qū)別
6.同步的數(shù)據(jù)結(jié)構(gòu),例如concurrentHashMap的源碼理解以及內(nèi)部實現(xiàn)原理,為什么他是同步的且效率高
7.atomicinteger和volatile等線程安全操作的關(guān)鍵字的理解和使用
8.線程間通信,wait和notify
9.定時線程的使用
10.場景:在一個主線程中,要求有大量(很多很多)子線程執(zhí)行完之后,主線程才執(zhí)行完成。多種方式,考慮效率。
如何避免Quartz重復啟動任務
線程池滿了如何處理額外的請求
同一個對象的連個同步方法能否被兩個線程同時調(diào)用
11. 進程和線程的區(qū)別
12. 什么叫線程安全?舉例說明
13. 線程的幾種狀態(tài)
14. 并發(fā)、同步的接口或方法
15. HashMap?是否線程安全,為何不安全。?ConcurrentHashMap,線程安全,為何安全。底層實現(xiàn)是怎么樣的。
16. J.U.C下的常見類的使用。?ThreadPool的深入考察;?BlockingQueue的使用。(take,poll的區(qū)別,put,offer的區(qū)別);原子類的實現(xiàn)。
17. 簡單介紹下多線程的情況,從建立一個線程開始。然后怎么控制同步過程,多線程常用的方法和結(jié)構(gòu)
18. volatile的理解
19. 實現(xiàn)多線程有幾種方式,多線程同步怎么做,說說幾個線程里常用的方法
四、網(wǎng)絡(luò)通信
1. http是無狀態(tài)通信,http的請求方式有哪些,可以自己定義新的請求方式么。
2. socket通信,以及長連接,分包,連接異常斷開的處理。
3. socket通信模型的使用,AIO和NIO。
4. socket框架netty的使用,以及NIO的實現(xiàn)原理,為什么是異步非阻塞。
5. 同步和異步,阻塞和非阻塞。
6. OSI七層模型,包括TCP,IP的一些基本知識
7. http中,get?post的區(qū)別
8. 說說http,tcp,udp之間關(guān)系和區(qū)別。
9. 說說瀏覽器訪問www.taobao.com,經(jīng)歷了怎樣的過程。
10. HTTP協(xié)議、? HTTPS協(xié)議,SSL協(xié)議及完整交互過程;
11. tcp的擁塞,快回傳,ip的報文丟棄
12. https處理的一個過程,對稱加密和非對稱加密
13. head各個特點和區(qū)別
14. 說說瀏覽器訪問www.taobao.com,經(jīng)歷了怎樣的過程。
Get和Post的區(qū)別
get 請求參數(shù)在url里面,請求數(shù)據(jù)大小限制為2k,數(shù)據(jù)暴露,安全性低
五、Linux
1.常用的linux下的命令
2.大的log文件中,統(tǒng)計異常出現(xiàn)的次數(shù)、排序,或者指定輸出多少行多少列的內(nèi)容。(主要考察awk)
3.linux下的調(diào)查問題思路:內(nèi)存、CPU、句柄數(shù)、過濾、查找、模擬POST和GET請求等等場景
4.shell腳本中#!的作用
六、數(shù)據(jù)庫MySql
1. MySql的存儲引擎的不同
2. 單個索引、聯(lián)合索引、主鍵索引
3. Mysql怎么分表,以及分表后如果想按條件分頁查詢怎么辦(如果不是按分表字段來查詢的話,幾乎效率低下,無解)
4. 分表之后想讓一個id多個表是自增的,效率實現(xiàn)
5. MySql的主從實時備份同步的配置,以及原理(從庫讀主庫的binlog),讀寫分離
6. 寫SQL語句。。。
7. 索引的數(shù)據(jù)結(jié)構(gòu),B+樹
8. 事務的四個特性,以及各自的特點(原子、隔離)等等,項目怎么解決這些問題
9. 數(shù)據(jù)庫的鎖:行鎖,表鎖;樂觀鎖,悲觀鎖
10. 數(shù)據(jù)庫事務的幾種粒度;
11.?關(guān)系型和非關(guān)系型數(shù)據(jù)庫區(qū)別
七、設(shè)計模式(寫代碼)
1. 單例模式:飽漢、餓漢。以及餓漢中的延遲加載,雙重檢查
2. 工廠模式、裝飾者模式、觀察者模式。
3.?工廠方法模式的優(yōu)點(低耦合、高內(nèi)聚,開放封閉原則)
八、算法
1. 使用隨機算法產(chǎn)生一個數(shù),要求把1-1000W之間這些數(shù)全部生成。(考察高效率,解決產(chǎn)生沖突的問題)
2. 兩個有序數(shù)組的合并排序
3. 一個數(shù)組的倒序
4. 計算一個正整數(shù)的正平方根
5. 說白了就是常見的那些查找、排序算法以及各自的時間復雜度
6. 二叉樹的遍歷算法
7. DFS,BFS算法
9. 比較重要的數(shù)據(jù)結(jié)構(gòu),如鏈表,隊列,棧的基本理解及大致實現(xiàn)。
10.?排序算法與時空復雜度(快排為什么不穩(wěn)定,為什么你的項目還在用)
11. 逆波蘭計算器
12. Hoffman?編碼
13.?查找樹與紅黑樹
九、緩存
1.為什么用緩存,用過哪些緩存,redis和memcache的區(qū)別
2.redis的數(shù)據(jù)結(jié)構(gòu)
3.redis的持久化方式,以及項目中用的哪種,為什么
4.redis集群的理解,怎么動態(tài)增加或者刪除一個節(jié)點,而保證數(shù)據(jù)不丟失。(一致性哈希問題)
緩存的使用場景
Memcache與Redis的比較
如何實現(xiàn)Redis的分片
十一、并發(fā)與性能調(diào)優(yōu)
1. 有個每秒鐘5k個請求,查詢手機號所屬地的筆試題(記得不完整,沒列出),如何設(shè)計算法?請求再多,比如5w,如何設(shè)計整個系統(tǒng)?
2. 高并發(fā)情況下,我們系統(tǒng)是如何支撐大量的請求的
3. 集群如何同步會話狀態(tài)
4.?負載均衡的原理
5 .如果有一個特別大的訪問量,到數(shù)據(jù)庫上,怎么做優(yōu)化(DB設(shè)計,DBIO,SQL優(yōu)化,Java優(yōu)化)
6. 如果出現(xiàn)大面積并發(fā),在不增加服務器的基礎(chǔ)上,如何解決服務器響應不及時問題“。
7. 假如你的項目出現(xiàn)性能瓶頸了,你覺得可能會是哪些方面,怎么解決問題。
8. 如何查找?造成?性能瓶頸出現(xiàn)的位置,是哪個位置照成性能瓶頸。
9.?你的項目中使用過緩存機制嗎?有沒用用戶非本地緩存
面試經(jīng)驗--http://blog.163.com/hcl_zjblog/blog/static/214281242201712455443247/
---------------------本文來自 zengxiaozengxiao 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/zengxiaozengxiao/article/details/79381038?utm_source=copy