版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、1 什么情況下會觸發(fā)Minor GC?Minor GC 發(fā)生在新生代的垃圾收集動作,當Eden區(qū)和survivor區(qū)內(nèi)存不夠的時候回產(chǎn)生minor gc,當出現(xiàn)Major或者是Full GC的時候往往伴隨著Minor GC的產(chǎn)生。java線程之間的通信JVM如何加載一個類的過程,雙親委派模型中有哪些方法?類加載的全過程是 :1. 加載加載時類加載中的一個階段:包含以下三個部分通過一個類的全限定名來獲取定義此類的二進制字節(jié)流強這個字節(jié)流所代表的靜態(tài)存儲結構轉化為方法區(qū)的運行時數(shù)據(jù)結構在內(nèi)存中生成一個代表這個列的java.lang.Class對象,作為方法去這個類的各種數(shù)據(jù)的訪問入口2. 驗證驗證
2、是連接的第一步,這一階段的目的是為了確保Class文件的字節(jié)流總包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全,這個階段是否嚴謹,決定了java虛擬機是否能夠承受惡意代碼的攻擊3. 準備準備階段是正式為類變量分配內(nèi)存并設置類變量初始值的階段,這些變量所使用的內(nèi)存豆?jié){在方法區(qū)中進行分配,不包括實例變量,所有初始化都是0即使是為靜態(tài)變量指定了值,在這個階段也是04. 解析解析是虛擬機將常量池內(nèi)的符號引用替換為直接引用的過程5. 初始化初始化時類加載過程的最后一步,(3)HashMap如何實現(xiàn)的?如何實現(xiàn)線程安全的hashmapMap m = Collections.synchroni
3、zedMap(new HashMap();可以實現(xiàn)線程安全的hashmap(4)HashMap和Concurrent HashMap區(qū)別, Concurrent HashMap 線程安全嗎, Concurrent HashMap如何保證 線程安全?(5)HashMap和HashTable 區(qū)別,HashTable線程安全嗎?第一個不同主要是歷史原因。Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現(xiàn)。 也許最重要的不同是Hashtable的方法是同步的
4、,而HashMap的方法不是。這就意味著,雖然你可以不用采取任何特殊的行為就可以在一個多線程的應用程序中用一個Hashtable,但你必須同樣地為一個HashMap提供外同步。一個方便的方法就是利用Collections類的靜態(tài)的synchronizedMap()方法,它創(chuàng)建一個線程安全的Map對象,并把它作為一個封裝的對象來返回。這個對象的方法可以讓你同步訪問潛在的HashMap。這么做的結果就是當你不需要同步時,你不能切斷Hashtable中的同步(比如在一個單線程的應用程序中),而且同步增加了很多處理費用。 第三點不同是,只有HashMap可以讓你將空值作為一個表的條目的key或valu
5、e。HashMap中只有一條記錄可以是一個空的key,但任意數(shù)量的條目可以是空的value。這就是說,如果在表中沒有發(fā)現(xiàn)搜索鍵,或者如果發(fā)現(xiàn)了搜索鍵,但它是一個空的值,那么get()將返回null。如果有必要,用containKey()方法來區(qū)別這兩種情況。(6)進程間通信有哪幾種方式?· 管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。· 命名管道 (named pipe) : 命名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。· 信號量( semophor
6、e ) : 信號量是一個計數(shù)器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內(nèi)不同線程之間的同步手段。· 消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內(nèi)核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。· 信號 ( sinal ) : 信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經(jīng)發(fā)生。· 共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進
7、程所訪問的內(nèi)存,這段共享內(nèi)存由一個進程創(chuàng)建,但多個進程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現(xiàn)進程間的同步和通信。· 套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同及其間的進程通信。(7)JVM分為哪些區(qū),每一個區(qū)干嗎的?1、程序計數(shù)器(Program Counter Register)這是一塊比較小的內(nèi)存,不在Ram上,而是直接劃分在CPU上的,程序員無法直接操作它,它的作用是:JVM在解釋字節(jié)碼文件(.class)時,存儲當前線
8、程所執(zhí)行的字節(jié)碼的行號,只是一種概念模型,各種JVM所采用的方式不同,字節(jié)碼解釋器工作時,就是通過改變程序計數(shù)器的值來選取下一條要執(zhí)行的指令,分支、循環(huán)、跳轉、等基礎功能都是依賴此技術區(qū)完成的。還有一種情況,就是我們常說的Java多線程方面的,多線程就是通過現(xiàn)程輪流切換而達到的,同一時刻,一個內(nèi)核只能執(zhí)行一個指令,所以,對于每一個程序來說,必須有一個計數(shù)器來記錄程序的執(zhí)行進度,這樣,當現(xiàn)程恢復執(zhí)行的時候,才能從正確的地方開始,所以,每個線程都必須有一個獨立的程序計數(shù)器,這類計數(shù)器為線程私有的內(nèi)存。如果一個線程正在執(zhí)行一個Java方法,則計數(shù)器記錄的是字節(jié)碼的指令的地址,如果執(zhí)行的一個Nativ
9、e方法,則計數(shù)器的記錄為空,此內(nèi)存區(qū)是唯一一個在Java規(guī)范中沒有任何OutOfMemoryError情況的區(qū)域。2、JVM虛擬機棧(JVM Stacks)JVM虛擬機棧就是我們常說的堆棧的棧(我們常常把內(nèi)存粗略分為堆和棧),和程序計數(shù)器一樣,也是線程私有的,生命周期和線程一樣,每個方法被執(zhí)行的時候會產(chǎn)生一個棧幀,用于存儲局部變量表、動態(tài)鏈接、操作數(shù)、方法出口等信息。方法的執(zhí)行過程就是棧幀在JVM中出棧和入棧的過程。局部變量表中存放的是各種基本數(shù)據(jù)類型,如boolean、byte、char、等8種,及引用類型(存放的是指向各個對象的內(nèi)存地址),因此,它有一個特點:內(nèi)存空間可以在編譯期間就確定,
10、運行期不在改變。這個內(nèi)存區(qū)域會有兩種可能的Java異常:StackOverFlowError和OutOfMemoryError。3、本地方法棧(Native Method Stacks)從名字即可看出,本地方法棧就是用來處理Java中的本地方法的,Java類的祖先類Object中有眾多Native方法,如hashCode()、wait()等,他們的執(zhí)行很多時候是借助于操作系統(tǒng),但是JVM需要對他們做一些規(guī)范,來處理他們的執(zhí)行過程。此區(qū)域,可以有不同的實現(xiàn)方法,向我們常用的Sun的JVM就是本地方法棧和JVM虛擬機棧是同一個。4、堆(Heap)堆內(nèi)存是內(nèi)存中最重要的一塊,也是最有必要進行深究的一
11、部分。因為Java性能的優(yōu)化,主要就是針對這部分內(nèi)存的。所有的對象實例及數(shù)組都是在堆上面分配的(隨著JIT技術的逐漸成熟,這句話視乎有些絕對,不過至少目前還基本是這樣的),可通過-Xmx和-Xms來控制堆的大小。JIT技術的發(fā)展產(chǎn)生了新的技術,如棧上分配和標量替換,也許在不久的幾年里,即時編譯會誕生及成熟,那個時候,“所有的對象實例及數(shù)組都是在堆上面分配的”這句話就應該稍微改改了。堆內(nèi)存是垃圾回收的主要區(qū)域,所以在下文垃圾回收板塊會重點介紹,此處只做概念方面的解釋。在32位系統(tǒng)上最大為2G,64位系統(tǒng)上無限制??赏ㄟ^-Xms和-Xmx控制,-Xms為JVM啟動時申請的最小Heap內(nèi)存,-Xmx
12、為JVM可申請的最大Heap內(nèi)存。5、方法區(qū)(Method Area) 方法區(qū)是所有線程共享的內(nèi)存區(qū)域,用于存儲已經(jīng)被JVM加載的類信息、常量、靜態(tài)變量等數(shù)據(jù),一般來說,方法區(qū)屬于持久代(關于持久代,會在GC部分詳細介紹,除了持久代,還有新生代和舊生代),也難怪Java規(guī)范將方法區(qū)描述為堆的一個邏輯部分,但是它不是堆。方法區(qū)的垃圾回收比較棘手,就算是Sun的HotSpot VM在這方面也沒有做得多么完美。此處引入方法區(qū)中一個重要的概念:運行時常量池。主要用于存放在編譯過程中產(chǎn)生的字面量(字面量簡單理解就是常量)和引用。一般情況,常量的內(nèi)存分配在編譯期間就能確定,但不一定全是,有一些可
13、能就是運行時也可將常量放入常量池中,如String類中有個Native方法intern()<關于intern()的詳細說明,請看另一篇文章:此處補充一個在JVM內(nèi)存管理之外的一個內(nèi)存區(qū):直接內(nèi)存。在JDK1.4中新加入類NIO類,引入了一種基于通道與緩沖區(qū)的I/O方式,它可以使用Native函數(shù)庫直接分配堆外內(nèi)存,即我們所說的直接內(nèi)存,這樣在某些場景中會提高程序的性能。(8)JVM如何GC,新生代,老年代,持久代,都存儲哪些東西?(9)GC用的引用可達性分析算法中,哪些對象可作為GC Roots對象?(10)快速排序,過程,復雜度?(11)什么是二叉平衡樹,如何插入節(jié)點,刪除節(jié)點,說出關
14、鍵步驟。(12)TCP如何保證可靠傳輸?三次握手過程?通過設置滑動窗口實現(xiàn)可靠傳輸?shù)?,發(fā)送方的窗口由接收方的緩存決定(13)TCP和UDP區(qū)別?TCP通信之前需要先建立連接,提供的是可靠的通信服務,同時tcp只能支持一對一的通信,只能進行單播,有擁塞控制,開銷較大UDP 通信不需要實現(xiàn)建立連接,提供的是盡最大努力的交付時不可靠的,支持一對一,一對多,多對一,多對多的通信方式,開銷較小,UDP沒有擁塞控制UDP是面向報文的,對應用層交下來多長的數(shù)據(jù)既不拆分也不合并,只是添加首部后交給ip層注意:tcp連接的端點是套接字(14)滑動窗口算法?(15)Linux下如何進行進程調(diào)度的?linux內(nèi)核的
15、三種調(diào)度方法:1,SCHED_OTHER 分時調(diào)度策略,2,SCHED_FIFO實時調(diào)度策略,先到先服務3,SCHED_RR實時調(diào)度策略,時間片輪轉linux內(nèi)核的三種調(diào)度方法:1,SCHED_OTHER 分時調(diào)度策略,2,SCHED_FIFO實時調(diào)度策略,先到先服務3,SCHED_RR實時調(diào)度策略,時間片輪轉實時進程將得到優(yōu)先調(diào)用,實時進程根據(jù)實時優(yōu)先級決定調(diào)度權值,分時進程則通過nice和counter值決定權值,nice越小,counter越大,被調(diào)度的概率越大,也就是曾經(jīng)使用了cpu最少的進程將會得到優(yōu)先調(diào)度。SHCED_RR和SCHED_FIFO的不同:當采用SHCED_RR策略的進
16、程的時間片用完,系統(tǒng)將重新分配時間片,并置于就緒隊列尾。放在隊列尾保證了所有具有相同優(yōu)先級的RR任務的調(diào)度公平。SCHED_FIFO一旦占用cpu則一直運行。一直運行直到有更高優(yōu)先級任務到達或自己放棄。如果有相同優(yōu)先級的實時進程(根據(jù)優(yōu)先級計算的調(diào)度權值是一樣的)已經(jīng)準備好,F(xiàn)IFO時必須等待該進程主動放棄后才可以運行這個優(yōu)先級相同的任務。而RR可以讓每個任務都執(zhí)行一段時間。相同點:RR和FIFO都只用于實時任務。創(chuàng)建時優(yōu)先級大于0(1-99)。按照可搶占優(yōu)先級調(diào)度算法進行。就緒態(tài)的實時任務立即搶占非實時任務。所有任務都采用linux分時調(diào)度策略時。1,創(chuàng)建任務指定采用分時調(diào)度策略,并指定優(yōu)先
17、級nice值(-2019)。2,將根據(jù)每個任務的nice值確定在cpu上的執(zhí)行時間(counter)。3,如果沒有等待資源,則將該任務加入到就緒隊列中。4,調(diào)度程序遍歷就緒隊列中的任務,通過對每個任務動態(tài)優(yōu)先級的計算(counter+20-nice)結果,選擇計算結果最大的一個去運行,當這個時間片用完后(counter減至0)或者主動放棄cpu時,該任務將被放在就緒隊列末尾(時間片用完)或等待隊列(因等待資源而放棄cpu)中。5,此時調(diào)度程序重復上面計算過程,轉到第4步。6,當調(diào)度程序發(fā)現(xiàn)所有就緒任務計算所得的權值都為不大于0時,重復第2步。所有任務都采用FIFO時,1,創(chuàng)建進程時指定采用FI
18、FO,并設置實時優(yōu)先級rt_priority(1-99)。2,如果沒有等待資源,則將該任務加入到就緒隊列中。3,調(diào)度程序遍歷就緒隊列,根據(jù)實時優(yōu)先級計算調(diào)度權值(1000+rt_priority),選擇權值最高的任務使用cpu,該FIFO任務將一直占有cpu直到有優(yōu)先級更高的任務就緒(即使優(yōu)先級相同也不行)或者主動放棄(等待資源)。4,調(diào)度程序發(fā)現(xiàn)有優(yōu)先級更高的任務到達(高優(yōu)先級任務可能被中斷或定時器任務喚醒,再或被當前運行的任務喚醒,等等),則調(diào)度程序立即在當前任務堆棧中保存當前cpu寄存器的所有數(shù)據(jù),重新從高優(yōu)先級任務的堆棧中加載寄存器數(shù)據(jù)到cpu,此時高優(yōu)先級的任務開始運行。重復第3步。
19、5,如果當前任務因等待資源而主動放棄cpu使用權,則該任務將從就緒隊列中刪除,加入等待隊列,此時重復第3步。所有任務都采用RR調(diào)度策略時1,創(chuàng)建任務時指定調(diào)度參數(shù)為RR,并設置任務的實時優(yōu)先級和nice值(nice值將會轉換為該任務的時間片的長度)。2,如果沒有等待資源,則將該任務加入到就緒隊列中。3,調(diào)度程序遍歷就緒隊列,根據(jù)實時優(yōu)先級計算調(diào)度權值(1000+rt_priority),選擇權值最高的任務使用cpu。4,如果就緒隊列中的RR任務時間片為0,則會根據(jù)nice值設置該任務的時間片,同時將該任務放入就緒隊列的末尾。重復步驟3。5,當前任務由于等待資源而主動退出cpu,則其加入等待隊列
20、中。重復步驟3。系統(tǒng)中既有分時調(diào)度,又有時間片輪轉調(diào)度和先進先出調(diào)度1,RR調(diào)度和FIFO調(diào)度的進程屬于實時進程,以分時調(diào)度的進程是非實時進程。2,當實時進程準備就緒后,如果當前cpu正在運行非實時進程,則實時進程立即搶占非實時進程。3,RR進程和FIFO進程都采用實時優(yōu)先級做為調(diào)度的權值標準,RR是FIFO的一個延伸。FIFO時,如果兩個進程的優(yōu)先級一樣,則這兩個優(yōu)先級一樣的進程具體執(zhí)行哪一個是由其在隊列中的未知決定的,這樣導致一些不公正性(優(yōu)先級是一樣的,為什么要讓你一直運行?),如果將兩個優(yōu)先級一樣的任務的調(diào)度策略都設為RR,則保證了這兩個任務可以循環(huán)執(zhí)行,保證了公平。(16)Linux
21、下你常用的命令有哪些?Cd ls shutdown mkdir rm reboot(17)操作系統(tǒng)什么情況下會死鎖?死鎖的一個因素是由于進程競爭系統(tǒng)中的資源,而進程對資源的總需求量超過系統(tǒng)提供的最大資源數(shù),或者進程的推進順序不當也會導致死鎖(18)常用的hash算法有哪些?MD5 SHA-1(19)什么是一致性哈希?一致性哈希提出了在動態(tài)變化的Cache環(huán)境中,哈希算法應該滿足的4個適應條件:折疊平衡性(Balance)平衡性是指哈希的結果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。很多哈希算法都能夠滿足這一條件。折疊單調(diào)性(Monotonicity)單調(diào)性是指如果已
22、經(jīng)有一些內(nèi)容通過哈希分派到了相應的緩沖中,又有新的緩沖區(qū)加入到系統(tǒng)中,那么哈希的結果應能夠保證原有已分配的內(nèi)容可以被映射到新的緩沖區(qū)中去,而不會被映射到舊的緩沖集合中的其他緩沖區(qū)。(這段翻譯信息有負面價值的,當緩沖區(qū)大小變化時一致性哈希(Consistent hashing)盡量保護已分配的內(nèi)容不會被重新映射到新緩沖區(qū)。)簡單的哈希算法往往不能滿足單調(diào)性的要求,如最簡單的線性哈希:x ax + b mod (P)在上式中,P表示全部緩沖的大小。不難看出,當緩沖大小發(fā)生變化時(從P1到P2),原來所有的哈希結果均會發(fā)生變化,從而不滿足單調(diào)性的要求。哈希結果的變化意味著當緩沖空間發(fā)生變化時,所有的
23、映射關系需要在系統(tǒng)內(nèi)全部更新。而在P2P系統(tǒng)內(nèi),緩沖的變化等價于Peer加入或退出系統(tǒng),這一情況在P2P系統(tǒng)中會頻繁發(fā)生,因此會帶來極大計算和傳輸負荷。單調(diào)性就是要求哈希算法能夠應對這種情況。折疊分散性(Spread)在分布式環(huán)境中,終端有可能看不到所有的緩沖,而是只能看到其中的一部分。當終端希望通過哈希過程將內(nèi)容映射到緩沖上時,由于不同終端所見的緩沖范圍有可能不同,從而導致哈希的結果不一致,最終的結果是相同的內(nèi)容被不同的終端映射到不同的緩沖區(qū)中。這種情況顯然是應該避免的,因為它導致相同內(nèi)容被存儲到不同緩沖中去,降低了系統(tǒng)存儲的效率。分散性的定義就是上述情況發(fā)生的嚴重程度。好的哈希算法應能夠盡
24、量避免不一致的情況發(fā)生,也就是盡量降低分散性。折疊負載(Load)負載問題實際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內(nèi)容映射到不同的緩沖區(qū)中,那么對于一個特定的緩沖區(qū)而言,也可能被不同的用戶映射為不同的內(nèi)容。與分散性一樣,這種情況也是應當避免的,因此好的哈希算法應能夠盡量降低緩沖的負荷。從表面上看,一致性哈希針對的是分布式緩沖的問題,但是如果將緩沖看作P2P系統(tǒng)中的Peer,將映射的內(nèi)容看作各種共享的資源(數(shù)據(jù),文件,媒體流等),就會發(fā)現(xiàn)兩者實際上是在描述同一問題。路由算法在一致性哈希算法中,每個節(jié)點(對應P2P系統(tǒng)中的Peer)都有隨機分配的ID。在將內(nèi)容映射到節(jié)點時,使
25、用內(nèi)容的關鍵字和節(jié)點的ID進行一致性哈希運算并獲得鍵值。一致性哈希要求鍵值和節(jié)點ID處于同一值域。最簡單的鍵值和ID可以是一維的,比如從0000到9999的整數(shù)集合。根據(jù)鍵值存儲內(nèi)容時,內(nèi)容將被存儲到具有與其鍵值最接近的ID的節(jié)點上。例如鍵值為1001的內(nèi)容,系統(tǒng)中有ID為1000,1010,1100的節(jié)點,該內(nèi)容將被映射到1000節(jié)點。為了構建查詢所需的路由,一致性哈希要求每個節(jié)點存儲其上行節(jié)點(ID值大于自身的節(jié)點中最小的)和下行節(jié)點(ID值小于自身的節(jié)點中最大的)的位置信息(IP地址)。當節(jié)點需要查找內(nèi)容時,就可以根據(jù)內(nèi)容的鍵值決定向上行或下行節(jié)點發(fā)起查詢請求。收到查詢請求的節(jié)點如果發(fā)現(xiàn)
26、自己擁有被請求的目標,可以直接向發(fā)起查詢請求的節(jié)點返回確認;如果發(fā)現(xiàn)不屬于自身的范圍,可以轉發(fā)請求到自己的上行/下行節(jié)點。為了維護上述路由信息,在節(jié)點加入/退出系統(tǒng)時,相鄰的節(jié)點必須及時更新路由信息。這就要求節(jié)點不僅存儲直接相連的下行節(jié)點位置信息,還要知道一定深度(n跳)的間接下行節(jié)點信息,并且動態(tài)地維護節(jié)點列表。當節(jié)點退出系統(tǒng)時,它的上行節(jié)點將嘗試直接連接到最近的下行節(jié)點,連接成功后,從新的下行節(jié)點獲得下行節(jié)點列表并更新自身的節(jié)點列表。同樣的,當新的節(jié)點加入到系統(tǒng)中時,首先根據(jù)自身的ID找到下行節(jié)點并獲得下行節(jié)點列表,然后要求上行節(jié)點修改其下行節(jié)點列表,這樣就恢復了路由關系。(20)如何理解
27、分布式鎖?分布式鎖是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式。在分布式系統(tǒng)中,常常需要協(xié)調(diào)他們的動作。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥來防止彼此干擾來保證一致性,在這種情況下,便需要使用到分布式鎖。在分布式系統(tǒng)中,常常需要協(xié)調(diào)他們的動作。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥來防止彼此干擾來保證一致性,這個時候,便需要使用到分布式鎖。1 (21)數(shù)據(jù)庫中的范式有哪些?第一范式(1NF)所謂第一范式(1NF)是指在關系模型中,對域添加的一個規(guī)范要求,所有
28、的域都應該是原子性的,即數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項,而不能是集合,數(shù)組,記錄等非原子數(shù)據(jù)項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一范式(1NF)表中的每個域值只能是實體的一個屬性或一個屬性的一部分。簡而言之,第一范式就是無重復的域。說明:在任何一個關系數(shù)據(jù)庫中,第一范式(1NF)是對關系模式的設計基本要求,一般設計中都必須滿足第一范式(1NF)。不過有些關系模型中突破了1NF的限制,這種稱為非1NF的關系模型。換句話說,是否必須滿足1NF的最低要求,主要依賴于所使用的關系模型。第二范式(2NF)在1NF的基礎上,非碼屬性必須完全依賴于候選碼(在1NF基礎上
29、消除非主屬性對主碼的部分函數(shù)依賴)第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫表中的每個實例或記錄必須可以被唯一地區(qū)分。選取一個能區(qū)分每個實體的屬性或?qū)傩越M,作為實體的唯一標識。例如在員工表中的身份證號碼即可實現(xiàn)每個一員工的區(qū)分,該身份證號碼即為候選鍵,任何一個候選鍵都可以被選作主鍵。在找不到候選鍵時,可額外增加屬性以實現(xiàn)區(qū)分,如果在員工關系中,沒有對其身份證號進行存儲,而姓名可能會在數(shù)據(jù)庫運行的某個時間重復,無法區(qū)分出實體時,設計辟如ID等不重復的編號以實現(xiàn)區(qū)分,被添加的編號或ID選作主鍵。(該
30、主鍵的添加是在ER設計時添加,不是建庫時隨意添加)第二范式(2NF)要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二范式就是在第一范式的基礎上屬性完全依賴于主鍵。第三范式(3NF)在1NF基礎上,任何非主屬性不依賴于其它非主屬性(在2NF基礎上消除傳遞依賴)第三范式(3NF)是第二范式(2NF)的一個子集,即滿足第三范式(3NF)必須滿足第二范式(2NF)。簡而言之,第三范式(3
31、NF)要求一個關系中不包含已在其它關系已包含的非主關鍵字信息。例如,存在一個部門信息表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關的信息再加入員工信息表中。如果不存在部門信息表,則根據(jù)第三范式(3NF)也應該構建它,否則就會有大量的數(shù)據(jù)冗余。簡而言之,第三范式就是屬性不依賴于其它非主屬性,也就是在滿足2NF的基礎上,任何非主屬性不得傳遞依賴于主屬性。巴斯-科德范式(BCNF)Boyce-Codd Normal Form(巴斯-科德范式)在1NF基礎上,任何非主屬性不能對主鍵子集依賴(在3NF基礎上
32、消除對主碼子集的依賴)巴斯-科德范式(BCNF)是第三范式(3NF)的一個子集,即滿足巴斯-科德范式(BCNF)必須滿足第三范式(3NF)。通常情況下,巴斯-科德范式被認為沒有新的設計規(guī)范加入,只是對第二范式與第三范式中設計規(guī)范要求更強,因而被認為是修正第三范式,也就是說,它事實上是對第三范式的修正,使數(shù)據(jù)庫冗余度更小。這也是BCNF不被稱為第四范式的原因。某些書上,根據(jù)范式要求的遞增性將其稱之為第四范式是不規(guī)范,也是更讓人不容易理解的地方。而真正的第四范式,則是在設計規(guī)范中添加了對多值及依賴的要求。對于BCNF,在主碼的任何一個真子集都不能決定于主屬性。關系中U主碼,若U中的任何一個真子集X
33、都不能決定于主屬性Y,則該設計規(guī)范屬性BCNF。例如:在關系R中,U為主碼,A屬性是主碼中的一個屬性,若存在A->Y,Y為主屬性,則該關系不屬于BCNF。一般關系型數(shù)據(jù)庫設計中,達到BCNF就可以了?。?2)數(shù)據(jù)庫中的索引的結構?什么情況下適合建索引?索引的實現(xiàn)通常使用B樹及其變種B+樹。需要進行高質(zhì)量的查詢或者加快查詢速度的時候(24)用什么工具調(diào)試程序?JConsole,用過嗎?JConsole是一個基于JMX的GUI工具,用于連接正在運行的JVM,不過此JVM需要使用可管理的模式啟動就是某段代碼申請的某一塊內(nèi)存一直都得不到釋放,而這段代碼又不斷在申請內(nèi)存空間,使得機器內(nèi)存一直被消耗
34、。解決方法需要看你具體遇到的情況,如果是你的代碼有問題,可以通過Jconsole等工具去查看(25)現(xiàn)在JVM中有一個線程掛起了,如何用工具查出原因?jstack(查看線程)、jmap(查看內(nèi)存)和jstat(性能分析)命令(26)線程同步與阻塞的關系?同步一定阻塞嗎?阻塞一定同步嗎?· 阻塞狀態(tài)是指正在執(zhí)行的進程由于發(fā)生某事情而暫時無法繼續(xù)執(zhí)行時,便放棄處理機而處于暫停狀態(tài)。· 進程同步:對多個相關進程在執(zhí)行次序上進行協(xié)調(diào),以使并發(fā)執(zhí)行的進程之間能有效共享資源和互相合作,從而使程序的執(zhí)行具有可再現(xiàn)性(27)同步和異步有什么區(qū)別?同步就是指一個線程要等待上一個線程執(zhí)行完之后
35、才開始執(zhí)行當前的線程異步是指一個線程去執(zhí)行,它的下一個線程不必等待它執(zhí)行完就開始執(zhí)行(28)線程池用過嗎? 在java中,如果每個請求到達就創(chuàng)建一個新線程,開銷是相當大的。在實際使用中,服務器在創(chuàng)建和銷毀線程上花費的時間和消耗的系統(tǒng)資源都相當大,甚至可能要比在處理實際的用戶請求的時間和資源要多的多。除了創(chuàng)建和銷毀線程的開銷之外,活動的線程也需要消耗系統(tǒng)資源。如果在一個jvm里創(chuàng)建太多的線程,可能會使系統(tǒng)由于過度消耗內(nèi)存或“切換過度”而導致系統(tǒng)資源不足。為了防止資源不足,服務器應用程序需要采取一些辦法來限制任何給定時刻處理的請求數(shù)目,盡可能減少創(chuàng)建和銷毀線程的次數(shù),特別是一些資源耗費
36、比較大的線程的創(chuàng)建和銷毀,盡量利用已有對象來進行服務,這就是“池化資源”技術產(chǎn)生的原因。 線程池主要用來解決線程生命周期開銷問題和資源不足問題。通過對多個任務重復使用線程,線程創(chuàng)建的開銷就被分攤到了多個任務上了,而且由于在請求到達時線程已經(jīng)存在,所以消除了線程創(chuàng)建所帶來的延遲。這樣,就可以立即為請求服務,使用應用程序響應更快。另外,通過適當?shù)恼{(diào)整線程中的線程數(shù)目可以防止出現(xiàn)資源不足的情況。2.線程池的組成部分 一個比較簡單的線程池至少應包含線程池管理器、工作線程、任務列隊、任務接口等部分。其中線程池管理器的作用
37、是創(chuàng)建、銷毀并管理線程池,將工作線程放入線程池中;工作線程是一個可以循環(huán)執(zhí)行任務的線程,在沒有任務是進行等待;任務列隊的作用是提供一種緩沖機制,將沒有處理的任務放在任務列隊中;任務接口是每個任務必須實現(xiàn)的接口,主要用來規(guī)定任務的入口、任務執(zhí)行完后的收尾工作、任務的執(zhí)行狀態(tài)等,工作線程通過該接口調(diào)度任務的執(zhí)行。 線程池管理器至少有下列功能:創(chuàng)建線程池,銷毀線程池,添加新任務。 3.線程池適合應用的場合 當一個服
38、務器接受到大量短小線程的請求時,使用線程池技術是非常合適的,它可以大大減少線程的創(chuàng)建和銷毀次數(shù),提高服務器的工作效率。但是線程要求的運動時間比較長,即線程的運行時間比(29)如何創(chuàng)建單例模式?說了雙重檢查,他說不是線程安全的。如何高效的創(chuàng)建一個線程安全的單例?(30)concurrent包下面,都用過什么?(31)常用的數(shù)據(jù)庫有哪些?redis用過嗎?(33)你知道的開源協(xié)議有哪些?BSD 開源協(xié)議( original BSD license 、 FreeBSD license 、 Original BSD license )
39、0; BSD 開源協(xié)議是一個給于使用者很大自由的協(xié)議?;旧鲜褂谜呖梢浴?為所欲為”, 可以自由的使用,修改源代碼,也可以將修改后的代碼作為開源或者專有軟件再發(fā)布。但” 為所欲為” 的前提當你發(fā)布使用了BSD 協(xié)議的代碼,或則以BSD 協(xié)議代碼為基礎做二次開發(fā)自己的產(chǎn)品時,需要滿足三個條件:1. 如果再發(fā)布的產(chǎn)品中包含源代碼,則在源代碼中必須帶有原來代碼中的BSD 協(xié)議。2. 如果再發(fā)布的只是二進制類庫/ 軟件,則需要在類庫/ 軟件的文檔和版權聲明中包含原來代碼中的BSD 協(xié)議。3. 不可以用開源代碼的作者/ 機構名字和原來產(chǎn)品的名字做市場推廣。 &
40、#160; BSD 代碼鼓勵代碼共享,但需要尊重代碼作者的著作權。BSD 由于允許使用者修改和重新發(fā)布代碼,也允許使用或在BSD 代碼上開發(fā)商業(yè)軟件發(fā)布和銷售,因此是對 商業(yè)集成很友好的協(xié)議。而很多的公司企業(yè)在選用開源產(chǎn)品的時候都首選BSD 協(xié)議,因為可以完全控制這些第三方的代碼,在必要的時候可以修改或者二次開發(fā)。Apache Licence 2.0 ( Apache License, Version 2.0 、Apache License, Version 1.1 、Apache License, Version 1.0 )
41、60; Apache Licence 是著名的非盈利開源組織Apache 采用的協(xié)議。該協(xié)議和BSD 類似,同樣鼓勵代碼共享和尊重原作者的著作權,同樣允許代碼修改,再發(fā)布(作為開源或商業(yè)軟件)。需要滿足的條件也和BSD 類似:1. 需要給代碼的用戶一份Apache Licence2. 如果你修改了代碼,需要再被修改的文件中說明。3. 在延伸的代碼中(修改和有源代碼衍生的代碼中)需要帶有原來代碼中的協(xié)議,商標,專利聲明和其他原來作者規(guī)定需要包含的說明。4. 如果再發(fā)布的產(chǎn)品中包含一個Notice 文件,則在Notice 文件中需要帶有Apache Licence
42、 。你可以在Notice 中增加自己的許可,但不可以表現(xiàn)為對Apache Licence 構成更改。Apache Licence 也是對商業(yè)應用友好的許可。使用者也可以在需要的時候修改代碼來滿足需要并作為開源或商業(yè)產(chǎn)品發(fā)布/ 銷售。GPL ( GNU General Public License ) 我們很熟悉的Linux 就是采用了GPL 。GPL 協(xié)議和BSD, Apache Licence 等鼓勵代碼重用的許可很不一樣。GPL 的出發(fā)點是代碼的開源/ 免費使用和引用/ 修改/ 衍生代碼的開源/ 免費使用,但不允許修改后和衍
43、生的代 碼做為閉源的商業(yè)軟件發(fā)布和銷售。這也就是為什么我們能用免費的各種linux ,包括商業(yè)公司的linux 和linux 上各種各樣的由個人,組織,以及商業(yè)軟件公司開發(fā)的免費軟件了。 GPL 協(xié)議的主要內(nèi)容是只要在一個軟件中使用(” 使用” 指類庫引用,修改后的代碼或者衍生代碼)GPL 協(xié)議的產(chǎn)品,則該軟件產(chǎn)品必須也采用GPL 協(xié)議,既必須也是開源和免費。這就是所謂的” 傳染性” 。GPL 協(xié)議的產(chǎn)品作為一個單獨的產(chǎn)品使用沒有任何問題,還可以享受免費的優(yōu)勢。 由于GPL 嚴格要求使用了GP
44、L 類庫的軟件產(chǎn)品必須使用GPL 協(xié)議,對于使用GPL 協(xié)議的開源代碼,商業(yè)軟件或者對代碼有保密要求的部門就不適合集成/ 采用作為類庫和二次開發(fā)的基礎。其它細節(jié)如再發(fā)布的時候需要伴隨GPL 協(xié)議等和BSD/Apache 等類似。LGPL ( GNU Lesser General Public License ) LGPL 是GPL 的一個為主要為類庫使用設計的開源協(xié)議。和GPL 要求任何使用/ 修改/ 衍生之GPL 類庫的的軟件必須采用GPL 協(xié)議不同。LGPL 允許商業(yè)軟件通過類庫引用(link) 方式使用LGPL 類庫而不需
45、要開源商業(yè)軟件的代碼。這使得采用LGPL 協(xié)議的開源代碼可以被商業(yè)軟件作為類庫引用并 發(fā)布和銷售。 但是如果修改LGPL 協(xié)議的代碼或者衍生,則所有修改的代碼,涉及修改部分的額外代碼和衍生的代碼都必須采用LGPL 協(xié)議。因此LGPL 協(xié)議的開源 代碼很適合作為第三方類庫被商業(yè)軟件引用,但不適合希望以LGPL 協(xié)議代碼為基礎,通過修改和衍生的方式做二次開發(fā)的商業(yè)軟件采用。 GPL/LGPL 都保障原作者的知識產(chǎn)權,避免有人利用開源代碼復制并開發(fā)類似的產(chǎn)品MIT (MIT )
46、; MIT 是和BSD 一樣寬范的許可協(xié)議, 作者只想保留版權, 而無任何其他了限制. 也就是說, 你必須在你的發(fā)行版里包含原許可協(xié)議的聲明, 無論你是以二進制發(fā)布的還是以源代碼發(fā)布的.(34)你知道的開源軟件有哪些?CentOS、 Apache(httpd)、Jboss、Tomcat、Jmeter、Maven、Eclipse、Spring(37)了解哪些設計模式?說說都用過哪些設計模式(38)如何判斷一個單鏈表是否有環(huán)?設置兩個指針,一個每次加一,一個每次加二,若快的和慢的指向同一個地方則有換,若快的遇到null終止則無環(huán)(39)操作系統(tǒng)如何進行分頁調(diào)度?(40)匿名內(nèi)
47、部類是什么?如何訪問在其外面定義的變量?Comparable<T> comparable = new Comparable<T>() Overridepublic int compareTo(T o) return 0;如果定義一個匿名內(nèi)部類,并且希望它使用一個在其外部定的對象,那么編譯器會要求其參數(shù)引用是final的。 1.匿名內(nèi)部類肯定是局部內(nèi)部類(在一個方法里面定義的內(nèi)部類),因為在java中,語句必須寫在方法里,而匿名內(nèi)部類其實就是一條特殊的語句; 2.外部給定的對象就是所有外來的對象:外部方法的形參、局部變量、基本類型或自定義類型等。
48、60;3.內(nèi)部類很微妙,它可以直接訪問外部類的,這打破了類的封裝。但是內(nèi)部類又有它自身的好處,比如簡潔,可見性等,于是就把它定位成“只讀”,也就是。不過這個保護也非常脆弱! 4.local inner class訪問local var時,那個var必須是final的。因為可以通過enclosing class訪問那個local var,也可以通過inner class訪問,可能造成問題,所以就必須是final的 5.匿名內(nèi)部類為什么只能用final.是變量的作用域的問題,因為匿名內(nèi)部類是出現(xiàn)在一個方法的內(nèi)部的,如果它要訪問這個方法的參數(shù)或者方法中定義的變量,則這些參數(shù)和變量
49、必須被修飾為final。因為雖然匿名內(nèi)部類在方法的內(nèi)部,但實際編譯的時候,內(nèi)部類編譯成Outer.Inner,這說明內(nèi)部類所處的位置和外部類中的方法處在同一個等級上,外部類中的方法中的變量或參數(shù)只是方法的局部變量,這些變量或參數(shù)的作用域只在這個方法內(nèi)部有效。因為編譯的時候內(nèi)部類和方法在同一級別上,所以方法中的變量或參數(shù)只有為final,內(nèi)部類才可以引用。 這就是匿名內(nèi)部類1. 接口和抽象類的區(qū)別接口的所有方法都是public 的 接口中方法不能有實體 接口沒有構造函數(shù),接口中的所有類都是final的接口可以多繼承,抽象類不行抽象類中的方法不一定都是public的, 抽象類中可以有實現(xiàn)
50、的方法,抽象類有構造函數(shù),抽象類有普通的成員變量2. final/finally/finalize的區(qū)別final 修飾屬性 方法 類 修飾的屬性值是不能改變的, 方法不能被覆蓋, 類不能被繼承finally 保證程序一定會執(zhí)行的地方,無論程序是否出現(xiàn)異常,都會執(zhí)行的地方,通常用于釋放資源3. 鏈表的反轉可以順序遍歷鏈表 將節(jié)點存入堆棧,再彈出來就可以反轉了,但是耗費內(nèi)存5.海量數(shù)據(jù)的快速查找6.大數(shù)的加法1、問:你把java內(nèi)存模型的架構給我畫一下吧? 我: 遲疑了一下,心想,JMM這玩意兒有架構圖嗎?這可怎么畫。面試官看我遲疑,說,那你不畫,先說一說吧,我就跟他說了由于什么指令重
51、排序,處理器緩存什么的,不同的系統(tǒng)或者平臺有不同的內(nèi)存模型,使得相同的java程序在不同的處理器架構下的表現(xiàn)不一致啊,java內(nèi)存模型就是為了在不同的處理器架構和平臺下給java程序員提供一致性內(nèi)存訪問的保證的。本以為后面要問到volatile的內(nèi)存語義,內(nèi)存屏障,happens-before之類的,沒想到面試官來了一句:你完全說錯了,你說的這個是java的跨平臺特性,不是內(nèi)存模型,然后說內(nèi)存模型是什么什么堆、棧之類的。 于是我就懵了,我就想到了原來面試官理解的內(nèi)存模型就是我理解的java運行時數(shù)據(jù)區(qū)域(程序計數(shù)器,虛擬機棧,本地方法棧、java堆,方法區(qū))。我也不敢跟面試官多爭論,
52、簡單地表達了一下我的觀點,然后他就接著問我,那你說說java是如何實現(xiàn)跨平臺的。 2、問:說一下HashMap是如何實現(xiàn)的吧 我:就先畫了一下結構,再說了一些什么拉鏈法解決沖突,什么JDK8里面沖突達到一定數(shù)量的時候就改用了紅黑樹的存儲等等,然后問我怎么擴容。 3、問:說一下ConcurrentHashMap吧 我:JDK7里面采用的是分段鎖機制什么的,讀的時候不加鎖,寫的時候分段加鎖,先定位到某個段,然后段里面的操作委托給HashMap等等。然后又說JDK8里面 ConcurrentHashMap有很大變化,從1600多行代碼擴充到了6000多行代碼。
53、(還好沒接著問我JDK8里面是怎么實現(xiàn)的,就昨天晚上瞄了一眼,6000多行代碼確實沒看下來) 4、問:用他的電腦給我看了一段程序,問我輸出結果是什么,跟finally塊相關的,考察點就是try塊里面return了某個值,finally里面又對該值進行操作了,問最后的結果是什么,我知道return之前會先執(zhí)行finally塊里面的操作,但是操作的是引用類型還是值類型的情況是不一樣的。本想把那個代碼回憶起來,想想還是算了,應該有人能知道我說的是什么意思。我在回答這道題的時候面試官還“賤賤地“說這道題是有坑的,然后看我踩坑了還很鄙視的說一句:看那么多書連引用類型和值類型都搞不清楚。5、sy
54、nchronized相關的,為什么同步塊太大會影響性能?不同的線程擁有不同的對象鎖,它們之間會有影響嗎?如果synchronized加在靜態(tài)方法上面那么鎖指的是什么?(在這個地方又跟面試官就幾個名詞糾纏了一會兒,我說鎖是Class對象,他問是實例還是對象,他說實例是靜態(tài)的,對象是動態(tài)的,我說Class是靜態(tài)的,對象是動態(tài)的,然后他說我們不說類了,用英文,instance和對象,我說instance我理解的就是對象啊,可能他覺得instance是指類,對象就是new出來的對象,也許是我沒看過英文版的書吧)于是我接著說,指的是對象,是java虛擬機將一個類的字節(jié)碼加載進內(nèi)存之后生成的一個java.
55、lang.Class對象,然后他可能沒聽明白我說的,還是在問,到底是類還是對象,我其實已經(jīng)明白他的意思了,然后說,按照您的描述,那就是類。然后他好像滿意了,就下一題了。(那明明就是一個Class對象嘛,Class對象不也是對象)6、問:基本排序和查找相關的,問我有哪些排序和哪些查找算法,(期待讓我寫個快排什么的,早就憋在心里了,分分鐘搞定的事, 然而并沒有)他讓我描述一下選擇排序的過程,就扯了扯,然后他問,你確定這是選擇排序嗎?我說,我很確定。(強調(diào)了“很”字,說的很堅決,他也沒說什么,希望別又在理解上面跟我有偏差,我說的那個絕對是純正的選擇排序,如假包換)。7、寫代碼,給我5分鐘,
56、讓我實現(xiàn)一個Stack,底層數(shù)據(jù)結構用數(shù)組。我問他需要支持擴容嗎,他說先不用。寫完他拿過去一看,可能是我寫的太丑了,他又還給我,讓我解釋一下代碼,然后就解釋了一下。8、問我用棧怎么實現(xiàn)隊列,我說用2個棧來實現(xiàn),他問我具體怎么操作,我說我可以想一下嗎?他說可以,然后我想了一下,畫個圖給演示了一下。9、問我有沒有登過網(wǎng)頁版微信,問我用手機掃二維碼登錄是怎么實現(xiàn)的。不會10、問我知道阻塞隊列嗎,讓我自己實現(xiàn)阻塞隊列我會怎么做?我說我會用兩種方法來實現(xiàn),一種是用wait和notify的方式,一種是用Condition條件變量的方式,然后他問怎么用wait和notify實現(xiàn),我就把思路說了一下。最后他還
57、問我是什么時候接觸編程的,我說大一。我不知道他最后問了我一個這個問題是什么意思就想起來這么些了,整整70分鐘,我已經(jīng)說的口干舌燥了。面試完,他說,今天的面試結束了,我頓時就懵了,按照我了解的,這就代表沒通過的意思,但是我覺得我答的很好,百分之九十都答出來了,而且很多都說的很詳細。我一臉疑惑,還是很客氣的說謝謝,準備走呢,馬上又聽到他說,你先到外面等一下,然后我又說好的,謝謝。然后他接著說,準備下一輪吧,我說好的,謝謝。然后就出來了。出來之后到了等候的大廳,整個人都虛脫了,又左看看,右看看,還是沒有水,沒過幾分鐘,元氣還沒恢復,讓我去二面二面:45分鐘。拖著疲憊的身子,走到二面面試官前,一見其人
58、,明顯能感受到這就是大神,那拖鞋,那發(fā)型,那胡子,此時我已經(jīng)身心俱疲,硬著頭皮坐下來,先自我介紹,問了幾個問題,然后說那我們寫一個簡單的題目吧。他把電腦轉過來,讓我看其中某個題目,說你做一下這道題吧。用java統(tǒng)計一個文本文件中出現(xiàn)的頻率最高的20個單詞。多經(jīng)典的題目啊。我問能用shell命令來實現(xiàn)嗎?他說用java。于是我用了HashMap,都弄到map里面去了之后,我發(fā)現(xiàn)我不會排序。集合類里面的排序方法確實沒怎么用過,于是我就卡在這里了。然后我跟他說我數(shù)據(jù)結構選錯了,我應該選能排序的map,比如說TreeMap,他說那你接著寫,我又不想寫了,因為我只是知道TreeMap是怎么一回事,并沒有
59、去用過這個TreeMap,而且排序的話它應該是按照key來排序的,我這里的key是單詞,并沒有什么用,我也不知道該怎么按照后面的value來排序,我也想到可以調(diào)用map的entrySet方法得到一個集合,然后我可以對這個集合進行操作,總之我想了很多,但是對一些操作不太熟就沒有繼續(xù)下去了。我覺得這道題目應該很簡單啊,沒想到我竟然沒寫出來。其實方法還是有的,map都拿到了,排個序豈能難倒我,大不了再倒騰一下,我冒泡也能給它解決了,但是我實在是不想用這么low的方式,然后我就放棄了,沒接著寫。然后面試官說,好的,那我們再來寫一個簡單的題目吧。題目大概意思就是用面向?qū)ο蟮乃枷雽崿F(xiàn)題目說的那個場景,具體
60、題目就不說了,我并沒有太明白題目的意思,感覺可以用一個HashMap的數(shù)據(jù)結構來實現(xiàn),然后我就自己照著HashMap的代碼寫了寫,寫了點我又停下了,因為我并沒有太理解題目的意思,所以我也不知道該怎么寫,于是我又放棄了,真要我實現(xiàn)一個HashMap我也是可以寫出來的,畢竟源碼我看過很多遍了,一是想到有點麻煩,二是想到我可能沒正確理解題目的意思,然后我就放棄了,放棄了,棄了,了。兩道題目下來,我心理已經(jīng)被擊潰了,然后他問我有沒有研究java方面的新技術,問我想從事哪一方面的開發(fā),問我阿里云,淘寶等等這些有沒有對哪個比較有意向,這個時候的我意識已經(jīng)開始模糊了,話也說不清楚了,舌頭也捋不順了,這幾個開放性的問題答的我都恨不得抽死自己。總之,一面給自己打90分,二面給自己打20分經(jīng)驗就不說了,沒什么好的經(jīng)驗教訓就說一下吧: 面試之前
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 超聲波和次聲波課件
- 《PDA發(fā)展與介紹》課件
- 單位管理制度展示大全【人事管理】十篇
- 單位管理制度展示大合集【人力資源管理篇】十篇
- 策略深度研究:當前還有哪些高股息值得關注
- 全程編制棉絲絨項目可行性研究報告方案可用于立項及銀行貸款+201
- 2024-2026年中國微信公眾號市場調(diào)查研究及行業(yè)投資潛力預測報告
- 可行性項目研究報告電子類
- 2024河南金屬及金屬礦批發(fā)市場前景及投資研究報告
- 2025年鹽酸酯項目可行性研究報告
- 2025北京朝陽初二(上)期末數(shù)學真題試卷(含答案解析)
- 做賬實操-科學研究和技術服務業(yè)的賬務處理示例
- 2025年人教版歷史八上期末復習-全冊重難點知識
- 2024年國家安全員資格考試題庫及解析答案
- 山東省濱州市2023-2024學年高一上學期1月期末考試 政治 含答案
- 儀控技術手冊-自控專業(yè)工程設計用典型條件表
- 法務崗位招聘筆試題及解答(某大型國企)2025年
- 《慶澳門回歸盼祖國統(tǒng)一》主題班會教案
- 洗衣房工作人員崗位職責培訓
- 廣東省深圳市光明區(qū)2022-2023學年五年級上學期數(shù)學期末試卷(含答案)
- XX小區(qū)春節(jié)燈光布置方案
評論
0/150
提交評論