1.關鍵字transient 1)一旦變數被transient修飾,變數將不再是對象持久化的一部分,該變數內容在序列化後無法獲得訪問。 2)transient關鍵字只能修飾變數,而不能修飾方法和類。註意,本地變數是不能被transient關鍵字修飾的。變數如果是用戶自定義類變數,則該類需要實現Ser ...
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四次握手哪個階段的狀態,為什麼要有這個狀態。這個狀態帶來的好處和壞處是什麼。在網路中,什麼與這個狀態相似
最後這裡小編整理了一套讓面試不慌張的面試資料