1. 程式人生 > >( 百度Java面經)網際網路公司校招Java面試題總結及答案——百度(目前只是部分總結)

( 百度Java面經)網際網路公司校招Java面試題總結及答案——百度(目前只是部分總結)

1.關鍵字transient 1)一旦變數被transient修飾,變數將不再是物件持久化的一部分,該變數內容在序列化後無法獲得訪問。 2)transient關鍵字只能修飾變數,而不能修飾方法和類。注意,本地變數是不能被transient關鍵字修飾的。變數如果是使用者自定義類變數,則該類需要實現Serializable介面。 3)被transient關鍵字修飾的變數不再能被序列化,一個靜態變數不管是否被transient修飾,均不能被序列化。 MyISAM引擎是MySQL 5.1及之前版本的預設引擎,它的特點是:
  • 不支援行鎖,讀取時對需要讀到的所有表加鎖,寫入時則對錶加排它鎖
  • 不支援事務
  • 不支援外來鍵
  • 不支援崩潰後的安全恢復
  • 在表有讀取查詢的同時,支援往表中插入新紀錄
  • 支援BLOB和TEXT的前500個字元索引,支援全文索引
  • 支援延遲更新索引,極大提升寫入效能
  • 對於不會進行修改的表,支援壓縮表,極大減少磁碟空間佔用
InnoDB InnoDB在MySQL 5.5後成為預設索引,它的特點是:
  • 支援行鎖,採用MVCC來支援高併發
  • 支援事務
  • 支援外來鍵
  • 支援崩潰後的安全恢復
  • 不支援全文索引
----------------------------------------百度----------------------------------------------------- 一面: 1.怎樣設計實現一個高效的執行緒安全的hashmap 。 方法一:通過Collections.synchronizedMap()返回一個新的Map,這個新的map就是執行緒安全的。 這個要求大家習慣基於介面程式設計,因為返回的並不是HashMap,而是一個Map的實現。 方法二:重新改寫了HashMap,具體的可以檢視java.util.concurrent.ConcurrentHashMap. 這個方法比方法一有了很大的改進。(鎖分離) 方法一使用的是的synchronized方法,是一種悲觀鎖.在進入之前需要獲得鎖,確保獨享當前物件,然後做相應的修改/讀取. 方法二使用的是樂觀鎖,只有在需要修改物件時,比較和之前的值是否被人修改了,如果被其他執行緒修改了,那麼就會返回失敗.鎖的實現,使用的是 NonfairSync. 這個特性要確保修改的原子性,互斥性,無法在JDK這個級別得到解決,JDK在此次需要呼叫JNI方法,而JNI則呼叫CAS指令來確保原子性與互斥性. 重寫和過載 (1)重寫:需要繼承;方法嗎和引數、返回值必須相同,許可權修飾符必須大於等於父類;不可以重寫父類的private方法;不可以丟擲父類沒有丟擲的異常; (2)過載:方法名必須相同;引數個數、型別有一個不相同;返回值可以相同也可以不同;可以有不同的訪問修飾符;可以丟擲不同異常。 2.用過的設計模式。寫單例模式程式碼,各種情況下比如去掉某一句會怎樣。 建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。 結構型模式,共七種:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。 行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。 其實還有兩類:併發型模式和執行緒池模式。 單例模式: 工廠模式:程式在介面和子類之間加入了一個過渡端,通過此過渡端可以動態取得實現了共同介面的子類例項化物件。 代理模式:指由一個代理主題來操作真實主題,真實主題執行具體的業務操作,而代理主題負責其他相關業務的處理。 觀察者模式: 介面卡模式:如果一個類要實現一個具有很多抽象方法的介面,但是本身只需要實現介面中的部分方法便可以達成目的,所以此時就需要一箇中間的過渡類,但此過渡類又不希望 直接使用,所以將此類定義為抽象類最為合適,再讓以後的子類直接繼承該抽象類便可選擇性的覆寫所需要的方法,而此抽象類便是介面卡類。 3、介紹同步鎖
,使用情景; synchronized 4、假如有兩個執行緒,一個執行緒A,一個執行緒B都會訪問一個加鎖方法,可能存在併發情況,但是執行緒B訪問頻繁,執行緒A訪問次數很少,問如何優化。(然後面試官說有了解過重度鎖和輕度鎖嗎) 5、程序間都有哪些通訊方式; 1.無名管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 2.高階管道(popen):將另一個程式當做一個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方式。 3.有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係
程序間的通訊。 4.訊息佇列( message queue ) : 訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。 5.訊號量( semophore ) : 訊號量是一個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。 6.訊號 ( sinal ) : 訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。 7.共享記憶體( shared memory ) :共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以訪問。共享記憶體是最快的 IPC 方式,它是針對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號兩,配合使用,來實現程序間的同步和通訊。 8.套接字( socket ) : 套解口也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同機器間的程序通訊。 6、有一個整數,轉換為二進位制,請找出所有的1的數量; 只計算1的個數使用: while(n>0) count++; n = n & (n-1); 7、你覺得Java是完全面相物件的語言嗎? 8、講解下你對抽象,多型的理解; 抽象就是將實際事物特徵抽象出來,用一個類表示,類中的屬性就表示事物的不同特徵。 抽象類和介面就是抽象的一種表象。 多型 ①使用父類型別的引用指向子類的物件; ②該引用只能呼叫父類中定義的方法,不能呼叫子類中獨有的方法; ③如果子類中重寫了父類中的一個方法,那麼在呼叫該方法的時候,將會呼叫子類中的這個方法; ④在多型中,子類可以呼叫父類中的所有方法; ⑤多型主要體現為方法過載和方法重寫,相同的行為,不同的實現方式; ⑥多型的主要應用是多型引數和多型集合 ⑦如果一個方法中有父類作為引數型別,就意味著可以給該方法傳遞任何一個子類物件。 9、講解下http請求裡的header有什麼作用;
10.Get和post區別。 (1)get用於獲取資料,而且應該是安全的和冪等的。post用於提交資料。(多用於新建)。 (2)GET請求的資料會附在URL之後,最多隻能是1024位元組;POST把提交的資料則放置在是HTTP包的包體中,理論上資料大小沒有限制。 (3)POST的安全性要比GET的安全性高。 11.Http協議相關。 HTTP 是基於 TCP/IP 協議的應用層協議。它不涉及資料包(packet)傳輸,主要規定了客戶端和伺服器之間的通訊格式,預設使用80埠。 HTTP/1.0不支援連線保持,所以後來HTTP/1.1增加了Connection:keep-alive以及管道,管道機制則是允許瀏覽器同時發出A請求和B請求,但是伺服器還是按照順序。 HTTP/2.0是一個徹底的二進位制協議;實現雙向的、實時的通訊(多工),避免了隊頭阻塞;用ID來區分資料流,客戶端發出的資料流,ID一律為奇數,伺服器發出的,ID為偶數;可以取消資料流;客戶端還可以指定資料流的優先順序。優先順序越高,伺服器就會越早迴應;引入了頭資訊壓縮機制和資訊表;允許伺服器未經請求,主動向客戶端傳送資源,這叫做伺服器推送; 12.Java有沒有多繼承,介面和抽象類區別。jvm 理解 介面可以多繼承,類不可以。 (1)抽象類是由abstract關鍵字修飾,允許包含未實現的方法。 介面是方法宣告和常量值定義的集合,不允許包含變數。 (2)介面是絕對抽象的,不可以被例項化。抽象類不能被例項化。 (3)定義介面時可以使用繼承,而且可以使用多繼承。抽象類只能單繼承。類可以實現很多個介面,但是隻能繼承一個抽象類; (4)介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。Java介面中宣告的變數預設都是final的。抽象類可以包含非final的變數。 (5)Java介面中的成員函式預設是public的。抽象類的成員函式可以是private,protected或者是public。 類可以不實現抽象類和介面宣告的所有方法,當然,在這種情況下,類也必須得宣告成是抽象的。 抽象類也不可以被例項化,但是,如果它包含main方法的話是可以被呼叫的。 public是在不同包中也可以訪問;protected是必須在同一個包中或者子類才能訪問;default是不允許子類訪問,可以在類內部或者同一個包中訪問;private是隻能在類內部訪問。 13.JDK和JRE的區別是什麼? Java執行時環境(JRE)是將要執行Java程式的Java虛擬機器。它同時也包含了執行applet需要的瀏覽器外掛。Java開發工具包(JDK) 是完整的Java軟體開發包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java偵錯程式),可以讓開發者開發、編譯、執行Java應用程 序。 JDK中包含JRE,JRE中包含JVM。 JDK中包含的JRE主要是為JDK自帶的開發工具提供執行環境,與JDK並列的那個JRE是為使用者編寫的JAVA程式碼提供執行環境的。 classpath配置的是JDK的lib目錄,path配置的是JDK的bin目錄。 14.資料庫四個正規化的區別。在設計資料庫的時候如何考量。 第一正規化(1NF)屬性不可拆分 或 無重複的列(保證列唯一) 第二正規化(2NF)要求實體的屬性完全依賴於主關鍵字。存在一個列被定義為唯一主鍵的表就是第二正規化。(保證行唯一) 第三正規化(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字資訊。(外來鍵關係) 第四正規化(4NF)禁止主鍵列和非主鍵列一對多關係不受約束用複合列做主鍵的表。 15.64個馬有8個跑道,沒有計時工具,最少需要多少次跑,如何找到跑最快的1個和4個馬? 先分為8組,找出每組第一再跑一次,一共9次就可以找到第一名; 第九次的第一名的那組的二(1)、三(2),四(3),第二名(4)那組的第二名(5),第三名(6),第三名(7)的第二名(8)再跑一次就可以找到前4名。 16.正則表示式 \s表示所有空白字元;\S表示非空白字元;*表示匹配零次或多次;+表示匹配一次或多次;. 表示除換行符外的任意字元;?匹配零次或一次。 1.如何停止執行一個執行緒  interrupt 2.如何實現一個hashmap,需要考慮哪些問題  hashcode 3.equal和==的區別  值型別是儲存在記憶體中的堆疊(以後簡稱棧),而引用型別的變數在棧中僅僅是儲存引用型別變數的地址,而其本身則儲存在堆中。 ==操作比較的是兩個變數的值是否相等,對於引用型變量表示的是兩個變數在堆中儲存的地址是否相同,即棧中的內容是否相同。     equals操作表示的兩個變數是否是對同一個物件的引用,即堆中的內容是否相同。 String s2 = new String("Monday").intern();會放入緩衝池。 4.如何判斷一個物件已經被回收  5.為什麼四次揮手比三次握手多一次  因為三次握手是要建立和確認客戶端和伺服器之間的通訊線路;而四次揮手是為了關閉兩方之間的資料傳遞,因為是雙工的,所以被動方和主動方兩個流向都需要關閉和確認,所以是四次。 4. linux相關指令,把能記得的說一下,出了個小功能,用shell實現; 5. sql中replace和update的區別; update是SQL中的資料更新命令,replace是VF中的資料更新命令; update不需要開啟表,repl命令需要先開啟表; update不加條件是更新表中所有記錄,repl不加條件是更新當前記錄,要加上all短語才是更新所有記錄。 9. 接觸過哪些軟體測試的方法。 黑盒,白盒測試; 效能測試,壓力測試,冒煙測試; 3. 如何攔截5分鐘前惡意登入(使用者名稱密碼不正確)超多一定次數的ip 6.介紹一下訊號量和互斥鎖 訊號量又稱為訊號燈,它是用來協調不同程序間的資料物件的,而最主要的應用是共享記憶體方式的程序間通訊。本質上,訊號量是一個計數器,它用來記錄對某個資源(如共享記憶體)的存取狀況 互斥體禁止多個執行緒同時進入受保護的程式碼“臨界區”(critical section)。因此,在任意時刻,只有一個執行緒被允許進入這樣的程式碼保護區。 對於互斥鎖,如果資源已經被佔用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖,"自旋"一詞就是因此而得名。 7.問了問專案,讓畫一下其中一個專案的系統架構圖,和其中一個功能的流程圖。 ——————————————————————————-—————————— 二面: 輸入字元流,找第一個重複的字串。 1、Linux下的一些指令,$$(程序id),$?(上一條命令退出時狀態),怎麼檢視程序,按照記憶體大小,CPU佔用排序等等。 (大寫M和大寫P) 2、專案中遇到的問題,自己咋解決的等等。 多資料庫,使用Mybatis的攔截器。 3、介紹一下hash,怎麼解決衝突。(鏈地址法) 4、程序間的通訊,共享記憶體方式的優缺點。 環境變數/檔案描述符:子程序接受父程序環境資料的拷貝以及所有檔案描述符。 管道:用於相關和無關程序間的通訊,而且形成兩個程序間的一個通訊通道,通常使用檔案讀寫程式訪問。 共享記憶體:使用客戶機/伺服器模型(C/S),伺服器對客戶的資料或動作請求作出反應。 動態資料交換:動態資料交換使用訊息傳遞、共享記憶體、事務協議、客戶/伺服器範疇、同步規則以及會話協議來讓資料和控制資訊在程序間流動。動態資料交換對話( dynamic data exchange session, DDE )的基本模型是客戶、伺服器。伺服器對來自客戶的資料或動作作出反應。客戶和伺服器可以以多種關係來通訊。 共享記憶體針對訊息緩衝的缺點改而利用記憶體緩衝區直接交換資訊,無須複製,快捷、資訊量大是其優點。但是共享記憶體的通訊方式是通過將共享的記憶體緩衝區直接附加到程序的虛擬地址空間中來實現的.因此,這些程序之間的讀寫操作的同步問題作業系統無法實現。必須由各程序利用其他同步工具解決。另外,由於記憶體實體存在於計算機系統中.所以只能由處於同一個計算機系統中的諸程序共享,不方便網路通訊 共享記憶體塊提供了在任意數量的程序之間進行高效雙向通訊的機制。每個使用者都可以讀取寫入資料,但是所有程式之間必須達成並遵守一定的協議,以防止諸如在 讀取資訊之前覆寫記憶體空間等競爭狀態的出現。不幸的是,Linux無法嚴格保證提供對共享記憶體塊的獨佔訪問,甚至是在您通過使用IPC_PRIVATE創 建新的共享記憶體塊的時候也不能保證訪問的獨佔性。 同時,多個使用共享記憶體塊的程序之間必須協調使用同一個鍵值。 5.講下堆的作用。 6.堆的垃圾回收物件選擇原則。 所謂根集就量正在執行的Java程式可以訪問的引用變數的集合(包括區域性變數、引數、類變數),程式可以使用引用變數訪問物件的屬性和呼叫物件的方法。垃 圾收集首選需要確定從根開始哪些是可達的和哪些是不可達的,從根集可達的物件都是活動物件,它們不能作為垃圾被回收,這也包括從根集間接可達的物件。而根 集通過任意路徑不可達的物件符合垃圾收集的條件,應該被回收。下面介紹幾個常用的演算法。 7 程序間通訊詳細敘述 8 tcp udp 區別  UDP應用場景 UDP一般用於即時通訊(QQ聊天 對資料準確性和丟包要求比較低,但速度必須快),線上視訊(RTSP 速度一定要快,保證視訊連續,但是偶爾花了一個影象幀,人們還是能接受的),網路語音電話(VoIP 語音資料包一般比較小,需要高速傳送,偶爾斷音或串音也沒有問題)等等。 9 linux中檔名儲存在哪裡? 改變檔名之後 MD5會不會變 只有兩項資料存放在目錄項中:檔名和i節點編號。不會的,只有檔案內容發生改變MD5才會變化。一般對檔案求MD5值只取檔案內容部分,像檔名、儲存目錄、建立時間、修改時間、許可權等等的元資訊都是不進行計算的。 7 linux命令相關 問用過哪些 然後展開 9 crontab 怎麼設定一個每小時、每3小時的定時任務 6. 求一個struct的大小 7.Linux命令相關,問有一個檔案A.txt,裡面有許多行,找出其中帶關鍵字'B'的行,並統計重複度。我問了下重複度是指啥,他說,這樣吧,假設每一行都是由空格分隔開的若干字元,若整個檔案中,有2行的最後一個字元都是'10',你就輸出  “10” : 2。 8.假如在伺服器上執行一個程序時,你發現伺服器很卡頓,你會怎麼查詢原因。 9.time_wait 是TCP四次握手哪個階段的狀態,為什麼要有這個狀態。這個狀態帶來的好處和壞處是什麼。在網路中,什麼與這個狀態相似