1.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()方法,該線程結束生命周期。二. 線程狀態圖
2.進程和線程的區別,進程間如何通訊,線程間如何通訊
他們之間根本區別在於 多進程中每個進程有自己的地址空間,線程則共享地址空間。
http://blog.csdn.net/ls5718/article/details/51878770
一、進程間的通信方式
- 管道( pipe ):
管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。- 有名管道 (namedpipe) :
有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。- 信號量(semophore ) :
信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。- 消息隊列( messagequeue ) :
消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。- 信號 (sinal ) :
信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。- 共享內存(shared memory ) :
共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現進程間的同步和通信。- 套接字(socket ) :
套接口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同設備及其間的進程通信。二、線程間的通信方式
- 鎖機制:包括互斥鎖、條件變量、讀寫鎖
- 互斥鎖提供了以排他方式防止數據結構被並發修改的方法。
- 讀寫鎖允許多個線程同時讀共享數據,而對寫操作是互斥的。
- 條件變量可以以原子的方式阻塞進程,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一起使用。
- 信號量機制(Semaphore):包括無名線程信號量和命名線程信號量
信號機制(Signal):類似進程間的信號處理線程間的通信目的主要是用於線程同步,所以線程沒有像進程通信中的用於數據交換的通信機制。
3.HashMap的數據結構是什么?如何實現的。和HashTable,ConcurrentHashMap的區別
http://www.cnblogs.com/rogerluo1986/p/5851300.html
ConcurrentHashMap線程同步,hashMap 線程不同步,hashTable不許使用null
hashMap使用數組加鏈表的存儲方式來實現
http://www.cnblogs.com/infinityu/articles/3188266.html
4.Cookie和Session的區別
cookie 和session 的區別:
1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙 考慮到安全應當使用session。
3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能 考慮到減輕服務器性能方面,應當使用COOKIE。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
5、所以個人建議: 將登陸信息等重要信息存放為SESSION 其他信息如果需要保留,可以放在COOKIE中
5.索引有什么用?如何建索引?
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 語句用於在表中創建索引。
在不讀取整個表的情況下,索引使數據庫應用程序可以更快地查找數據。 索引
您可以在表中創建索引,以便更加快速高效地查詢數據。
6.ArrayList是如何實現的,ArrayList和LinedList的區別?ArrayList如何實現擴容。
新容量=(舊容量*3)/2+1,ArrayList 基於動態數組,LinkedList基於鏈表。
http://blog.csdn.net/u013673242/article/details/43272005
如果涉及到堆棧,隊列等操作,應該考慮用List,對於需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。
盡量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果以后需要將ArrayList換成LinkedList時,客戶端代碼不用改變。這就是針對抽象編程。
7.equals方法實現
http://www.cnblogs.com/yxl10/p/4161528.html
首先看下Java語言規范對equals方法的要求:
1,自反性,對於任何非控引用x,x.equals(x)都應該返回true。
2,對稱性,對於任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也應該返回true。
3,傳遞性,如果x.equals(y),y.equals(z)都返回true,那么,x.equals(z)返回true。
4,一致性,如果x和y引用的對象沒有發生變化,那么無論調用多少次x.equals(y)都返回相同的結果。
5,對於任意非空引用x,x.equals(null)都應該返回false。
Object類中的equals方法用於檢測兩個對象是否相等,而相等判斷的標准則是二者是否引用同一個對象。
下面給出編寫一個完美的equals方法的原則:
1,將equals的Object類顯式參數命名為otherObject。
2,檢測otherObject是否與this引用自同一個對象。
3,檢測otherObject是否為null,是的話返回false。
4,檢測this與otherObject是否屬於同一個類,這里需要注意的情況就是當比較的兩個對象不屬於同一個類時,比如p.equals(e),p是一個Person,e是一個Employee, Employee繼承自Person。Person擁有name,age私有域,Employee具有occupation域。
如果相等的概念是的對象的所有域都必須相等,p.equals(e)中使用e instalceof Person返回true,但是如果e.equals(p)調用,p instanceof Employee則返回false,不滿足對稱性要求,所以這里需要強制采用getClass()來進行類型檢測。
如果相等的概念是由超類決定的,比如認為只要name和age相同,則Person和Employee相等,則可以使用instance進行檢測,同時在超類中將該方法定義為final。
5,將otherObject轉換為this類型的變量。
6,現在開始進行私有數據域的比較,對於基本類型如數值,字符和布爾類型使用==進行比較,對對象域使用equals進行比較,所有域都相同則返回true。
7,使用@Override聲明有助於錯誤檢查。
8.面向對象
9.線程狀態,BLOCKED和WAITING有什么區別
BLOCKED是指線程正在等待獲取鎖。
總結: BLOCKED 和WAITING 都是非活動線程的狀態. WAITING 線程是已經分配到了CPU時間,但是需要等待事件發生所以主動釋放了CPU,直到某些事件完成后調用了notify()喚醒, 也就是WAITTING線程是自己現在不想要CPU時間,但是 BLOCKED線程是想要的,但是BLOCKED線程沒有獲得鎖,所以輪不到BLOCKED 線程。
10.JVM如何加載字節碼文件
11.JVM GC,GC算法。
12.什么情況會出現Full GC,什么情況會出現yong GC。
13.JVM內存模型
http://blog.csdn.net/u012152619/article/details/46968883#t0
14.Java運行時數據區
15.事務的實現原理
http://www.cnblogs.com/roucheng/p/javashiwu.html
事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性 (isolation)和持久性(durability)的縮寫。事務的原子性表示事務執行過程中的任何失敗都將導致事務所做的任何修改失效。一致性表示 當事務執行失敗時,所有被該事務影響的數據都應該恢復到事務執行前的狀態。隔離性表示在事務執行過程中對數據的修改,在事務提交之前對其他事務不可見。持 久性表示已提交的數據在事務執行失敗時,數據的狀態都應該正確。
技術深度
1.有沒有看過JDK源碼,看過的類實現原理是什么。
2.HTTP協議
http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
3.TCP協議
http://network.51cto.com/art/201411/456783.htm
TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接(連接導向)的、可靠的、 基於IP的傳輸層協議
4.一致性Hash算法
5.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 實體。這兩個加載器都是以靜態類的形式存在的。
6.類加載器如何卸載字節碼
http://www.cnblogs.com/macgradyjames/p/7404054.html
由Java虛擬機自帶的類加載器所加載的類,在虛擬機的生命周期中,始終不會被卸載。
前面介紹過,Java虛擬機自帶的類加載器包括根類加載器、擴展類加載器和系統類加載器。
Java虛擬機本身會始終引用這些類加載器,而這些類加載器則會始終引用它們所加載的類的Class對象,因此這些Class對象始終是可觸及的。
由用戶自定義的類加載器加載的類是可以被卸載的。
7.IO和NIO的區別,NIO優點
8.Java線程池的實現原理,keepAliveTime等參數的作用。
http://www.cnblogs.com/dolphin0520/p/3932921.html
我們使用線程的時候就去創建一個線程,這樣實現起來非常簡便,但是就會有一個問題:
如果並發的線程數量很多,並且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,因為頻繁創建線程和銷毀線程需要時間。
那么有沒有一種辦法使得線程可以復用,就是執行完一個任務,並不被銷毀,而是可以繼續執行其他的任務?
在Java中可以通過線程池來達到這樣的效果。今天我們就來詳細講解一下Java的線程池,首先我們從最核心的ThreadPoolExecutor類中的方法講起,然后再講述它的實現原理,接着給出了它的使用示例,最后討論了一下如何合理配置線程池的大小。
9.HTTP連接池實現原理
http://blog.csdn.net/catoop/article/details/50352334
10.數據庫連接池實現原理
http://www.cnblogs.com/wym789/p/6374440.html
11.數據庫的實現原理
http://blog.jobbole.com/100349/
技術框架
-
看過哪些開源框架的源碼
-
為什么要用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;