工作3年java面試題整理
基礎題目
-
Java線程的狀態 一. 線程狀態類型:
1. 新建狀態(New):新創建了一個線程對象。
2. 就緒狀態(Runnable):線程對象創建後,其他線程調用了該對象的start()方法。該狀態的線程位於可運行線程池中,變得可運行,等待獲取CPU的使用權。
3. 運行狀態(Running):就緒狀態的線程獲取了CPU,執行程序代碼。
4. 阻塞狀態(Blocked):阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。阻塞的情況分三種:
(一)、等待阻塞:運行的線程執行wait()方法,JVM會把該線程放入等待池中。
(二)、同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。
(三)、其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
5. 死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命周期。
二. 線程狀態圖
-
進程和線程的區別,進程間如何通訊,線程間如何通訊
-
HashMap的數據結構是什麽?如何實現的。和HashTable,ConcurrentHashMap的區別
http://www.cnblogs.com/infinityu/articles/3188266.html
-
Cookie和Session的區別
cookie 和session 的區別:
1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session。3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE。4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
5、所以個人建議:
將登陸信息等重要信息存放為SESSION
其他信息如果需要保留,可以放在COOKIE中 -
索引有什麽用?如何建索引?
SQL 創建索引的作用以及如何創建索引
SQL 創建索引的作用
一、使用索引的優點:
1、通過唯一性索引(unique)可確保數據的唯一性 2、加快數據的檢索速度 3、加快表之間的連接 4、減少分組和排序時間
5、使用優化隱藏器提高系統性能
二、使用索引的原則:
1、在需要經常搜索的列上創建索引 2、主鍵上創建索引
3、經常用於連接的列上創建索引
4、經常需要根據範圍進行搜索的列上創建索引 5、經常需要排序的列上創建索引
6、經常用於where子句的列上創建索引
三、不創建索引的原則:
1、查詢很少使用和參考的列不建索引 2、對只有少數值的列不建索引
3、定義為text、image、bit的列不建索引
4、當需要update性能遠遠高於select性能時不應建索引
四、常用的命令:
1、sp_helpindex :報告表或視圖上的索引信息
2、dbcc showcontig :顯示指定表的數據和索引的碎片信息 3、dbcc dbreindex :重建指定數據庫中一個或多個索引
4、dbcc indexdefrag :整理指定表或視圖的聚集索引或輔助索引的碎片
五、優化索引:
1、重建索引(dbcc dbreindex) 2、索引優化向導
3、整理指定的表或視圖的聚集索引和輔助索引碎片(dbcc indexefrag)
如何創建索引
CREATE INDEX 語句用於在表中創建索引。
在不讀取整個表的情況下,索引使數據庫應用程序可以更快地查找數據。 索引
您可以在表中創建索引,以便更加快速高效地查詢數據。 -
ArrayList是如何實現的,ArrayList和LinedList的區別?ArrayList如何實現擴容。
-
equals方法實現
-
面向對象
-
線程狀態,BLOCKED和WAITING有什麽區別
WATTING就是一個線程調用了 Object.wait() 就是在等待別的線程對該對象調用 Object.notify() or Object.notifyAll().
BLOCKED是指線程正在等待獲取鎖。
總結: BLOCKED 和WAITING 都是非活動線程的狀態. WAITING 線程是已經分配到了CPU時間,但是需要等待事件發生所以主動釋放了CPU,直到某些事件完成後調用了notify()喚醒, 也就是WAITTING線程是自己現在不想要CPU時間,但是BLOCKED線程是想要的,但是BLOCKED線程沒有獲得鎖,所以輪不到BLOCKED線程。 作者:羅智勇鏈接:https://www.zhihu.com/question/27654579/answer/97448656來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。 -
JVM如何加載字節碼文件
-
JVM GC,GC算法。
-
什麽情況會出現Full GC,什麽情況會出現yong GC。
-
JVM內存模型
-
Java運行時數據區
-
事務的實現原理
-
有沒有看過JDK源碼,看過的類實現原理是什麽。
-
HTTP協議
-
TCP協議
-
一致性Hash算法
-
JVM如何加載字節碼文件
http://blog.csdn.net/likika2012/article/details/45575285
當我們使用命令來執行某一個Java程序(比如Test.class)的時候:java Test
(1) java.exe 會幫助我們找到 JRE ,接著找到位於 JRE 內部的 jvm.dll ,這才是真正的 Java 虛擬機器 , 最後加載動態庫,激活 Java 虛擬機器。
(2) 虛擬機器激活以後,會先做一些初始化的動作,比如說讀取系統參數等。一旦初始化動作完成之後,就會產生第一個類裝載器 ―― Bootstrap Loader(啟動類裝載器 ) 。
(3) Bootstrap Loader 所做的初始工作中,除了一些基本的初始化動作之外,最重要的就是加載 Launcher.java 之中的 ExtClassLoader(擴展類裝載器) ,並設定其 Parent 為 null ,代表其父加載器為 BootstrapLoader 。
(4) 然後 Bootstrap Loader 再要求加載 Launcher.java 之中的 AppClassLoader(用戶自定義類裝載器 ) ,並設定其 Parent 為之前產生的 ExtClassLoader 實體。這兩個加載器都是以靜態類的形式存在的。
-
類加載器如何卸載字節碼
-
IO和NIO的區別,NIO優點
-
Java線程池的實現原理,keepAliveTime等參數的作用。
-
HTTP連接池實現原理
-
數據庫連接池實現原理
-
數據庫的實現原理
-
看過哪些開源框架的源碼
-
為什麽要用Redis,Redis有哪些優缺點?Redis如何實現擴容?
-
Netty是如何使用線程池的,為什麽這麽使用
-
為什麽要使用Spring,Spring的優缺點有哪些
-
Spring的IOC容器初始化流程
-
Spring的IOC容器實現原理,為什麽可以通過byName和ByType找到Bean
-
Spring AOP實現原理
-
消息中間件是如何實現的,技術難點有哪些
-
如何搭建一個高可用系統
-
哪些設計模式可以增加系統的可擴展性
-
介紹設計模式,如模板模式,命令模式,策略模式,適配器模式、橋接模式、裝飾模式,觀察者模式,狀態模式,訪問者模式。
-
抽象能力,怎麽提高研發效率。
-
什麽是高內聚低耦合,請舉例子如何實現
-
什麽情況用接口,什麽情況用消息
-
如果AB兩個系統互相依賴,如何解除依賴
-
如何寫一篇設計文檔,目錄是什麽
-
什麽場景應該拆分系統,什麽場景應該合並系統
-
系統和模塊的區別,分別在什麽場景下使用
-
分布式事務,兩階段提交。
-
如何實現分布式鎖
-
如何實現分布式Session
-
如何保證消息的一致性
-
負載均衡
-
正向代理(客戶端代理)和反向代理(服務器端代理)
-
CDN實現原理
-
怎麽提升系統的QPS和吞吐量
-
有沒有處理過線上問題?出現內存泄露,CPU利用率標高,應用無響應時如何處理的。
-
開發中有沒有遇到什麽技術問題?如何解決的
-
如果有幾十億的白名單,每天白天需要高並發查詢,晚上需要更新一次,如何設計這個功能。
-
新浪微博是如何實現把微博推給訂閱者
-
Google是如何在一秒內把搜索結果返回給用戶的。
-
12306網站的訂票系統如何實現,如何保證不會票不被超賣。
-
如何實現一個秒殺系統,保證只有幾位用戶能買到某件商品。
-
如何學習一項新技術,比如如何學習Java的,重點學習什麽
-
有關註哪些新的技術
-
工作任務非常多非常雜時如何處理
-
項目出現延遲如何處理
-
和同事的設計思路不一樣怎麽處理
-
如何保證開發質量
-
職業規劃是什麽?短期,長期目標是什麽
-
團隊的規劃是什麽
-
能介紹下從工作到現在自己的成長在那裏
-
某互聯網公司筆試題
-
spring 事務的屬性有哪些?事務的隔離級別有那幾種?什麽場景需要使用這幾種事務。
其中spring七個事物傳播屬性:
PROPAGATION_REQUIRED -- 支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS -- 支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY -- 支持當前事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW -- 新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED -- 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER -- 以非事務方式執行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED -- 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,
則進行與PROPAGATION_REQUIRED類似的操作。
五個隔離級別:
ISOLATION_DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.
另外四個與JDBC的隔離級別相對應;
ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。
這種隔離級別會產生臟讀,不可重復讀和幻像讀。ISOLATION_READ_COMMITTED 保證一個事務修改的數據提交後才能被另外一個事務讀取。另外一個事務不能讀取
該事務未提交的數據。這種事務隔離級別可以避免臟讀出現,但是可能會出現不可重復讀和幻像讀。ISOLATION_REPEATABLE_READ 這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻像讀。它除了保證
一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重復讀)。ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。除了防止臟讀,
不可重復讀外,還避免了幻像讀。 -
樂觀鎖和悲觀鎖的優缺點,舉例說明?
悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關系型數據庫裏邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像數據庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖。
兩種鎖各有優缺點,不可認為一種好於另一種,像樂觀鎖適用於寫比較少的情況下,即沖突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。但如果經常產生沖突,上層應用會不斷的進行retry,這樣反倒是降低了性能,所以這種情況下用悲觀鎖就比較合適。
-
什麽叫冪等,什麽叫Base,什麽叫cap
http://blog.csdn.net/dellme99/article/details/15340955
CAP: Consistency, Availability, Partition-tolerance
強一致性(Consistency)。系統在執行過某項操作後仍然處於一致的狀態。在分布式系統中,更新操作執行成功後所有的用戶都應該讀取到最新的值,這樣的系統被認為具有強一致性。
可用性(Availability)。每一個操作總是能夠在一定的時間內返回結果,這裏需要註意的是“一定時間內”和“返回結果”。
分區容錯性(Partition Tolerance)。分區容錯性可以理解為系統在存在網絡分區的情況下仍然可以接受請求(滿足一致性和可用性)。這裏網絡分區是指由於某種原因網絡被分成若幹個孤立的區域,而區域之間互不相通。還有一些人將分區容錯性理解為系統對節點動態加入和離開的處理能力,因為節點的加入和離開可以認為是集群內部的網絡分區。
BASE
弱一致性協議
基本可用(Basically Available):系統能夠基本運行、一直提供服務。
軟狀態(Soft-state):系統不要求一直保持強一致狀態。
最終一致性(Eventual consistency):系統需要在某一時刻後達到一致性要求
-
annotation泛型的優缺點
-
java 中多線程有幾種實現方法,各是什麽?同步有幾種實現方法,分別是什麽?你在開發中使用同步的場景是什麽?
-
怎樣避免Form表單重復提交
-
什麽是XSS攻擊?如何防止?
-
http請求的get和post的區別?cookie與session的區別?
GET和POST請求的區別
GET請求
GET /books/?sex=man&name=Professional HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive
註意最後一行是空行
POST請求
POST / HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 40 Connection: Keep-Alive name=Professional%20Ajax&publisher=Wiley
1、GET提交,請求的數據會附在URL之後(就是把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,多個參數用&連接;例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果數據是英文字母/數字,原樣發送,如果是空格,轉換為+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進制表示的ASCII。
POST提交:把提交的數據放置在是HTTP包的包體中。上文示例中紅色字體標明的就是實際的傳輸數據
因此,GET提交的數據會在地址欄中顯示出來,而POST提交,地址欄不會改變
2、傳輸數據的大小:首先聲明:HTTP協議沒有對傳輸的數據大小進行限制,HTTP協議規範也沒有對URL長度進行限制。
而在實際開發中存在的限制主要有:
GET:特定瀏覽器和服務器對URL長度有限制,例如 IE對URL長度的限制是2083字節(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操作系 統的支持。
因此對於GET提交時,傳輸數據就會受到URL長度的 限制。
POST:由於不是通過URL傳值,理論上數據不受 限。但實際各個WEB服務器會規定對post提交數據大小進行限制,Apache、IIS6都有各自的配置。
3、安全性
POST的安全性要比GET的安全性高。比如:通過GET提交數據,用戶名和密碼將明文出現在URL上,因為(1)登錄頁面有可能被瀏覽器緩存;(2)其他人查看瀏覽器的歷史紀錄,那麽別人就可以拿到你的賬號和密碼了,除此之外,使用GET提交數據還可能會造成Cross-site request forgery攻擊
4、Http get,post,soap協議都是在http上運行的
(1)get:請求參數是作為一個key/value對的序列(查詢字符串)附加到URL上的
查詢字符串的長度受到web瀏覽器和web服務器的限制(如IE最多支持2048個字符),不適合傳輸大型數據集同時,它很不安全(2)post:請求參數是在http標題的一個不同部分(名為entity body)傳輸的,這一部分用來傳輸表單信息,因此必須將Content-type設置為:application/x-www-form- urlencoded。post設計用來支持web窗體上的用戶字段,其參數也是作為key/value對傳輸。
但是:它不支持復雜數據類型,因為post沒有定義傳輸數據結構的語義和規則。(3)soap:是http post的一個專用版本,遵循一種特殊的xml消息格式
Content-type設置為: text/xml 任何數據都可以xml化。Http協議定義了很多與服務器交互的方法,最基本的有4種,分別是GET,POST,PUT,DELETE. 一個URL地址用於描述一個網絡上的資源,而HTTP中的GET, POST, PUT, DELETE就對應著對這個資源的查,改,增,刪4個操作。 我們最常見的就是GET和POST了。GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息.
我們看看GET和POST的區別
GET提交的數據會放在URL之後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的Body中.
GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。
GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼.
-
什麽叫session粘連?什麽場景需要session粘連?為什麽?
-
盡可能多的列出你使用過的linux常用命令,並簡要說明其功能。
-
編程題:第一個人10,第二個比第一個大2歲,依次遞推,請用遞歸的方式算出第82個人多大?(請用最優化算法實現)
-
在項目中用到過的性能調優的方法有哪些,請舉例說明
http://www.csdn.net/article/2012-06-21/2806814
-
算法題:海量日誌數據,提取出一周內訪問次數最多的IP,請設計最優化算法,並推導出算法的復雜度
首先是這一天,並且是訪問百度的日誌中的IP取出來,逐個寫入到一個大文件中。註意到IP是32位的,最多有個2^32個IP。同樣可以采用映射的方法,比如模1000,把整個大文件映射為1000個小文件,再找出每個小文中出現頻率最大的IP(可以采用hash_map進行頻率統計,然後再找出頻率最大的幾個)及相應的頻率。然後再在這1000個最大的IP中,找出那個頻率最大的IP,即為所求。
或者如下闡述(雪域之鷹):
算法思想:分而治之+Hash
1.IP地址最多有2^32=4G種取值情況,所以不能完全加載到內存中處理;
2.可以考慮采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日誌分別存儲到1024個小文件中。這樣,每個小文件最多包含4MB個IP地址;
3.對於每一個小文件,可以構建一個IP為key,出現次數為value的Hash map,同時記錄當前出現次數最多的那個IP地址;
4.可以得到1024個小文件中的出現次數最多的IP,再依據常規的排序算法得到總體上出現次數最多的IP;
工作3年java面試題整理