1. 程式人生 > >面試知識點總結

面試知識點總結

1.spring框架,原理,機制

1.Spring是一個開源的輕量級框架,他的核心主要有兩部分組成IOC(Inversion of control)控制反轉和AOP(Aspect oriented programming)面向切面程式設計.

什麼是IOC:呼叫類中的方法不是通過new它的物件來實現,而是通過spring配置來建立類物件,而IOC又有兩種操作方式(配置檔案方式和註解方式),IOC底層運用的技術包括dom4j解析xml,工廠設計模式,反射,這三種技術

什麼是Aop

系統中非核心的業務提取出來,進行單獨處理

一個程式當需要擴充套件功能時不通過修改原始碼,僅僅修改配置檔案就能達到目的.aop才去橫向抽取機制取代了傳統縱向繼承體系重複性的程式碼;那麼它的原理是什麼? 底層使用動態代理的方式實現

aop的相關術語

pointcut(切入點) :在類裡面有很多的方法被增強(加功能的邏輯),真正操作的那個方法叫做切入點

Advice(通知/增強):增強的邏輯 eg:加邏輯的操作

Aspect(切面):把增強的邏輯應用到具體的方法上,這個過程叫做切面  ed:加功能到add方法的這一過程

另外Aspect本身不是Spring的一部分,只是經常個spring一起搭配使用

2.struts框架,原理,機制

1.概念:輕量級的MVC框架,主要解決了請求分發的問題,重心在控制層和表現層。低侵入性,與業務程式碼的耦合度很低。Struts2實現了MVC,並提供了一系列API,採用模式化方式簡化業務開發過程。

  2.與Servlet對比

    優點:業務程式碼解耦,提高開發效率

    缺點:執行效率偏低,需要使用反射、解析XML等技術手段,結構複雜

  3.不同框架實現MVC的方式

    Servlet:

    

    Spring:

    

    Struts2:

    

3.ibatis框架,原理,機制

 iBATIS 通過 SQL Map 將 Java 物件對映成 SQL 語句和將結果集再轉化成 Java 物件,與其他 ORM 框架相比,既解決了 Java 物件與輸入引數和結果集的對映,又能夠讓使用者方便的手寫使用 SQL 語句。

iBATIS 框架主要的類層次結構

總體來說 iBATIS 的系統結構還是比較簡單的,它主要完成兩件事情:

4.springmvc與struts的區別

1. 機制: spring mvc的入口是servlet,而struts2是filter,這樣就導致了二者的機制不同。2. 效能: spring會稍微比struts快。spring mvc是基於方法的設計,

而sturts是基於類,每次發一次請求都會例項一個action,每個action都會被注入屬性,

而spring基於方法,粒度更細,但要小心把握像在servlet控制資料一樣。

spring3 mvc是方法級別的攔截,攔截到方法後根據引數上的註解,把request資料注入進去,在spring3 mvc中,一個方法對應一個request上下文。

而struts2框架是類級別的攔截,每次來了請求就建立一個Action,然後呼叫setter getter方法把request中的資料注入;

struts2實際上是通 setter getter方法與request打交道的;struts2中,一個Action物件對應一個request上下文。3. 引數傳遞: struts是在接受引數的時候,可以用屬性來接受引數,這就說明引數是讓多個方法共享的。4. 設計思想上: struts更加符合oop(面向物件程式設計)的程式設計思想, spring就比較謹慎,在servlet上擴充套件。5. intercepter的實現機制: struts有自己的interceptor機制,spring mvc用的是獨立的AOP方式。

這樣導致struts的配置檔案量還是比spring mvc大,雖然struts的配置能繼承,所以我覺得論使用上來講,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。spring mvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構本身上spring3 mvc就容易實現restful url。

struts2是類級別的攔截,一個類對應一個request上下文;實現restful url要費勁,因為struts2 action的一個方法可以對應一個url;而其類屬性卻被所有方法共享,這也就無法用註解或其他方式標識其所屬方法了。

spring3 mvc的方法之間基本上獨立的,獨享request response資料,請求資料通過引數獲取,處理結果通過ModelMap交回給框架方法之間不共享變數,而struts2搞的就比較亂,雖然方法之間也是獨立的,

但其所有Action變數是共享的,這不會影響程式執行,卻給我們編碼,讀程式時帶來麻煩。6. 另外,spring3 mvc的驗證也是一個亮點,支援JSR303,處理ajax的請求更是方便,只需一個註解@ResponseBody ,然後直接返回響應文字即可。

5.什麼是分散式

分散式系統背景 說分散式系統必須要說集中式系統,集中式系統中整個專案就是一個獨立的應用,整個應用也就是整個專案,所有的東西都在一個應用裡面。

如下圖所示

如一個網站就是一個應用,最後是多個增加多臺伺服器或者多個容器來達到負載均衡的避免單點故障的目的,當然,資料庫是可以分開部署的。

集中式很明顯的優點就是開發測試運維會比較方便,不用為考慮複雜的分散式環境。

集中式很明顯的弊端就是不易擴充套件,每次更新都必須更新所有的應用。而且,一個有問題意味著所有的應用都有問題。當系統越來越大,集中式將是系統最大的瓶頸。

什麼是分散式系統? 分散式系統是若干獨立計算機的集合,這計算機對使用者來說就像單個相關係統。

以上定義摘自<<分散式系統原理與範型>>一書。

也就是說分散式系統背後是由一系列的計算機組成的,但使用者感知不到背後的邏輯,就像訪問單個計算機一樣。

說的有點繞,我們可以來簡單看下分散式系統圖。

分散式系統利弊 在分散式系統中:

1、應用可以按業務型別拆分成多個應用,再按結構分成介面層、服務層;我們也可以按訪問入口分,如移動端、PC端等定義不同的介面應用;

2、資料庫可以按業務型別拆分成多個例項,還可以對單表進行分庫分表;

3、增加分散式快取、搜尋、檔案、訊息佇列、非關係型資料庫等中介軟體;

很明顯,分散式系統可以解決集中式不便擴充套件的弊端,我們可以很方便的在任何一個環節擴充套件應用,就算一個應用出現問題也不會影響到別的應用。

隨著微服務Spring Cloud & Docker的大熱,及國內開源分散式Dubbo框架的重生,分散式技術發展非常迅速。

分散式系統雖好,也帶來了系統的複雜性,如分散式事務、分散式鎖、分散式session、資料一致性等都是現在分散式系統中需要解決的難題,雖然已經有很多成熟的方案,但都不完美。分散式系統也增加了開發測試運維成本,工作量增加,分散式系統管理不好反而會變成一種負擔。 原文:https://blog.csdn.net/youanyyou/article/details/79406507 

6.io理解

應用程式的IO操作分為兩種動作:IO呼叫和IO執行。IO呼叫是由程序發起,IO執行是作業系統的工作。

以一個程序的輸入型別的IO呼叫為例,它將完成或引起如下工作內容:

  1. 程序向作業系統請求外部資料
  2. 作業系統將外部資料載入到核心緩衝區
  3. 作業系統將資料從核心緩衝區拷貝到程序緩衝區
  4. 程序讀取資料繼續後面的工作

阻塞和非阻塞IO

阻塞和非阻塞強調的是程序對於作業系統IO是否處於就緒狀態的處理方式。

從程式設計的角度講述了程式設計師應該如何去理解IO程式設計的一些概念。其關鍵點是要將應用程式的IO操作分為兩個步驟來理解:IO呼叫和IO執行。IO呼叫才是應用程式乾的事情,而IO執行是作業系統的工作。在IO呼叫時,對待作業系統IO就緒狀態的不同方式,決定了其是阻塞或非阻塞模式;在IO執行時,執行緒或程序是否掛起等待IO執行決定了其是否為同步或非同步IO。

在整個Java.io包中最重要的就是5個類和一個介面。5個類指的是File、OutputStream、InputStream、Writer、Reader;一個介面指的是Serializable.掌握了這些IO的核心操作那麼對於Java中的IO體系也就有了一個初步的認識了

Java I/O主要包括如下幾個層次,包含三個部分:

  1.流式部分――IO的主體部分;

  2.非流式部分――主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor等類;

  3.其他類--檔案讀取部分的與安全相關的類,如:SerializablePermission類,以及與本地作業系統相關的檔案系統的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。

  主要的類如下:

     1. File(檔案特徵與管理):用於檔案或者目錄的描述資訊,例如生成新目錄,修改檔名,刪除檔案,判斷檔案所在路徑等。

     2. InputStream(二進位制格式操作):抽象類,基於位元組的輸入操作,是所有輸入流的父類。定義了所有輸入流都具有的共同特徵。

     3. OutputStream(二進位制格式操作):抽象類。基於位元組的輸出操作。是所有輸出流的父類。定義了所有輸出流都具有的共同特徵。

4.Reader(檔案格式操作):抽象類,基於字元的輸入操作。

     5. Writer(檔案格式操作):抽象類,基於字元的輸出操作。

     6. RandomAccessFile(隨機檔案操作):一個獨立的類,直接繼承至Object.它的功能豐富,可以從檔案的任意位置進行存取(輸入輸出)操作

 Java中IO流的體系結構如圖:

 

b、Java流類的類結構圖:

位元組流和字元流的區別(重點)

位元組流和字元流的區別:(詳細可以參見http://blog.csdn.net/qq_25184739/article/details/51203733)    

    節流沒有緩衝區,是直接輸出的,而字元流是輸出到緩衝區的。因此在輸出時,位元組流不呼叫colse()方法時,資訊已經輸出了,而字元流只有在呼叫close()方法關閉緩衝區時,資訊才輸出。要想字元流在未關閉時輸出資訊,則需要手動呼叫flush()方法。

        讀寫單位不同:位元組流以位元組(8bit)為單位,字元流以字元為單位,根據碼錶對映字元,一次可能讀多個位元組。

·        處理物件不同:位元組流能處理所有型別的資料(如圖片、avi等),而字元流只能處理字元型別的資料。

結論:只要是處理純文字資料,就優先考慮使用字元流。除此之外都使用位元組流。

7.多執行緒理解

8.集合理解

9.JVM原理

10.效能調優

11.資料庫mysql,Oracle的區別

12.掌握前端技術