目錄
一、簡單講下 Java 的跨平台原理
由於各個操作系統(Windows,Linux等)支持的指令集不是完全一致的。就會讓我們程序在不同的操作系統上要執行不同的程序代碼。Java 開發了適用於不同操作系統及位數的 Java 虛擬機來屏蔽系統之間的差異,提供統一的接口(Java API)。對於 Java 開發者而言,只需要在不同的操作系統上安裝對應的 Java 虛擬機即可。這時我們的程序只需要遵循 Java 規范,就可以在所有的操作系統上運行 Java 代碼。如果我們需要將系統部署到不同的環境時,只需要在系統上安裝對應版本的 Java 虛擬機(JVM)即可。
二、裝箱與拆箱
裝箱:把基本數據類型轉換成對應的包裝類型(Integer i = 1:自動裝箱,源碼中通過 Integer.valueOf(1)方法進行裝箱)。
拆箱:把包裝類型轉換為基本數據類型(int j = i:自動拆箱,手動拆箱:int j = i.intVaule()也是自動拆箱的源碼中所使用的方法)。
為什么有了基本數據類型,還需要包裝類型:因為Java是面向對象的語言,而基本數據類型不具備現象對象的特性(null等)。
三、實現一個拷貝文件的工具類使用字節流還是字符流
我們拷貝的文件不確定是只包含字符流,有可以能有字節流(圖片、聲音、圖像等),為考慮到通用性,要使用字節流。
四、介紹下線程池
JDK5 中增加了並發庫,為 Java 線程的管理和使用提供了強大的便利性。java.util.current 包中提供了對線程的優化和管理的各項操作,該包提供了線程的運行,線程池的創建,線程聲明周期的控制。
Java 通過 Executors提供四個靜態方法創建四種線程池,分別是:
【1】newCachedThreadPool:創建一個可緩存線程池,如果線程池長度超過處理需求,可靈活回收空閑線程,若無可回收,則創建新線程。
【2】newFixedThreadPool:創建一個定長線程池,可以控制最大線程並發數,超出的線程會在隊列中等待。
【3】newScheduledThreadPool:創建一個定長線程池,支持定時及周期性任務執行。
【4】newSingleThreadExecutor:創建一個單線程的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO,LIFO,優先級)執行。
線程池(數據庫連接池類似)的作用?
【1】限定線程的個數,不會導致由於線程過多導致系統運行緩慢或者崩潰。
【2】線程池不需要每次都去創建和銷毀,節約資源。
【3】線程池不需要每次都去創建,提高響應時間。
五、JSP和 Servlet 有哪些相同點和不同點
Jsp 繼承了 HttpServlet 所以 Jsp 是 Servlet 技術的擴展,所有的 Jsp 文件編譯就是一個 Servlet,JVM 只識別 Java 的類,不能識別 Jsp 代碼,Web 容器將 Jsp 的代碼編譯成 JVM 能夠識別的 Java 類。Servlet 如果要實現 Html 功能,必須使用 Writer 輸出對應的 Html 標簽,比較麻煩。而 Jsp 的情況是 Java 和 Html 可以組合成一個名為 .jsp 的文件,做界面展示比較方便而嵌入邏輯比較復雜。
Jsp 與 Servlet 主要的不同點在於 Jsp 側重於視圖,Servlet 主要用於控制邏輯。Servlet 中沒有內置對象,Jsp 中的內置對象必須通過 HttpServletRequst 對象、HttpServletResponse 對象以及 HttpServlet 對象得到。
六、簡單介紹一下關系數據庫三范式
范式就是規范,就是關系型數據庫在設計表時,要遵循的三個規范。要想滿足第二范式必須先滿足第一范式,要滿足第三范式必須先滿足第二范式。
第一范式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重復的屬性。列數據的不可分割
第二范式(2NF)要求數據庫表中的每個行必須可以被唯一地區分。為實現區分通常需要為表加上一個列,以存儲各個實例的唯一標識。(主鍵)
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。(外鍵)
反三范式,有的時候為了效率,可以設置重復或者可以推導出的字段。例如:訂單(總價)和訂單項(單價)
七、Mysql 數據庫的默認的最大連接數
為什么需要最大連接數?特定服務器上面的數據庫只能支持一定數目同時連接,這時候我們一般都會設置最大連接數(最多同時服務多少連接)。在數據庫安裝時都會有一個默認的最大連接數為100。
【1】可以通過設置 my.ini 配置文件中的如下屬性進行設置:
【2】可以通過命令進行設置:這種方式有個問題,就是設置的最大連接數只在 Mysql 當前服務進程有效,一旦 Mysql 重啟,又會恢復到初始狀態。因為 Mysql 啟動后的初始化工作是從其配置文件中讀取數據的,而這種方式沒有對其配置文件做更改。
八、說一下 Mysql 和 Oracle 的分頁
Mysql是使用關鍵字 limit 來進行分頁的 limit offset,size 表示從多少索引去多少位。Oracle 的分頁,使用三層嵌套查詢。
九、簡單講一下數據庫的觸發器的使用場景
觸發器語法:
CREATE [OR REPLACE] TRIGGER 觸發器名稱 {BEFORE|AFTER} {DELETE|INSERT|UPDATE[OF 列名]} ON 表名 [FOR EACH ROW [WHEN(條件)]] PLSQL塊
觸發器分類:
● 行級觸發器:行級觸發器作用的每一條記錄,都會被觸發,在行級觸發器上使用 :old和 :new偽記錄變量識別值的狀態
● 語句級觸發器:在指定的操作之前或者操作之后執行一次,不管這條語句影響了多少行,只執行一次。
語句實操:
十、簡單講一下數據庫的存儲過程的使用場景
我們可以將存儲過程理解為編程中的方法,存儲過程和方法一樣有參數和返回值。是為了完成特定功能的SQL指令集,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字並給指定參數來調用執行它。
存儲過程語法:
CREATE
[
OR REPLACE]
PROC[EDURE] 存儲過程名
@參數1 [數據類型]=[默認值] [OUTPUT]
@參數2 [數據類型]=[默認值] [OUTPUT]
AS
SQL語句
EXEC 過程名[參數]
存儲過程的優點:
【1】存儲過程只在創建時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般 SQL 語句每執行一次就編譯一次,因此使用存儲過程可以大大提高數據庫執行速度。
【2】通常,復雜的業務邏輯需要多條 SQL 語句。這些語句要分別地從客戶機發送到服務器,當客戶機和服務器之間的操作很多時,將產生大量的網絡傳輸。如果將這些操作放在一個存儲過程中,那么客戶機和服務器之間的網絡傳輸就會大大減少,降低了網絡負載。
【3】存儲過程創建一次便可以重復使用,從而可以減少數據庫開發人員的工作量。
【4】安全性高,存儲過程可以屏蔽對底層數據庫對象的直接訪問,使用 EXECUTE 權限調用存儲過程,無需擁有訪問底層數據庫對象的顯式權限。
語句實操:
十一、簡單介紹一下 Activiti
Activiti 是一個業務流程管理(BPM)和工作流系統,適用於開發人員和系統管理員。其核心是超快速,穩定的 BPMN2流程引擎。它易於與 Spring集成使用。主要要在OA中,把線下流程放到線上。 把現實生活中一些流程固話定義到系統中,然后通過輸入表單數據完成業務。例如:他可用在OA系統的流程管理中:請假流程 小於三天,一級主管審批,大於三天二級才能審批。
十二、編寫一個 Servlet
【1】Servlet 與普通的 Java 程序的區別:Servlet 本質上就是一個 Java 類;Servlet 類必須實現接口 javax.servlet.Servlet 接口;運行在 Web 容器中,Tomcat 就是一個 Web 容器;能夠接收瀏覽器發送的請求,並且做出響應給瀏覽器;
【2】編寫 Servlet 的步驟:寫一個類繼承於 HttpServlet,HttpServlet 是個抽象類它已經實現了 Servlet 接口; 重寫 doGet 或doPost 方法,分別處理表單的 get 或 post 請求;如果直接在瀏覽器輸入地址訪問,使用的是 get 方法;編寫 web.xml 配置文件,對 Servlet 進行配置或者通過 @WebServlet("/xxx"),才能通過瀏覽器來訪問。
如果使用 web.xml 配置,配置信息如下:
【3】 也可以實現最基本的 Servlet 接口。