面試題相關

面試高頻面試題

1.hashMap和hashTable的區別    javascript

 hashMap支持null鍵和null值,hashTable不支持null鍵和null值.
    hashMap對null值作了特殊處理,當出現null值的時候會將hashCode設爲0.
    hashMap初始值爲16,每次擴容爲以前的2倍,hashTable初始值爲11,每次擴容爲原來的2n+1.
    hashMap不是同步的,是線程不安全的,執行效率高;hashTable是同步的,是線程安全的,執行效率低.
    hashTable已經被淘汰.css


2.多線程 前端

    建立線程的三種方式
        (1).繼承Thread類,實現run方法
        (2).實現runable接口.
        (3).使用Callable,Futureh建立一個線程
        使用callable和Future建立的線程調用是有返回值
    多線程的5中狀態
     新建
     就緒
     運行
     阻塞
     死亡
    
    線程優先級設置
         Thread的setPriority()方法  默認優先級是5
    線程睡眠
         Thread的sleep(時間) 使線程轉到阻塞狀態
    線程等待
         Object的wait()  線程等待  知道其餘線程調用此對象的notify()或notifyAll()喚醒方法
    線程喚醒
         Object的notify()方法喚醒單個線程
     線程讓步
         Thread.yield()
     線程加入
         Thread.join()

     wait()和sleep()的區別
         wait是Object的方法,sleep是Thread類的方法
         共同點
             他們都是在多線程環境下,均可以在調用處指定阻塞指定的毫秒值.
         不一樣點:
             1.sleep()睡眠時,保持對象鎖,仍然佔有該鎖,wait()睡眠時,釋放對象鎖
             2.wait,notify,notityAll只能在同步控制方法和同步控制塊中使用,而sleep能夠在任何地方


    經常使用的線程池
        java自帶線程池ThreadPoolExecutor
        spring自帶的線程池:ThreadPoolTaskExecutor

3.事務java

    事務的特性:ACID 原子性 一致性 隔離性 持久性
        原子性:事務不可分割,要麼所有完成,要麼所有不完成.若是在事務過程當中出現錯誤,則所有回滾.
        一致性:事務結束前和結束後,數據庫的完整性約束沒有被破環.好比A向B轉帳,不能A扣了錢,B沒有卻沒有收到.
        隔離性:同一時間,只容許一個事務請求同一數據,不一樣事務之間彼此沒有任何干擾,好比A正在從一張銀行卡中取錢,在A取錢結束以前,B不能向這張卡轉帳
        持久性:事務完成以後,事務對數據庫的全部更新將被保存到數據庫,不能回滾.

    事務的隔離級別:讀未提交  讀已提交  可重複讀  串行化
        讀未提交什麼都不能防止
        讀已經提交能夠有效防止髒讀  orcal ,sql server
        可重複讀可防止可重複讀,髒讀  mysql默認的事務隔離級別
        串行化可防止髒讀,不可重複讀,幻讀

    事務併發引起的問題:
        髒讀:一個事務讀取了一個事務未提交的數據
        不可重複讀:一個事務讀取表中的某一行數據,屢次讀取結果不一樣
            髒讀和不可重複讀的區別是:髒讀是讀取了前一事務還未提交的數據,不可重複讀是從新讀取了前一事務提交的數據
        幻讀:一個事務讀取到了別的事務插入的數據,致使先後查詢不一致

        不可重複讀和幻讀的區別是:不可重複讀側重的修改,幻讀側重的是新增和刪除.解決不可重複讀的方法是鎖住知足條件的行,解決幻讀的方案是鎖表

    說明:1.串行化效率很低,讀寫數據都會鎖住整張表
         2.隔離級別越高,越能保證數據的完整性和一致性,可是對併發性能的影響也越大,魚和熊掌不可兼得啊。對於多數應用程序,能夠優先考慮把數據庫系統的隔離級別設爲讀已提交,它可以避免髒讀取,並且具備較好的併發性能。儘管它會致使不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,能夠由應用程序採用悲觀鎖或樂觀鎖來控制。


    涉及到相關高併發的問題
        樂觀鎖和悲觀鎖
            樂觀鎖:
            悲觀鎖:兩種實現方式:版本號和時間戳
            
如何處理併發和同步
    java代碼層面:
        java中的同步鎖,synchronized
    數據庫層面:
        使用樂觀鎖悲觀鎖
4.redismysql

    常見的nosql數據庫
        redis mongDB Couchbase(CouchDB的合併版本)
    redis的數據類型
        String(字符串)
        Hash(哈希)
        List(列表)
        Set(集合)
        zSet(有序集合)
    redis的持久化方案
        RDB持久化
            在指定時間內將內存中的數據集快照寫入到磁盤
            優勢:只有一份rdb文件,可隨時備份
                 比AOF文件小,加載效率高.
                 不阻塞主進程,io效率高
        AOF持久化
            將每個操做以日誌的形式記錄在服務器,在redis啓動之初讀取文件來從新構建數據庫,保證啓動後數據庫中的數據是完整的
            優勢:每次改動同步數據安全性好
                 以append的方式追加日誌,不會對舊日誌文件產生影響nginx


5.spring的生命週期web

6.索引的類型面試

    建立索引的方式
    索引的分類
        主鍵縮影 惟一索引 普通索引 全文索引  組合索引  
    索引的結構
        b+tree索引 hash索引
        b+tree是使用最頻繁的索引數據結構,b+tree的速度比不上hash,但b+tree很適合作排序操做

    普通索引:最基本的索引,沒有任何限制
    惟一索引:與"普通索引"相似,不一樣的就是:索引列的值必須惟一,但容許有空值。
    主鍵索引:它 是一種特殊的惟一索引,不容許有空值。
    全文索引:僅可用於 MyISAM 表,針對較大的數據,生成全文索引很耗時好空間。
    組合索引:爲了更多的提升mysql效率可創建組合索引,遵循」最左前綴「原則。建立複合索引時應該將最經常使用(頻率)做限制條件的列放在最左邊,依次遞減。redis

7.dubbo和http的相比spring

8.頁面加載慢如何處理

    前端處理
        優化圖片
        使用nginx作負載,作請求分發
        利用瀏覽器緩存
        壓縮css和javascript
    後臺處理
        將不常常變更的頁面使用模版引擎進行頁面靜態化的操做
        優化sql


9.數據庫設計

    三大範式:
        1.1NF強調列的原子性,即每一列不可以再分紅其餘幾列
        2.2NF每個實例或者行均可以被惟一的區分(每一列均可以被主鍵區分,每一列都和主鍵又關係)
        3.3NF在第二範式上更進一層,確保每一列和主鍵都是直接相關而不是間接相關
    反範式:
        經過增長冗餘字段或添加劇復的數據來提升數據庫的讀性能
    每張表必須有主鍵

10.數據庫優化

    當只查詢一條數據時使用LIMIT 1
    選擇正確的存儲引擎(MyISAM和InnoDB  MyISAM不適用大量讀寫操做    InnoDB支持行鎖和事務)
    使用Not Exists 代替 NOT IN (NOT Exists使用了索引,NOT In不走索引)
    數據庫分庫分表  垂直拆分:按照功能模塊,關係密切程度拆分紅多表
                    水平拆分,按照規則分紅多個相關表
    對應數據量大常常查詢的數據進行列添加索引


11.框架部分

    spring
         spring的生命週期
             在配置bean元素中,init-method指定bean的初始化方法,destroy-method指定銷燬方法
         spring實例化的幾種方式
             使用類構造器實例化(默認無參的)
             靜態工廠實例化(簡單工廠模式)
             動態工廠實例化(工廠方法模式)
         AOP
         IOC
         DI
         spring的注入方式
             接口注入
             構造方法注入
             set方法注入
             spring4支持@AutoWirde自動注入
         BeanFactory接口和 ApplicationContext 接口有什麼區別 ?
            1.ApplicationContext接口繼承BeanFactory接口,Spring核心工廠是BeanFactory ,BeanFactory採起延遲加載,第一次getBean時纔會初始化Bean,ApplicationContext是會在加載配置文件時初始化Bean。

            2.ApplicationContext是對BeanFactory擴展,它能夠進行國際化處理、事件傳遞和bean自動裝配以及各類不一樣應用層的Context實現

            3.開發中基本都在使用ApplicationContext,web項目使用WebApplicationContext ,不多用到BeanFactory

        spring bean的做用域
            singleton :在整個應用中是單例的
            prototype :一個bean能夠定義多個實例
            request: 每次的http請求都會建立一個bean
            Session: 在一個HTTP Session中,一個bean對應一個實例
            global-session:在一個HTTP Session中,一個bean定義一個實例

     mybatis
         mybatis循環
         CDATA
         mybatis返回id
         #{}和${}取值的區別
             #{}是佔位符能夠防止sql注入

         resultType的區別resultMap

     springmvc的執行流程
         用戶發起請求-->
         前端控制器接收到請求-->
         處理器映射器找到相對應的controller類-->
         在處處理器適配器執行controller所對應的方法-->
         返回到視圖解析器-->
         渲染視圖響應結果

         一、用戶發送請求至前端控制器DispatcherServlet
        二、DispatcherServlet收到請求調用HandlerMapping處理器映射器。
        三、處理器映射器找到具體的處理器,生成處理器對象及處理器攔截器(若是有則生成)一併返回給DispatcherServlet。
        四、DispatcherServlet調用HandlerAdapter處理器適配器
        五、HandlerAdapter通過適配調用具體的處理器(Controller,也叫後端控制器)。
        六、Controller執行完成返回ModelAndView
        七、HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
        八、DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
        九、ViewReslover解析後返回具體View
        十、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。
        十一、DispatcherServlet響應用戶

12.分佈式事務解決方案

    兩階段提交
    補償事務
    本地消息表
    MQ事務消息,目前只有RocketMQ支持

13.關於集合

    Iterator
        ListIterator
    Collection
        List
            ArrayList
            LinkedList
        Set
            HashSet
                LinkHashSet
            TreeSet
    Map
         HashMap
             LinkHashMap
         TreeMap

    集合和數組的區別
        數組的長度是固定的,集合的長度是可變的
        數據能夠存放基本數據類型也能夠存放引用數據類型,集合只能存儲引用數據類型
        數組只能存儲的元素必須是贊成數據類型,集合存儲的對象能夠是不一樣的數據類型

    集合類的結構組成
        colltction
            List:有序(元素存入集合和取出的順序一致,元素有索引,元素能夠重複)
            Set:無序(元素存入集合和取出的順序不一致,不能夠存儲重複的元素.必須保證元素惟一性)


        List接口  有序 有索引 可重複
            ArrayList:底層數據是數組,線程不一樣步.查詢速度快
            LinkList:底層數據是鏈表結構,線程不一樣步,增刪元素都很是快
            Vector:底層結構是數組,線程同步,不管是查詢仍是增刪都比較慢

        Set
            HashSet:底層是hash表 線程不一樣步 無序 高效
                LinkHashSet:    有序  hashSet的子類
            TreeSet:對Set集合中的元素進行指定的順序排序.不一樣步.TreeSet底層是二叉樹

            TreeSet集合排序有兩種方式,Comparable和Comparator區別:
            1:讓元素自身具有比較性,須要元素對象實現Comparable接口,覆蓋compareTo方法。
            2:讓集合自身具有比較性,須要定義一個實現了Comparator接口的比較器,並覆蓋compare方法,並將該類對象做爲實際參數傳遞給TreeSet集合的構造函數。
            第二種方式較爲靈活。

        Map
            HashMap:底層是hash表結構,線程是不一樣步的,能夠存儲null鍵null值.
            HashTable:底層是hash表接口,線程是同步的.不能夠存儲null鍵null值.
            TreeMap:底層是二叉樹結構,能夠對map中指定的鍵進行排序.


        HashMap和HasnTable底層的實現原理
            HashMap和Hashtable的底層實現都是數組+鏈表結構實現的,這點上徹底一致

            增,刪,查都是先計算hash,而後根據hash和table.length來計算idnex也就是table的索引.而後進行響應的操做

            HashMap()建立
                HashMap建立會建立一個默認容量爲16的Entry數組,默認加載因子爲0.75,同時設置值臨界值爲16*0.75
            put()方法
                hashMap會對null值進行特殊處理,老是放到table[0]的位置
                put過程是先計算hash而後經過hash與table.length取摸計算index值,而後將key放到table[index]位置,當table[index]已存在其它元素時,會在table[index]位置造成一個鏈表,將新添加的元素放在table[index],原來的元素經過Entry的next進行連接,這樣以鏈表形式解決hash衝突問題,當元素數量達到臨界值(capactiy*factor)時,則進行擴容,是table數組長度變爲table.length*2

            get()方法
                一樣當key爲null時會進行特殊處理,在table[0]的鏈表上查找key爲null的元素
                get的過程是先計算hash而後經過hash與table.length取摸計算index值,而後遍歷table[index]上的鏈表,直到找到key,而後返回

            remove方法
                remove方法和put get相似,計算hash,計算index,而後遍歷查找,將找到的元素從table[index]鏈表移除    
            resize方法
                resize方法在hashmap中並無公開,這個方法實現了很是重要的hashmap擴容,具體過程爲:先建立一個容量爲table.length*2的新table,修改臨界值,而後把table裏面元素計算hash值並使用hash與table.length*2從新計算index放入到新的table裏面這裏須要注意下是用每一個元素的hash所有從新計算index,而不是簡單的把原table對應index位置元素簡單的移動到新table對應位置
            clear()方法
                clear方法很是簡單,就是遍歷table而後把每一個位置置爲null,同時修改元素個數爲0
                須要注意的是clear方法只會清楚裏面的元素,並不會重置capactiy
            containsKey和containsValue
                containsKey方法是先計算hash而後使用hash和table.length取摸獲得index值,遍歷table[index]元素查找是否包含key相同的值

                containsValue方法就比較粗暴了,就是直接遍歷全部元素直到找到value,因而可知HashMap的containsValue方法本質上和普通數組和list的contains方法沒什麼區別,你別期望它會像containsKey那麼高效

            hash和indexFor
                indexFor中的h & (length-1)就至關於h%length,用於計算index也就是在table數組中的下標
                hash方法是對hashcode進行二次散列,以得到更好的散列值
                爲了更好理解這裏咱們能夠把這兩個方法簡化爲 int index= key.hashCode()/table.length,以put中的方法爲例能夠這樣替換


設計模式:

    單例模式:    工廠模式:dubbo:dubbo的序列化方式

相關文章
相關標籤/搜索