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

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 開發多年中級程序員面試題經驗總結

開發多年中級程序員面試題經驗總結

更新時間:2019-10-04 09:00:00 來源:動力節點 瀏覽2360次



  多線程、并發及線程的基礎問題


  1)Java中能創建volatile數組嗎?


  能,Java中可以創建volatile類型數組,不過只是一個指向數組的引用,而不是整個數組。我的意思是,如果改變引用指向的數組,將會受到volatile的保護,但是如果多個線程同時改變數組的元素,volatile標示符就不能起到之前的保護作用了。


  2)volatile能使得一個非原子操作變成原子操作嗎?


  一個典型的例子是在類中有一個long類型的成員變量。如果你知道該成員變量會被多個線程訪問,如計數器、價格等,你最好是將其設置為volatile。為什么?因為Java中讀取long類型變量不是原子的,需要分成兩步,如果一個線程正在修改該long變量的值,另一個線程可能只能看到該值的一半(前32位)。但是對一個volatile型的long或double變量的讀寫是原子。


  3)volatile修飾符的有過什么實踐?


  一種實踐是用volatile修飾long和double變量,使其能按原子類型來讀寫。double和long都是64位寬,因此對這兩種類型的讀是分為兩部分的,第一次讀取第一個32位,然后再讀剩下的32位,這個過程不是原子的,但Java中volatile型的long或double變量的讀寫是原子的。volatile修復符的另一個作用是提供內存屏障(memorybarrier),例如在分布式框架中的應用。簡單的說,就是當你寫一個volatile變量之前,Java內存模型會插入一個寫屏障(writebarrier),讀一個volatile變量之前,會插入一個讀屏障(readbarrier)。意思就是說,在你寫一個volatile域時,能保證任何線程都能看到你寫的值,同時,在寫之前,也能保證任何數值的更新對所有線程是可見的,因為內存屏障會將其他所有寫的值更新到緩存。


  4)volatile類型變量提供什么保證?


  volatile變量提供順序和可見性保證,例如,JVM或者JIT為了獲得更好的性能會對語句重排序,但是volatile類型變量即使在沒有同步塊的情況下賦值也不會與其他語句重排序。volatile提供happens-before的保證,確保一個線程的修改能對其他線程是可見的。某些情況下,volatile還能提供原子性,如讀64位數據類型,像long和double都不是原子的,但volatile類型的double和long就是原子的。


  5)10個線程和2個線程的同步代碼,哪個更容易寫?


  從寫代碼的角度來說,兩者的復雜度是相同的,因為同步代碼與線程數量是相互獨立的。但是同步策略的選擇依賴于線程的數量,因為越多的線程意味著更大的競爭,所以你需要利用同步技術,如鎖分離,這要求更復雜的代碼和專業知識。


  6)你是如何調用wait()方法的?使用if塊還是循環?為什么?


  wait()方法應該在循環調用,因為當線程獲取到CPU開始執行的時候,其他條件可能還沒有滿足,所以在處理前,循環檢測條件是否滿足會更好。下面是一段標準的使用wait和notify方法的代碼:


  //Thestandardidiomforusingthewaitmethod


  synchronized(obj){


  while(conditiondoesnothold)


  obj.wait();//(Releaseslock,andreacquiresonwakeup)


  ...//Performactionappropriatetocondition


  }


  7)什么是多線程環境下的偽共享(falsesharing)?


  偽共享是多線程系統(每個處理器有自己的局部緩存)中一個眾所周知的性能問題。偽共享發生在不同處理器的上的線程對變量的修改依賴于相同的緩存行,如下圖所示:

  

image.png

  有經驗程序員的Java面試題


  偽共享問題很難被發現,因為線程可能訪問完全不同的全局變量,內存中卻碰巧在很相近的位置上。如其他諸多的并發問題,避免偽共享的最基本方式是仔細審查代碼,根據緩存行來調整你的數據結構。


  8)什么是Busyspin?我們為什么要使用它?


  Busyspin是一種在不釋放CPU的基礎上等待事件的技術。它經常用于避免丟失CPU緩存中的數據(如果線程先暫停,之后在其他CPU上運行就會丟失)。所以,如果你的工作要求低延遲,并且你的線程目前沒有任何順序,這樣你就可以通過循環檢測隊列中的新消息來代替調用sleep()或wait()方法。它唯一的好處就是你只需等待很短的時間,如幾微秒或幾納秒。LMAX分布式框架是一個高性能線程間通信的庫,該庫有一個BusySpinWaitStrategy類就是基于這個概念實現的,使用busyspin循環EventProcessors等待屏障。


  9)Java中怎么獲取一份線程dump文件?


  在Linux下,你可以通過命令kill-3PID(Java進程的進程ID)來獲取Java應用的dump文件。在Windows下,你可以按下Ctrl+Break來獲取。這樣JVM就會將線程的dump文件打印到標準輸出或錯誤文件中,它可能打印在控制臺或者日志文件中,具體位置依賴應用的配置。如果你使用Tomcat。


  10)Swing是線程安全的?


  不是,Swing不是線程安全的。你不能通過任何線程來更新Swing組件,如JTable、JList或JPanel,事實上,它們只能通過GUI或AWT線程來更新。這就是為什么Swing提供invokeAndWait()和invokeLater()方法來獲取其他線程的GUI更新請求。這些方法將更新請求放入AWT的線程隊列中,可以一直等待,也可以通過異步更新直接返回結果。你也可以在參考答案中查看和學習到更詳細的內容。


  11)什么是線程局部變量?


  線程局部變量是局限于線程內部的變量,屬于線程自身所有,不在多個線程間共享。Java提供ThreadLocal類來支持線程局部變量,是一種實現線程安全的方式。但是在管理環境下(如web服務器)使用線程局部變量的時候要特別小心,在這種情況下,工作線程的生命周期比任何應用變量的生命周期都要長。任何線程局部變量一旦在工作完成后沒有釋放,Java應用就存在內存泄露的風險。


  12)用wait-notify寫一段代碼來解決生產者-消費者問題?


  請參考答案中的示例代碼。只要記住在同步塊中調用wait()和notify()方法,如果阻塞,通過循環來測試等待條件。


  13)用Java寫一個線程安全的單例模式(Singleton)?


  請參考答案中的示例代碼,這里面一步一步教你創建一個線程安全的Java單例類。當我們說線程安全時,意思是即使初始化是在多線程環境中,仍然能保證單個實例。Java中,使用枚舉作為單例類是最簡單的方式來創建線程安全單例模式的方式。


  14)Java中sleep方法和wait方法的區別?


  雖然兩者都是用來暫停當前運行的線程,但是sleep()實際上只是短暫停頓,因為它不會釋放鎖,而wait()意味著條件等待,這就是為什么該方法要釋放鎖,因為只有這樣,其他等待的線程才能在滿足條件時獲取到該鎖。


  15)什么是不可變對象(immutableobject)?Java中怎么創建一個不可變對象?


  不可變對象指對象一旦被創建,狀態就不能再改變。任何修改都會創建一個新的對象,如String、Integer及其它包裝類。詳情參見答案,一步一步指導你在Java中創建一個不可變的類。


  16)我們能創建一個包含可變對象的不可變對象嗎?


  是的,我們是可以創建一個包含可變對象的不可變對象的,你只需要謹慎一點,不要共享可變對象的引用就可以了,如果需要變化時,就返回原對象的一個拷貝。最常見的例子就是對象中包含一個日期對象的引用。


  數據類型和Java基礎面試問題


  17)Java中應該使用什么數據類型來代表價格?


  如果不是特別關心內存和性能的話,使用BigDecimal,否則使用預定義精度的double類型。


  18)怎么將byte轉換為String?


  可以使用String接收byte[]參數的構造器來進行轉換,需要注意的點是要使用的正確的編碼,否則會使用平臺默認編碼,這個編碼可能跟原來的編碼相同,也可能不同。


  19)Java中怎樣將bytes轉換為long類型?


  這個問題你來回答:-)


  20)我們能將int強制轉換為byte類型的變量嗎?如果該值大于byte類型的范圍,將會出現什么現象?


  是的,我們可以做強制轉換,但是Java中int是32位的,而byte是8位的,所以,如果強制轉化是,int類型的高24位將會被丟棄,byte類型的范圍是從-128到128。


  3年工作經驗的Java面試題


  21解釋Java堆空間及GC?


  當通過Java命令啟動Java進程的時候,會為它分配內存。內存的一部分用于創建堆空間,當程序中創建對象的時候,就從對空間中分配內存。GC是JVM內部的一個進程,回收無效對象的內存用于將來的分配。

image.png

  JVM底層面試題及答案


  22)你能保證GC執行嗎?


  不能,雖然你可以調用System.gc()或者Runtime.gc(),但是沒有辦法保證GC的執行。


  23)怎么獲取Java程序使用的內存?堆使用的百分比?


  可以通過java.lang.Runtime類中與內存相關方法來獲取剩余的內存,總內存及最大堆內存。通過這些方法你也可以獲取到堆使用的百分比及堆內存的剩余空間。Runtime.freeMemory()方法返回剩余空間的字節數,Runtime.totalMemory()方法總內存的字節數,Runtime.maxMemory()返回最大內存的字節數。


  24)Java中堆和棧有什么區別?


  JVM中堆和棧屬于不同的內存區域,使用目的也不同。棧常用于保存方法幀和局部變量,而對象總是在堆上分配。棧通常都比堆小,也不會在多個線程之間共享,而堆被整個JVM的所有線程共享。

image.png

  關于內存的的面試問題和答案


  Java基本概念面試題


  25)“a==b”和”a.equals(b)”有什么區別?


  如果a和b都是對象,則a==b是比較兩個對象的引用,只有當a和b指向的是堆中的同一個對象才會返回true,而a.equals(b)是進行邏輯比較,所以通常需要重寫該方法來提供邏輯一致性的比較。例如,String類重寫equals()方法,所以可以用于兩個不同對象,但是包含的字母相同的比較。


  25)a.hashCode()有什么用?與a.equals(b)有什么關系?


  hashCode()方法是相應對象整型的hash值。它常用于基于hash的集合類,如Hashtable、HashMap、LinkedHashMap等等。它與equals()方法關系特別緊密。根據Java規范,兩個使用equal()方法來判斷相等的對象,必須具有相同的hashcode。


  26)final、finalize和finally的不同之處?


  final是一個修飾符,可以修飾變量、方法和類。如果final修飾變量,意味著該變量的值在初始化后不能被改變。finalize方法是在對象被回收之前調用的方法,給對象自己最后一個復活的機會,但是什么時候調用finalize沒有保證。finally是一個關鍵字,與try和catch一起用于異常的處理。finally塊一定會被執行,無論在try塊中是否有發生異常。


  27)Java中的編譯期常量是什么?使用它又什么風險?


  公共靜態不可變(publicstaticfinal)變量也就是我們所說的編譯期常量,這里的public可選的。實際上這些變量在編譯時會被替換掉,因為編譯器知道這些變量的值,并且知道這些變量在運行時不能改變。這種方式存在的一個問題是你使用了一個內部的或第三方庫中的公有編譯時常量,但是這個值后面被其他人改變了,但是你的客戶端仍然在使用老的值,甚至你已經部署了一個新的jar。為了避免這種情況,當你在更新依賴JAR文件時,確保重新編譯你的程序。


  Java集合框架的面試題


  這部分也包含數據結構、算法及數組的面試問題


  28)List、Set、Map和Queue之間的區別


  List是一個有序集合,允許元素重復。它的某些實現可以提供基于下標值的常量訪問時間,但是這不是List接口保證的。Set是一個無序集合。


  29)poll()方法和remove()方法的區別?


  poll()和remove()都是從隊列中取出一個元素,但是poll()在獲取元素失敗的時候會返回空,但是remove()失敗的時候會拋出異常。


  30)Java中LinkedHashMap和PriorityQueue的區別是什么?


  PriorityQueue保證最高或者最低優先級的的元素總是在隊列頭部,但是LinkedHashMap維持的順序是元素插入的順序。當遍歷一個PriorityQueue時,沒有任何順序保證,但是LinkedHashMap課保證遍歷順序是元素插入的順序。


  31)ArrayList與LinkedList的不區別?


  最明顯的區別是ArrrayList底層的數據結構是數組,支持隨機訪問,而LinkedList的底層數據結構書鏈表,不支持隨機訪問。使用下標訪問一個元素,ArrayList的時間復雜度是O(1),而LinkedList是O(n)。更多細節的討論參見答案。


  32)用哪兩種方式來實現集合的排序?


  你可以使用有序集合,如TreeSet或TreeMap,你也可以使用有順序的的集合,如list,然后通過Collections.sort()來排序。


  33)Java中怎么打印數組?


  你可以使用Arrays.toString()和Arrays.deepToString()方法來打印數組。由于數組沒有實現toString()方法,所以如果將數組傳遞給System.out.println()方法,將無法打印出數組的內容,但是Arrays.toString()可以打印每個元素。


  34)Java中的LinkedList是單向鏈表還是雙向鏈表?


  是雙向鏈表,你可以檢查JDK的源碼。在Eclipse,你可以使用快捷鍵Ctrl+T,直接在編輯器中打開該類。


  35)Java中的TreeMap是采用什么樹實現的?


  Java中的TreeMap是使用紅黑樹實現的。


  36)Hashtable與HashMap有什么不同之處?


  這兩個類有許多不同的地方,下面列出了一部分:


  a)Hashtable是JDK1遺留下來的類,而HashMap是后來增加的。


  b)Hashtable是同步的,比較慢,但HashMap沒有同步策略,所以會更快。


  c)Hashtable不允許有個空的key,但是HashMap允許出現一個nullkey。


  更多的不同之處參見答案。


  37)Java中的HashSet,內部是如何工作的?


  HashSet的內部采用HashMap來實現。由于Map需要key和value,所以所有key的都有一個默認value。類似于HashMap,HashSet不允許重復的key,只允許有一個nullkey,意思就是HashSet中只允許存儲一個null對象。


  38)寫一段代碼在遍歷ArrayList時移除一個元素?


  該問題的關鍵在于面試者使用的是ArrayList的remove()還是Iterator的remove()方法。這有一段示例代碼,是使用正確的方式來實現在遍歷的過程中移除元素,而不會出現ConcurrentModificationException異常的示例代碼。


  39)我們能自己寫一個容器類,然后使用for-each循環碼?


  可以,你可以寫一個自己的容器類。如果你想使用Java中增強的循環來遍歷,你只需要實現Iterable接口。如果你實現Collection接口,默認就具有該屬性。


  40)ArrayList和HashMap的默認大小是多數?


  在Java7中,ArrayList的默認大小是10個元素,HashMap的默認大小是16個元素(必須是2的冪)。這就是Java7中ArrayList和HashMap類的代碼片段:


  //fromArrayList.javaJDK1.7


  privatestaticfinalintDEFAULT_CAPACITY=10;


  //fromHashMap.javaJDK7


  staticfinalintDEFAULT_INITIAL_CAPACITY=1<<4;//aka16


  41)有沒有可能兩個不相等的對象有有相同的hashcode?


  有可能,兩個不相等的對象可能會有相同的hashcode值,這就是為什么在hashmap中會有沖突。相等hashcode值的規定只是說如果兩個對象相等,必須有相同的hashcode值,但是沒有關于不相等對象的任何規定。


  42)兩個相同的對象會有不同的的hashcode嗎?


  不能,根據hashcode的規定,這是不可能的。


  43)我們可以在hashcode()中使用隨機數字嗎?


  不行,因為對象的hashcode值必須是相同的。參見答案獲取更多關于Java中重寫hashCode()方法的知識。


  44)Java中,Comparator與Comparable有什么不同?


  Comparable接口用于定義對象的自然順序,而comparator通常用于定義用戶定制的順序。Comparable總是只有一個,但是可以有多個comparator來定義對象的順序。


  45)為什么在重寫equals方法的時候需要重寫hashCode方法?


  因為有強制的規范指定需要同時重寫hashcode與equal是方法,許多容器類,如HashMap、HashSet都依賴于hashcode與equals的規定。


以上就是動力節點java培訓機構小編分享的“開發多年中級程序員面試題經驗總結”的內容,希望對大家有幫助,更多java面試題請繼續關注動力節點java培訓機構官網,每天會精彩內容分享與你。


相關java面試題推薦


2019最新最全java面試題及答案:http://www.dabaquan.cn/tutorial_baseinterviewquestions/


Java常見面試題匯總:http://www.dabaquan.cn/javazixun/1007.html


2019最新java面試題含答案(基礎篇):http://www.dabaquan.cn/javazixun/1145.html


各大互聯網公司Java面試題匯總:http://www.dabaquan.cn/javazixun/1867.html


2019最新Java常見面試題(附帶答案):http://www.dabaquan.cn/javazixun/891.html


常被問到的Java面試題(帶全部答案):http://www.dabaquan.cn/javazixun/886.html



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

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 图片区亚洲 | 农村寡妇一级毛片免费看视频 | 国产99免费视频 | 天天狠狠弄夜夜狠狠躁·太爽了 | 手机在线看片不卡中文字幕 | 成年视频xxxxxx在线 | 国产精品成人扳一级aa毛片 | 精品一区二区乱码久久乱码 | 久久精彩 | 国产一区二区三区不卡免费观看 | 久久网站免费 | 国产精品久久久久久久久久日本 | 国产毛片哪里有 | 在线亚洲欧洲国产综合444 | 国产成人18黄网站麻豆 | 国产亚洲日本 | 欧美午夜毛片a级在线 | 模特啪啪 | 久久亚洲国产精品一区二区 | 久久久综合九色合综国产 | 欧美成人毛片 | 婷婷资源综合 | 日本一级在线观看 | 99香蕉网| 免费男女网站 | 国产成人精品免费久久久久 | 91久久亚洲最新一本 | 四虎影永久在线观看精品 | 中文字幕一区二区日产乱码 | 亚洲日本中文 | 欧美日本一本线在线观看 | 全免费一级毛片在线播放 | 日本国产成人精品视频 | 久久精品国产精品国产精品污 | 国产成人99精品免费观看 | 九操网 | 久久九九热re6这里有精品 | 四虎永久成人免费 | 99国产精品高清一区二区二区 | 日本免费不卡视频一区二区三区 | 四虎永久精品免费观看 |