備戰一線互連網公司的Java面試題清單__Java

來源:互聯網
上載者:User
                           備戰一線互連網公司的Java面試題清單 Java重點知識

       

        多線程(線程狀態、線程並發,Synchronized與Lock的區別和底層原理,常用的鎖及其使用情境和原理,

        volatile和ThreadLocal解決了什麼問題,CAS在Java中的實現

        線程池原理和實現,阻塞隊列和安全執行緒隊列,

        線程間通訊: synchronized + wait、notify/notifyAll, Lock + Condition 的多工,

        CountDownLatch、CyclicBarrier和Semaphore的作用和用法,使用情境)


       JVM記憶體管理機制和記憶體回收機制(記憶體模型、GC策略、演算法、分代回收GC類型,Full GC、Minor GC作用範圍和觸發條件)


       JVM記憶體調優(記憶體調整的6個參數,瞭解是怎麼回事,一般做項目過程中使用較多)


       設計模式(熟悉常見設計模式的應用情境,會畫類圖,常用:代理,2個工廠,策略,單例,觀察者,適配器,組合與裝飾)


       JAVA集合類架構(理解架構圖、HashMap、ArrayList、HashSet等的關係和區別,其中HashMap的儲存機制幾乎每次都有問)


HashMap的原理,底層資料結構,rehash的過程,指標碰撞問題HashMap的安全執行緒問題,為什麼會產生這樣的安全執行緒問題ConcurrentHashMap的資料結構,底層原理,put和get是否安全執行緒

       JAVA的異常處理機制(異常的分類、常見的異常有哪些、Try catch finally的使用)


       JVM運行機制(理解JVM是如何啟動並執行,理解類載入機制和類的初始化順序)


       Java 的NIO 3個主要概念 Channel、Buffer、Selector,為何提高了效能。加分項:熟悉Netty


       Linux基礎(面試筆試中對linux也有一定的要求,建議最好搭建一個linux虛擬機器,並練習常用的命令)
架構 Spring   Spring IOC原理,Bean的產生和生命週期(原廠模式 + 反射產生 + 單例),Spring用到的設計模式

  Spring AOP原理和應用(動態代理與cglib代理,使用情境和代理的本質區別)

  Spring如何處理高並發。高並發下,如何保證效能。
     單例模式 + ThreadLocal
單例模式大大節省了對象的建立和銷毀,有利於效能提高,ThreadLocal用來保證執行緒安全性
  Spring單例模式下,用ThreadLocal來切換不同線程直接的參數,用ThreadLocal是為了保證安全執行緒,實際上,ThreadLocal的key就是當前線程的Thread執行個體
  單例模式下,Spring把每個線程可能存線上程安全問題的參數值放進了ThreadLocal,雖然是一個執行個體,但在不同線程下的資料是相互隔離的,
  因為運行時建立和銷毀的bean大大減少了,所以大多數情境下,這種方式對記憶體資源的消耗較少,並且並發越高,優勢越明顯
     特別注意:            Spring MVC的Controller不是安全執行緒的。。。                        Spring MVC 是基於方法的攔截,粒度更細,而Spring的Controller預設是Singleton的,即:每個request請求,系統都會用同一個Controller去處理,
           Spring MVC和Servlet都是方法層級的安全執行緒,如果單例的Controller或Servlet中存在執行個體變數,都是線程不安全的,而Struts2確實是安全執行緒的
     優點:
          不用每次建立Controller,減少了對象建立和銷毀
     缺點:
          Controller是單例的,Controller裡面的變數線程不安全
     解決方案:
          1.在Controller中使用ThreadLocal變數,把不安全的變數封裝進ThreadLocal,使用ThreadLocal來儲存類變數,將類變數儲存線上程的變數域中,讓不同的請求隔離開來
 2.聲明Controller為原型 scope="prototype",每個請求都建立新的Controller
          3.Controller中不使用執行個體變數  

  Spring 交易管理的使用和原理。事務的傳播屬性
    聲明式交易管理,在Service之上或Service的方法之上,添加 @Transactional註解
   @Transactional如何工作。
     Spring在啟動時,會去解析產生相關的Bean,這是會查看擁有相關註解的類和方法,
     並且為這些類和方法組建代理程式,並根據 @Transactional的相關參數進行相關配置注入,
     這樣就在代理中把相關的交易處理掉了(開啟正常提交事務,異常復原事務)
     真正的資料庫層,事務提交和復原是通過binlog和redo log實現的


  Spring如何解決對象的循環相依性引用。(  只支援Singleton範圍的, setter方式的循環相依性。。。,不支援構造器方式和prototype的循環相依性)
   原理:
   建立Bean A時,先通過無參構造器建立一個A執行個體,此時屬性都是空的,但對象引用已經建立建立出來,然後把Bean A的引用提前暴露出來,
   然後setter B屬性時,建立B對象,此時同樣通過無參構造器,構造一個B對象的引用,並將B對象引用暴露出來。
   接著B執行setter方法,去池中找到A(因為此時,A已經暴露出來,有指向該對象的引用了),這樣依賴B就構造完成,也初始化完成,然後A接著初始化完成,
   循環相依性就這麼解決了。。。

總結:
   先建立對象引用,再通過setter()方式,給屬性賦值,層層建立對象 。。。


   Bean A初始化時,先對其依賴B進行初始化,同時,通過預設無參構造器,產生自己的引用,而不調用其setter()方法,
   當B對象建立時,如果還依賴C,則也通過無參構造器,產生B的引用,
   C對象建立時,如果引用了A,則去對象池中查到A的引用,然後調用setter()方式,注入A,完成C對象的建立
   C建立完成後,B使用setter()方式,注入C,完成B對象建立,
   B對象情境完成後,A使用setter()方式,注入B,完成A對象建立,
   最終,完成setter()方式的循環相依性。
資料庫          InnoDB和MyISAM區別和選擇           1.InnoDB不支援FULLTEXT類型的索引。
                        2.InnoDB 中不儲存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出儲存好的行數即可。注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的。
                        3.對於AUTO_INCREMENT類型的欄位,InnoDB中必須包含只有該欄位的索引,但是在MyISAM表中,可以和其他欄位一起建立聯合索引。
                        4.DELETE FROM table時,InnoDB不會重建立立表,而是一行一行的刪除。
                        5.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方案是首先把InnoDB表改成MyISAM表,匯入資料後再改成InnoDB表,但是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。


                        另外,InnoDB表的行鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%”
                        任何一種表都不是萬能的,只用恰當的針對業務類型來選擇合適的表類型,才能最大的發揮MySQL的效能優勢。         

          悲觀鎖和樂觀鎖的含義(悲觀鎖:真正的鎖,只允許一個線程操作同一條記錄,       樂觀鎖:一種衝突檢測機制,一般通過版本號碼或時間戳記方式實現,對效能影響較小)
     索引使用及其索引原理(索引底層實現:B+樹)
       Query查詢最佳化
         1.explain sql   查看執行效率,定位最佳化對象的效能瓶頸
         2.永遠用小結果驅動大的結果集
         3.儘可能在索引中完成排序
         4.只取出自己需要的column,而不是*
         5.使用最有效過濾條件
         6.用表串連代替子查詢
         7.當只要一行資料時,使用limit 1
         8.為搜尋欄位建立索引
         9.千萬不要ORDER BY RAND(),避免select *
         10.儘可能使用NOT NULL
         11.開啟查詢快取,並為查詢快取最佳化查詢語句
            eg:
              select username from user where add_time >= now()
              注意:
              1.這樣的語句不會使用查詢快取,
              2.像NOW()和RAND()或是其它的諸如此類的SQL函數都不會開啟查詢快取,因為這些函數的返回是會不定的易變的。所以,你所需要的就是用一個變數來代替MySQL的函數,從而開啟緩衝
              3.修改, 對now()進行處理,只取年月日  yyyy-MM-dd,變為一個不衣變的值
     Redis的5種資料結構和使用情境            Redis的持久化機制
     Redis中Hash類型的底層2種實現區別(壓縮表: 省記憶體  和  跳躍表:查詢更快)        Redis作為分布式訊息佇列使用,效能和注意點



資料結構和演算法

     常見的排序演算法就不說了,需要理解其原理和會寫代碼,還有時間空間複雜度也要知道

     隊列、棧:需要理解其存取結構,並能在某些情境下使用

     二叉樹:樹的遍曆、樹的深度、按層次輸出、平衡二叉樹、逆序列印樹等

     鏈表:逆序、合并兩有序的鏈表、判斷鏈表是否又環、鏈表倒數第K個元素等

     字串:KMP演算法、動態規劃(這個是重點,需要好好理解動態規劃,常見的題有:求解最長迴文子串、求解最長公用子串等)

     海量資料處理:現在好多大公司都會問海量資料的處理,所以需要掌握常見的處理方法,比如Bit-map、分而治之、hash映射等,可以百度看看相關的文章,加深理解

      常用演算法

冒泡排序

快速排序

插入排序

希爾排序

歸併排序

堆排序

桶排序

動態規劃

最長公用子串

最長迴文子串

數組的最大k個值

數位最大連續子數組之和

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.