大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 網易資深Java開發面試經驗

網易資深Java開發面試經驗

更新時間:2019-10-28 14:20:33 來源:動力節點 瀏覽2510次



  List和Set比較,各自的子類比較


  對比一:Arraylist與LinkedList的比較


  1、ArrayList是實現了基于動態數組的數據結構,因為地址連續,一旦數據存儲好了,查詢操作效率會比較高(在內存里是連著放的)。


  2、因為地址連續,ArrayList要移動數據,所以插入和刪除操作效率比較低。


  3、LinkedList基于鏈表的數據結構,地址是任意的,所以在開辟內存空間的時候不需要等一個連續的地址,對于新增和刪除操作add和remove,LinedList比較占優勢。


  4、因為LinkedList要移動指針,所以查詢操作性能比較低。


  適用場景分析:


  當需要對數據進行對此訪問的情況下選用ArrayList,當需要對數據進行多次增加刪除修改時采用LinkedList。


  對比二:ArrayList與Vector的比較


  1、Vector的方法都是同步的,是線程安全的,而ArrayList的方法不是,由于線程的同步必然要影響性能。因此,ArrayList的性能比Vector好。


  2、當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣。ArrayList就有利于節約內存空間。


  3、大多數情況不使用Vector,因為性能不好,但是它支持線程的同步,即某一時刻只有一個線程能夠寫Vector,避免多線程同時寫而引起的不一致性。


  4、Vector可以設置增長因子,而ArrayList不可以。


  適用場景分析:


  1、Vector是線程同步的,所以它也是線程安全的,而ArrayList是線程異步的,是不安全的。如果不考慮到線程的安全因素,一般用ArrayList效率比較高。


  2、如果集合中的元素的數目大于目前集合數組的長度時,在集合中使用數據量比較大的數據,用Vector有一定的優勢。


  對比三:HashSet與TreeSet的比較


  1.TreeSet是二叉樹實現的,Treeset中的數據是自動排好序的,不允許放入null值。


  2.HashSet是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重復,就如數據庫中唯一約束。


  3.HashSet要求放入的對象必須實現HashCode()方法,放入的對象,是以hashcode碼作為標識的,而具有相同內容的String對象,hashcode是一樣,所以放入的內容不能重復。但是同一個類的對象可以放入不同的實例。


  適用場景分析:


  HashSet是基于Hash算法實現的,其性能通常都優于TreeSet。我們通常都應該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet。


  HashMap和ConcurrentHashMap的區別


  1、HashMap不是線程安全的,而ConcurrentHashMap是線程安全的。


  2、ConcurrentHashMap采用鎖分段技術,將整個Hash桶進行了分段segment,也就是將這個大的數組分成了幾個小的片段segment,而且每個小的片段segment上面都有鎖存在,那么在插入元素的時候就需要先找到應該插入到哪一個片段segment,然后再在這個片段上面進行插入,而且這里還需要獲取segment鎖。


  3、ConcurrentHashMap讓鎖的粒度更精細一些,并發性能更好。


  JVM的內存結構


  根據JVM規范,JVM內存共分為虛擬機棧、堆、方法區、程序計數器、本地方法棧五個部分。


  1、Java虛擬機棧:


  線程私有;每個方法在執行的時候會創建一個棧幀,存儲了局部變量表,操作數棧,動態連接,方法返回地址等;每個方法從調用到執行完畢,對應一個棧幀在虛擬機棧中的入棧和出棧。


  2、堆:


  線程共享;被所有線程共享的一塊內存區域,在虛擬機啟動時創建,用于存放對象實例。


  3、方法區:


  線程共享;被所有線程共享的一塊內存區域;用于存儲已被虛擬機加載的類信息,常量,靜態變量等。


  4、程序計數器:


  線程私有;是當前線程所執行的字節碼的行號指示器,每條線程都要有一個獨立的程序計數器,這類內存也稱為“線程私有”的內存。


  5、本地方法棧:


  線程私有;主要為虛擬機使用到的Native方法服務。


  強引用,軟引用和弱引用的區別


  強引用:


  只有這個引用被釋放之后,對象才會被釋放掉,只要引用存在,垃圾回收器永遠不會回收,這是最常見的New出來的對象。


  軟引用:


  內存溢出之前通過代碼回收的引用。軟引用主要用戶實現類似緩存的功能,在內存足夠的情況下直接通過軟引用取值,無需從繁忙的真實來源查詢數據,提升速度;當內存不足時,自動刪除這部分緩存數據,從真正的來源查詢這些數據。


  弱引用:


  第二次垃圾回收時回收的引用,短時間內通過弱引用取對應的數據,可以取到,當執行過第二次垃圾回收時,將返回null。弱引用主要用于監控對象是否已經被垃圾回收器標記為即將回收的垃圾,可以通過弱引用的isEnQueued方法返回對象是否被垃圾回收器標記。


  springmvc的核心是什么,請求的流程是怎么處理的,控制反轉怎么實現的


  核心:


  控制反轉和面向切面


  請求處理流程:


  1、首先用戶發送請求到前端控制器,前端控制器根據請求信息(如URL)來決定選擇哪一個頁面控制器進行處理并把請求委托給它,即以前的控制器的控制邏輯部分;


  2、頁面控制器接收到請求后,進行功能處理,首先需要收集和綁定請求參數到一個對象,并進行驗證,然后將命令對象委托給業務對象進行處理;處理完畢后返回一個ModelAndView(模型數據和邏輯視圖名);


  3、前端控制器收回控制權,然后根據返回的邏輯視圖名,選擇相應的視圖進行渲染,并把模型數據傳入以便視圖渲染;


  4、前端控制器再次收回控制權,將響應返回給用戶。


  控制反轉如何實現:


  我們每次使用spring框架都要配置xml文件,這個xml配置了bean的id和class。


  spring中默認的bean為單實例模式,通過bean的class引用反射機制可以創建這個實例。


  因此,spring框架通過反射替我們創建好了實例并且替我們維護他們。


  A需要引用B類,spring框架就會通過xml把B實例的引用傳給了A的成員變量。


  BIO、NIO和AIO的區別


  JavaBIO:同步并阻塞,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。


  JavaNIO:同步非阻塞,服務器實現模式為一個請求一個線程,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。


  JavaAIO:異步非阻塞,服務器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理。


  NIO比BIO的改善之處是把一些無效的連接擋在了啟動線程之前,減少了這部分資源的浪費(因為我們都知道每創建一個線程,就要為這個線程分配一定的內存空間)


  AIO比NIO的進一步改善之處是將一些暫時可能無效的請求擋在了啟動線程之前,比如在NIO的處理方式中,當一個請求來的話,開啟線程進行處理,但這個請求所需要的資源還沒有就緒,此時必須等待后端的應用資源,這時線程就被阻塞了。


  適用場景分析:


  BIO方式適用于連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,并發局限于應用中,JDK1.4以前的唯一選擇,但程序直觀簡單易理解,如之前在Apache中使用。


  NIO方式適用于連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,并發局限于應用中,編程比較復雜,JDK1.4開始支持,如在Nginx,Netty中使用。


  AIO方式使用于連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與并發操作,編程比較復雜,JDK7開始支持,在成長中,Netty曾經使用過,后來放棄。


  為什么要用線程池


  那先要明白什么是線程池


  線程池是指在初始化一個多線程應用程序過程中創建一個線程集合,然后在需要執行新的任務時重用這些線程而不是新建一個線程。


  使用線程池的好處


  1、線程池改進了一個應用程序的響應時間。由于線程池中的線程已經準備好且等待被分配任務,應用程序可以直接拿來使用而不用新建一個線程。


  2、線程池節省了CLR為每個短生存周期任務創建一個完整的線程的開銷并可以在任務完成后回收資源。


  3、線程池根據當前在系統中運行的進程來優化線程時間片。


  4、線程池允許我們開啟多個任務而不用為每個線程設置屬性。


  5、線程池允許我們為正在執行的任務的程序參數傳遞一個包含狀態信息的對象引用。


  6、線程池可以用來解決處理一個特定請求最大線程數量限制問題。


  什么是線程死鎖?死鎖如何產生?如何避免線程死鎖?


  死鎖的介紹:


  線程死鎖是指由于兩個或者多個線程互相持有對方所需要的資源,導致這些線程處于等待狀態,無法前往執行。當線程進入對象的synchronized代碼塊時,便占有了資源,直到它退出該代碼塊或者調用wait方法,才釋放資源,在此期間,其他線程將不能進入該代碼塊。當線程互相持有對方所需要的資源時,會互相等待對方釋放資源,如果線程都不主動釋放所占有的資源,將產生死鎖。


  死鎖的產生的一些特定條件:


  1、互斥條件:進程對于所分配到的資源具有排它性,即一個資源只能被一個進程占用,直到被該進程釋放。


  2、請求和保持條件:一個進程因請求被占用資源而發生阻塞時,對已獲得的資源保持不放。


  3、不剝奪條件:任何一個資源在沒被該進程釋放之前,任何其他進程都無法對他剝奪占用。


  4、循環等待條件:當發生死鎖時,所等待的進程必定會形成一個環路(類似于死循環),造成永久阻塞。


  如何避免:


  1、加鎖順序:


  當多個線程需要相同的一些鎖,但是按照不同的順序加鎖,死鎖就很容易發生。如果能確保所有的線程都是按照相同的順序獲得鎖,那么死鎖就不會發生。當然這種方式需要你事先知道所有可能會用到的鎖,然而總有些時候是無法預知的。


  2、加鎖時限:


  加上一個超時時間,若一個線程沒有在給定的時限內成功獲得所有需要的鎖,則會進行回退并釋放所有已經獲得的鎖,然后等待一段隨機的時間再重試。但是如果有非常多的線程同一時間去競爭同一批資源,就算有超時和回退機制,還是可能會導致這些線程重復地嘗試但卻始終得不到鎖。


  3、死鎖檢測:


  死鎖檢測即每當一個線程獲得了鎖,會在線程和鎖相關的數據結構中(map、graph等等)將其記下。除此之外,每當有線程請求鎖,也需要記錄在這個數據結構中。死鎖檢測是一個更好的死鎖預防機制,它主要是針對那些不可能實現按序加鎖并且鎖超時也不可行的場景。


以上就是動力節點java學院小編分享的“ 網易資深Java開發面試經驗”的內容,希望能夠幫助到大家,更多java最新面試題請繼續關注動力節點java學院官網,每天會有精彩內容分享與你。


相關面試題推薦


最新最全java面試題及答案(從初級到高級)


Java程序員必備,中級面試總結建議收藏


史上最全的中高級JAVA工程師面試題及答案匯總


10道中高級Java面試題詳解,弄懂offer拿到手軟


java程序員常見面試題及答案


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产在线看不卡一区二区 | 国产一级特黄a大片99 | 国产深夜福利视频在线观看 | 天天干天天操天天 | 国产福利免费看 | 性欧美极品xxxx欧美一区二区 | 4hu影院永久在线播放 | 九九热视频在线观看 | 亚洲精品欧美日本中文字幕 | 久久影院在线 | 久久中文字幕一区二区 | 奇米影音| 国产精品91av | 999yy成年在线视频免费看 | 天天操天天射天天插 | 精品综合久久久久久88小说 | 白云精品视频国产专区 | 国产高清在线精品一区免费97 | 精品国产免费一区二区 | 国产高清精品一级毛片 | 小视频在线免费观看 | 天天爽| 国产精品成人四虎免费视频 | 久久久久久久免费视频 | 亚洲欧美日韩国产精品第不页 | 亚洲视屏一区 | 亚洲精品国产自在久久出水 | 99久久综合狠狠综合久久一区 | 日本视频h | 国产91在线精品 | 99久久精品国产一区二区成人 | 五月天中文在线 | 国产日韩精品欧美在线ccc | 四虎午夜剧场 | 护士一级毛片 | 激情都市久久爱 | 欧美成人免费tv在线播放 | 亚洲综合精品一区 | 激情久久婷婷 | 亚洲欧美另类国产综合 | 免费观看男女羞羞的视频网站 |