文章目錄
- java面試題筆記
- java基礎部分
- JAVA的跨平臺原理
- 搭建java開發環境的步驟
- java基本數據類型
- 面向對象的特徵
- 重載與重寫
- 裝箱與拆箱
- “==”與equals的區別
- String,String Builder,String Buffer
- 集合
- 字節流和字符流
- 線程
- 設計模式
- Java Web部分
- 數據庫部分
- 數據庫分類和常用的數據庫
- 關係型數據庫的三範式
- 事務
- mysql分頁和oracle分頁
- 觸發器
- 存儲過程
- jdbc進行數據庫操作
- jdbc中PreparedStatement相比Statement的好處
- 連接池的作用
- 前端部分
- 簡單說明html、css、javascript在網頁開發中的定位
- 簡單介紹一下ajax
- js與jquery的關係
- jquery的常用選擇器
- jquery的頁面加載完畢事件
- jquery的ajax和原生js實現的ajax有什麼關係
- bootstrap
- 框架部分
java面試題筆記
java基礎部分
JAVA的跨平臺原理
對於不同的系統,有相對應的不同的java虛擬機(JVM),JVM會屏蔽不同系統指令的差異,對外提供統一的接口(java API),以實現跨平臺。
搭建java開發環境的步驟
- 適用於操作系統的jdk
- 開發IDE:idea、eclipse等
- java web開發:tomcat服務器
java基本數據類型
java基本數據類型有8種:
基本數據類型 | 字節數 |
---|---|
byte | 1 |
short | 2 |
int | 4 |
long | 8 |
float | 4 |
double | 8 |
char | 2 |
boolean | 1/8 |
面向對象的特徵
面向對象的特徵有4個:抽象、封裝、繼承、多態
- 抽象:將現實生活中的對象某些共有的特徵抽象成屬性,行動抽象成方法
- 封裝:將屬性和方法封裝在一個模塊中,也就是一個類
- 繼承:一個類可以派生出子類,子類可以繼承父類所有非私有的屬性和方法,還可以進行擴展
- 多態:對象調用的方法在編譯時是無法確認的,只有在運行的時候纔會確認。體現在重寫和重載
重載與重寫
1.重載:相同的函數名,參數不同(參數類型,個數,順序不同)
- 重寫:繼承關係中,子類對父類某方法的重寫
裝箱與拆箱
裝箱:將基本數據類型轉換成包裝類型
拆箱:將包裝類型轉換成基本數據類型
實際上,運行時會進行自動裝箱拆箱
“==”與equals的區別
- ==,對於基本數據類型,直接進行比較,對於引用類型的對象,比較的是內存的首地址是否相同
- equals,比較的是內存中存儲的值是否相同。
原因:基本數據類型直接存儲在棧中,引用類型存儲在棧中,其存儲地址存儲在棧中
String,String Builder,String Buffer
- String內容不可變,底層由字符數組實現,final char[]
- String Builder內容可變,線程不安全
- String Buffer內容可變,線程安全
集合
集合引入的原因
數組的弊端:
- 只可以存儲同一種類型的數據;
- 一旦定義以後,長度不可改變
集合的大分類
集合的分類有兩種:
- Collection:只存儲值value
- Map:存儲鍵值對key-value
Collection
Collection只存儲值value,這種存儲方式的集合有兩類:
- List:有序的,可重複的
- Set:無序的,不可重複的
List
List存儲的數據是有序的,可重複的,派生了兩種子類:
- ArraysList:底層實現是數組
- LinkedList:底層實現是鏈表
一、 ArraysList
底層實現是數組,查找快,插入和刪除效率較低
二、 LinkedList
底層實現是鏈表,查找慢,插入和刪除效率較高
數組和鏈表的區別:
- 存儲位置的不同:數組相鄰位置的元素在物理空間上也是相鄰的,而鏈表不一定(可能相鄰,也可能不相鄰);
- 存儲空間的不同:數組要求一片連續的空間來存儲每一個元素,可能會造成空間的浪費,而鏈表不一定要連續的空間,可以利用零碎的空間;
- 在操作的效率上:數組查找特定的元素效率比較高(因爲可能根據下標索引直接查找到元素),但插入和刪除操作效率比較低(因爲需要對元素挨個進行移動);而鏈表的插入和刪除操作效率比較高(只需要更改next空間的指向即可),查找效率低(因爲需要從第一個元素開始一個一個找到目標元素)
Set
Set存儲的數據是無序的,不可重複的。常用的子類有:
- HashSet:無序的
- LinkedHashSet:有序的,根據插入的順序排序
Map
Map存儲數據是以鍵值對key-value形式來存儲的。其中key值不可以重複。
Map常用的子類有:
- HashMap
- HashTable
- CurrentHahMap
HashMap
- HashMap可以把null作爲key值和value值
- HashMap是線程不安全的,效率高
HashTable
- HashTable不可以把null作爲key值和value值
- HashTable是線程安全的,效率低
CurrentHashMap
CurrentHashMap既保證了線程安全,又保證了效率
字節流和字符流
- 字節流操作的單位是字節。
- 字符流操作的單位是字符,2個字節。使用到緩存區,需要關閉
操作文件應該使用字節流還是字符流
字節流。因爲不確定這個文件是否是純文字的文件,可能包含圖片,音頻等媒體文件。
線程
程序,進程,線程
- 程序:靜態代碼
- 進程:正在運行的程序
- 線程:進程的最小組成單位,多個線程同時執行組成一個進程
怎麼實現線程
- 繼承Thread類:java是單繼承的,不利於擴展
- 實現Runable接口
怎麼啓動線程
使用start方法
Thread thread = new Thread(new MyThread());
thread.start();
使用start方法後,實際調用的是線程中的run方法
怎麼區分線程
在定義線程變量之後,可以使用setName方法給線程取名字
線程池
- 限定線程的個數,不會導致運行緩慢或崩潰
- 線程池不需要每次都去創建又銷燬,響應速度快
設計模式
設計模式是前人經過無數次實踐總結出的可以反覆利用於某些特定場景下的設計方法。
常用的設計模式有:
單例模式、工廠模式、代理模式等
單例模式
所謂的單例模式,就是保證類在程序中只有一個實例對象。
- 構造方法私有化,除了自己的類中可以創建外,其他地方都不能創建
- 在自己的類中創建一個單實例
- 提供一個方法來獲取該單實例對象
餓漢模式
餓漢模式下,一開始就創建這個單實例
懶漢模式
懶漢模式下,需要的時候才創建這個單實例,需要進行方法同步。
工廠模式
Spring的IOC(控制反轉)就是使用了工廠模式。
一個對象的創建交給一個工廠去創建。
代理模式
Spring的AOP()就是使用了動態代理模式
Java Web部分
get和post請求
自己理解:他們都是http的請求方式。get、post、put、delete分別對應着對資源的查、改、增、刪操作。所以,get主要用來對資源的獲取/查詢,post主要用來對資源進行更新的操作。
回答:
- GET請求的數據會在地址欄顯示出來,而POST請求的數據不在地址欄中,而是包在http的包體中
- 由於1,GET請求的數據多少有限制(地址欄的長度有限制),而POST的請求數據的數量沒有限制
- 由於1,GET請求的安全性沒有POST的高
Servlet
Servlet是Server Applet的縮寫。是用Java編寫的服務器端程序。交互式地瀏覽或修改數據,生成動態Web內容。
怎麼編寫Servlet
實現HttpServlet類,重寫doGet或者doPost方法,也可以重寫service方法來調用相應的doGet或doPost方法來完成對請求的響應。
Servlet的生命週期
- 服務器啓動後,加載並實例化servlet
- servlet通過調用init方法進行初始化
- 請求來的時候,調用service方法處理客戶端的請求
- 服務器關閉,通過調用destroy方法來銷燬servlet
- java的垃圾回收機制進行空間回收
forward與redirect的區別
- 服務器端發起的請求。瀏覽器的地址不會改變,只是將請求到的數據include進來
- 客戶端發起的請求。redirect會使瀏覽器跳轉到新的地址,加載一個新的頁面
jsp與servlet
聯繫:jsp最後會翻譯成一個繼承HttpServlet的類,所以JSP相當於一個特殊的servlet
區別:
- jsp側重於視圖,而servlet更側重於控制邏輯。
- 在servlet中若要表現視圖,需要使用Writer來寫前端代碼,比較麻煩;而jsp是將兩者混合起來的,方便一些。
jsp的內置對象及四大作用域
jsp有9個內置對象:
- request:客戶端的請求
- response:傳回客戶端的響應
- pageContext:用來管理整個網頁的屬性
- session:整個請求的會話期
- application:整個應用
- out:輸出
- config:
- page:jsp網頁本身
- exception:異常
四大作用域
- page
- request
- session
- application
session和cookie
session和cookie都是會話跟蹤技術。session是依賴於cookie的,因爲cookie中存有一個sessionId來標識session
- session數據存在服務器端,所以安全性高,但性能差
- cookie數據存在客戶端,所以安全性低,性能較好
故,建議將用戶登錄信息等信息存在session中,其他安全要求較低的信息存在cookie中
MVC模式
mvc模式是將視圖與邏輯處理分離的一種模式。M是model,模型。V是view,視圖。C是controller控制器。
最經典的MVC模式就是jsp+servlet+javabean
數據庫部分
數據庫分類和常用的數據庫
- 關係型數據庫:mysql、oracle、sqlserver
- 非關係型數據庫:redis、mogodb
關係型數據庫的三範式
範式就是規範。
要想滿足第三範式,必須滿足第二範式;要想滿足第二範式,必須滿足第一範式。
第一範式
數據表的每一列都是不可拆分的數據項,不能是集合、數組等數據項。也就是實體中的某屬性只有一個值。
第二範式
(主鍵)在第一範式的基礎上,數據表的每行數據都能被唯一地區分。可設定主鍵
第三範式
(外鍵),在第一第二範式的基礎上,要求數據表中不包含已經在其他的數據表中存在的除了主鍵以外的其他列
事務
事務是定義的一系列操作的序列,這些操作要麼都執行,要麼都不執行,只要其中任意一個操作失敗了,其他的操作也不能成功。
事務的四個特徵
- 原子性:事務的操作是不可分割的,要麼都執行,要麼都不執行
- 一致性:事務的每項操作的執行結果狀態必須是一致的,要麼都成功,要麼都不成功。若中途失敗了,則前面的成功操作會回滾。
- 隔離性:程序中往往存在多個事務可能處理同樣的數據,爲了保護數據不被破壞,每個事務是隔離的。
- 持久性:事務處理後的結果時持久的,不會因爲系統故障而有所變動
mysql分頁和oracle分頁
- mysql是使用關鍵字limit來進行分頁的
...limit offset,size
- oracle分頁使用rownum關鍵字取數據的行數,再加where條件語句來限定行數範圍
select * from (select rownum rn,* from (select * from table order by co) where rn <= 15 )t where t.rn >= 5
觸發器
當滿足某個條件時候,執行一個規定的操作,即爲觸發器(關鍵字是trigger)。
舉例:當你發佈了一片推送文之後,觸發事件:向你的訂閱者發送信息提示你發文章了。
觸發器的寫法:(當在表1中插入了一條新的數據時候,觸發在表2更新數據總數)
create trigger trigger_name after insert on table1 for each row begin
update table2 set sum = sum + 1 wehere ...;
end;
存儲過程
優點:
- 方便處理複雜的、業務邏輯需要多條sql才能完成的情況
- 存儲過程只在創建的時候編譯一次,以後每次執行不需要重新編譯
- 存儲過程安全性較高
定義存儲過程:
create procedure pro_name(參數)
begin
...
end;
調用存儲過程:
call pro_name;
jdbc進行數據庫操作
jdbc:java database connection,java數據庫連接。屏蔽了不同廠商數據庫的差異,加入對應的驅動就可以去實現。
使用jdbc進行數據庫操作的步驟:
-
加載驅動:
mysql的驅動:com.mysql.jdbc.Driver
oracle的驅動:oracle.jdbc.driver.OracleDriver
-
獲取連接
DriverManager.getConnection(url,username,password);
-
設置參數
-
執行sql
-
釋放連接
jdbc中PreparedStatement相比Statement的好處
- preparedStament是預編譯的,速度快
- preparedStament可讀性和可維護性比較好
- preparedStament安全性較高,防止sql注入攻擊
連接池的作用
- 限定連接的個數,不會導致由於過多連接導致系統緩慢或者崩潰
- 數據庫連接不需要每次都創建或者銷燬,節約了資源,且響應快
前端部分
簡單說明html、css、javascript在網頁開發中的定位
- html,超文本標記語言,用來繪製網頁的結構
- css,層疊樣式表,用來美化頁面
- javascript,用來驗證表單,做動態交互(ajax)
簡單介紹一下ajax
使用ajax,可以不重新加載頁面就實現頁面的局部更新。
怎麼實現:
使用XmlHttpRequest對象可以異步向服務器發送請求,獲取響應來實現局部的更新。
使用場景:
登陸失敗時不跳轉頁面,註冊的時候提示用戶名是否已經存在了等。
js與jquery的關係
jquery是js的一種框架,封裝了js的屬性和方法,並且對其進行擴展,使其使用變得更方便。
比如:
- 使用原生的js要處理很多兼容性的問題,而jquery封裝了底層,就不用考慮兼容性的問題了;
- 原生的js,dom與事件綁定等操作非常麻煩,而jquery封裝之後,操作就變得簡單了。
jquery的常用選擇器
- id選擇器:(#)通過id獲取一個元素
- class選擇器:(.)通過css中的類獲取元素
- 標籤選擇器:通過標籤獲取元素
- 通用選擇器:*,獲取所有的元素
- 組合選擇器:如
div.test
獲取含有test這個類的div標籤元素 - 層次選擇器:兒子選擇器(>)獲取下面的子元素;後代選擇器(空格)獲取下面的所有後代,兒子、孫子等
- 屬性選擇器:如
input[name="hobby"]
獲取含有屬性名爲name,且name屬性值爲hobby的所有input標籤元素
jquery的頁面加載完畢事件
說明:
我們獲取頁面的元素是需要元素加載完畢之後再獲取的,原本的寫法是將獲取的js代碼放在元素的後面,但是這就會導致body中含有js代碼,層次較亂,不好管理。
所以,將其放在頁面加載完畢事件之後。
加載完畢事件的兩種寫法
-
$(document).ready(function(){ });
$(document)是把原生的document這個dom對象轉換成jquery對象;而後調用ready方法;
ready(function)表示頁面結構被加載完畢後執行傳入的函數
-
$(function(){ });
表示當頁面加載完畢之後執行裏面的函數
加載完畢事件和window.onload()的區別
- jquery中的頁面加載完畢事件,表示的是頁面結構加載完畢;window.onload表示的是頁面(包括結構以及相應的資源等)被加載完畢。
jquery的ajax和原生js實現的ajax有什麼關係
jquery的ajax也是由原生的js的ajax封裝而成的,使用已經封裝過的要方便得多,不用考慮底層的實現和兼容性問題。
bootstrap
bootstrap是一種前端框架。平常使用最多的就是它的柵格佈局,根據尺寸大小調整佈局
框架部分
MVC模式
MVC-Model View Controller ,將數據、視圖、邏輯分離的方式來編寫代碼。
最經典的MVC模式就是:JavaBean+jsp+servlet;
客戶端向控制器發起請求,控制器調起javabean數據進行處理,處理之後進行視圖渲染,呈現到瀏覽器
MVC框架
傳統的MVC模式存在以下問題:
- servlet的映射需要配置在web.xml文件中,當項目過大時,不好模塊化管理
- servlet的主要功能是接受參數、邏輯處理、跳轉頁面,而其他特殊的處理,比如字符編碼、文件上傳等功能也寫在servlet裏面就需要做一些處理
- servlet接收參數比較麻煩
- 跳轉頁面的方式比較單一
爲了解決傳統MVC模式的問題而設計的一種框架,常用的MVC框架:Spring MVC,struts2
Spring MVC的執行流程/原理
- 客戶端發送請求,被前端控制器捕獲(dispatcher)
- 前端控制器對uri進行解析,查找對應的handler
- 執行handler
- 執行完畢後,選擇合適的viewResolver
- 視圖渲染
Spring的兩大核心
Spring是J2EE應用程序框架,是對javaBean的生命週期進行管理的輕量級容器。
Spring的量大核心是:
- IOC(控制反轉)、DI(依賴注入)
- AOP(面向切面編程)
IOC/DI
控制反轉/依賴注入。舉例:原來,我們的service需要使用到Dao層,於是我們就new一個dao;而使用Spring後,Spring容器中裝有dao,它發現service依賴這個dao,就把dao注入給service
AOP
面向切面編程。是使用動態代理的方式在執行前後或出現異常之後加入相關的邏輯處理。
常使用的場景:
- 事務處理
- 權限判斷
- 日誌
等