1007Java面試知識點準備

get請求和post請求之間的區別?參考文章鏈接

  1. GET請求參數地址會顯示在url地址中,post則不會
  2. get請求數據量小1024個字節,也就是1KB,而post請求數據量大2MB左右
  3. get請求一般用於從服務端查詢數據,而post請求可以用於增刪改請求(RESTFUL接口設計規範就是這麼來的)

Linux系統熟悉嗎?常用的指令有哪些?查詢系統負載的命令是哪個?(面試就是一個)
linux系統是目前主流的應用服務器,因爲其在系統安全和性能方面比較強,所以是目前的主流服務器。過去接觸過由Centos7系統,阿里雲ECS服務器,Ubuntu16可視化系統都有過使用的經驗.如linux系統下面的創建文件mkdir,刪除文件rm,查看當前系統目錄pwd,查看負載top,查看某個服務運行情況如ps -ef指令,另外如資源下載yum指令.文件壓縮解壓縮等指令zip unzip指令.

JVM中的內存模型指那些?垃圾回收機制有哪些?如何對JVM進行調優?
JVM中內存模型包含堆/棧.堆中存儲對象,棧存儲基本數據類型(如引用類型)
堆內存分爲年輕代,年老代,持久代。年輕代的對象進過幾次回收後,如果還存在則移入年老代.持久帶則存儲class,method,field等反射使用的類對象內存.

垃圾回收機制主要使用SUN回收機制,主要對年輕代和年老代中的活躍對象進行內存回收,主要回收算法有如下幾種,年輕代串行/並行,年老代串行/並行/併發.目前主流的回收算法指的是年老代併發也就是CMS回收算法.

JVM調優主要對堆內存和回收算法進行配置.通過對jdk內存回收的日誌進行分析,使用如jconsole,jprofile,VisualVm不斷對堆內存進行持有分析優化.

總結如上:學到的新東西如堆內存中分爲年輕代/年老代/持久代.持久代存儲着如class,method.field等對象內存.而年輕代中對象如果在幾次回收之後依然存在,則進入年老代.垃圾回收機制如SUN回收機制,主要針對的就是年輕代和年老代對象回收.同時回收機制使用的算法如年輕代串行/並行/年老代串行/並行/併發,一般使用的上就是CMS也就是年老代併發的回收算法.而面試中經常問的如JVM內存調優主要指的上就是對堆內存和回收算法的配置優化,通過分析jdk內存回收日誌的分析,通過如Jconcole,jprofile,visualvm工具,對堆內存回收不斷優化的過程.

分佈式事務如何實現?
分佈式事務採用分佈式鎖實現,通過zookeeper工具去實現,通過損耗一定系統性能的方式去實現,如京東下單不是立馬通知成功,是需要等一下才會告訴你下單成功的.

關於java8的新特性都瞭解哪些 ?參考文章/有點多哦

  1. lambda表達式,java8中引入的重要概念,函數式編程概念,將函數看做一個方法或者參數.由逗號分隔的參數列表/->/函數體構成.爲了配合函數式接口編程.引入了函數式接口概念,使用@FunctionInterface註解,用於修飾接口.表示只有一個方法的接口.如Runable接口就是這樣,只有一個run方法.
    在這裏插入圖片描述
  2. 接口中可以創建默認方法和靜態方法.接口中可以創建抽象方法的模式實現.這樣實現該接口的類,就不用爲默認的實現方法而操心了.同時接口中可以添加靜態方法。
package java8;

/**
 * java8新特性  接口可以創建默認類實現方法和靜態方法,這樣在實現類中就不需要重複寫代碼了
 */
public interface DefaultAndStaticInterface {
    /*
    方法的默認實現類
     */
    default  void test(){
        System.out.println("抽象方法的默認實現");
    }

    /*接口中定義靜態方法
     */
    static  void  test2(){
        System.out.println("接口中定義的靜態方法");
    }
}

在這裏插入圖片描述

  1. 方法的引用.(包含構造方法+靜態方法+成員方法等 通過CLASS:new/方法名的方式替換以往的對象創建)
  2. 重複註解的出現(@Annotition註解添加,可以在一個地方使用2個同樣的註解)
  3. 註解的擴展(@Annotation註解 中@Target添加了2個類型)
  4. 更好的的類型判斷

Java8庫新增的類
optional判斷對象是否爲空/Stream/時間類Clock+LocalDate+LocalTime

總結上述Java8新增的特性除了lambda在集合中使用了之外,如函數式接口,函數式變成思想也是今天學到的,如@FunctionInterface註解函數式接口,只有一個方法的接口.接口中的靜態方法和默認方法.方法的引用(構造方法 靜態方法 方法Class:new/方法名)/重複註解的支持/註解類型的擴展/更好的類型判斷,這些都是今天才學到的,真是有些慚愧了,更重要的是隻知道的了這些特徵,用起來更是一大難題.同時像java8新增的一些類如Optional判斷是否爲空/Stream(更好的處理集合中的數據)/時間Clock+LocalTime+LocalDate+LocalDateTime,當然還有很多其他的庫類因爲目前複習的內容比較多,所以僅限於瞭解,具體代碼裏面的使用還需要更多的時間去實踐學習.

Java中的多線程和併發庫相關知識點

創建線程的方式?

  1. 通過繼承Thread類,重寫run方法.

  2. 通過實現Runable接口,實現run抽象方法.
    本質上都是通過Runable接口中的run方法去實現線程的創建.因爲創建Thread類的本質也是通過實現Runable接口去實現的.實際上創建Thread類的構造方法裏面傳入Runable接口也可以實現的.

  3. Time/TimerTask也可以達到創建線程的目的.

線程中的制約關係?
線程中分爲間接相互制約和直接相互制約。這主要是線程併發執行時,由於資源共享和線程協作,存在以下2中制約關係.(直接相互制約可以理解爲同步,多線程之間存在順序,可以理解爲同步. 而間接相處制約可以理解爲互斥,指的是多個線程不能在同一個時間點執行,類似於互斥鎖.)

  • 間接相互制約:指的是多個線程需要去同時操作一個共享資源,必須要有先後順序.
  • 直接相互制約:指的是線程之間存在直接依賴關係,如B線程的執行必須要依賴與A線程.所以稱這種制約關係爲直接相互制約.

ThreadLocal有什麼作用?具體應用的場景有哪些?

  • 作用:主要用於單線程數據共享和多線程數據隔離這個原因所以出現了ThreadLocal這個概念,每個線程都會調用全局ThreadLocal對象的set方法,爲當前線程創建一個ThreadLocalMap對象,然後在這個map對象中插入一條記錄,key表示ThreadLocal對象,而value就是需要在當前線程中共享的數據.所以實際上每個線程都有自己的ThreadLocalMap對象.(而且從文章裏面總結的來看ThreadLocal分爲全局的和局部的.全局是用於設置每個線程的ThreadLocalMap對象的,而局部的就是用從來保證保證線程數據共享的.).線程執行完畢後 可以調用Thread.remove()更快的回收內存.

  • 應用場景:商品訂單下單,商品下單包含庫存減少,添加下單記錄,修改總賬等操作.這幾個操作要在一個事物裏面進行的,如果後面的總賬修改出現問題,那麼前面的數據也需要回顧.通常來講是這幾個模塊的修改都是在一處完成的,所以在這個線程裏面連接數據庫的對象也要是同一個.需要基於ThreadLocal保證數據庫鏈接對象的共享.(同樣的還有轉賬系統,這裏不做贅述)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章