標籤:輸出內容 增加 避免 線上人數 動態 之間 大小 file java集合
1、servlet執行流程
用戶端發出http請求,web伺服器將請求轉寄到servlet容器,servlet容器解析url並根據web.xml找到相對應的servlet,並將request、response對象傳遞給找到的servlet,servlet根據request就可以知道是誰發出的請求,請求資訊及其他資訊,當servlet處理完商務邏輯後會將資訊放入到response並響應到用戶端。
2、springMVC的執行流程
springMVC是由dispatchservlet為核心的分層控制架構。首先用戶端發出一個請求web伺服器解析請求url並去匹配dispatchservlet的映射url,如果匹配上就將這個請求放入到dispatchservlet,dispatchservlet根據mapping映射配置去尋找相對應的handel,然後把處理權交給找到的handel,handel封裝了處理商務邏輯的代碼,當handel處理完後會返回一個邏輯視圖modelandview給dispatchservlet,此時的modelandview是一個邏輯視圖不是一個正式視圖,所以dispatchservlet會通過viewresource視圖資源去解析modelandview,然後將解析後的參數放到view中返回到用戶端並展現。
3、給定一個txt檔案,如何得到某字串出現的次數
File file = new File("E://test.txt");
InputStream is = new FileInputStream(file);
byte b[] = new byte[1024];
int a = is.read(b);
String str[] = new String(b,0,a).split("");
int count = 0;
for(int i = 0;i<str.length;i++){
if("a".equals(str[i]))count++;
}
System.out.println(count);
4、Java設計模式思想(單列模式,原廠模式,策略模式,共23種設計模式)
a) 單例模式:單例模式核心只需要new一個執行個體對象的模式,比如資料庫連接,線上人數等,一些網站上看到的線上人數統計就是通過單例模式實現的,把一個計時器存放在資料庫或者記憶體中,當有人登陸的時候取出來加一再放回去,有人退出登陸的時候取出來減一再放回去,但是當有兩個人同時登陸的時候,會同時取出計數器,同時加一,同時放回去,這樣的話資料就會錯誤,所以需要一個全域變數的對象給全部人使用,只需要new出一個執行個體對象,這就是單例模式的應用,並且單例模式節省資源,因為它控制了執行個體對象的個數,並有利於gc回收。
b) 策略模式:就是將幾個類中公用的方法提取到一個新的類中,從而使擴充更容易,保證代碼的可移植性,可維護性強。比如有個需求是寫鴨子物件,鴨子有叫,飛,外形這三種方法,如果每個鴨子類都寫這三個方法會出現代碼的冗餘,這時候我們可以把鴨子中的叫,飛,外形這三個方法提取出來,放到鴨父類中,讓每個鴨子都繼承這個鴨父類,重寫這三個方法,這樣封裝的代碼可移植性強,當使用者提出新的需求比如鴨子會遊泳,那麼對於我們oo程式員來講就非常簡單了我們只需要在鴨父類中加一個遊泳的方法,讓會遊泳的鴨子重寫遊泳方法就可以了。
c) 原廠模式:簡單的原廠模式主要是統一提供執行個體對象的引用,通過原廠模式介面擷取執行個體對象的引用。比如一個登陸功能,後端有三個類,controller類,interface類,實現介面的實作類別。當用戶端發出一個請求,當請求傳到controller類中時,controller擷取介面的引用對象,而實現介面的實作類別中封裝好了登陸的商務邏輯代碼。當你需要加一個註冊需求的時候只需要在介面類中加一個註冊方法,實作類別中實現方法,controller擷取介面的引用對象即可,不需要改動原來的代碼,這種做法是的可拓展性強。
5、冒泡排序、二分尋找
a) 冒泡
public static void mp(int a[]) {
int swap = 0;
for (int i = 0; i < a.length; i++) {
for (int j = i; j < a.length; j++) {
if (a[j] > a[i]) {
swap = a[i];
a[i] = a[j];
a[j] = swap;
}
}
}
System.out.println(Arrays.toString(a));
}
b)二分尋找public static int ef(int a[], int tag) {
int first = 0;
int end = a.length;
for (int i = 0; i < a.length; i++) {
int middle = (first + end) / 2;
if (tag == a[middle]) {
return middle;
}
if (tag > a[middle]) {
first = middle + 1;
}
if (tag < a[middle]) {
end = middle - 1;
}
}
return 0;
}
6、對ajax的理解
a) Ajax為非同步請求,即局部重新整理技術,在傳統的頁面中,使用者需要點擊按鈕或者事件觸發請求,到重新整理頁面,而非同步技術為不需要點擊即可觸發事件,這樣使得使用者體驗感增強,比如商城購物車的非同步載入,當你點擊商品時無需請求後台而直接動態修改參數。
9、父類與子類之間的調用順序(列印結果)
a) 父類靜態代碼塊
b) 子類靜態代碼塊
c) 父類構造方法
d) 子類構造方法
e) 子類普通方法
f) 重寫父類的方法,則列印重寫後的方法
10、內部類與外部類的調用
a) 內部類可以直接調用外部類包括private的成員變數,使用外部類引用的this.關鍵字調用即可
b) 而外部類調用內部類需要建立內部類對象
11、多線程
a)一個進程是一個獨立的運行環境,可以看做是一個程式,而線程可以看做是進程的一個任務,比如QQ是一個進程,而一個QQ視窗是一個線程。
b)在多線程程式中,多線程並發可以提高程式的效率,cpu不會因為某個線程等待資源而進入空閑狀態,它會把資源讓給其他的線程。
c)使用者線程就是我們開發程式是建立的線程,而守護線程為系統線程,如JVM虛擬中的GC
d)線程的優先順序別:每一個線程都有優先順序別,有限層級高的可以先擷取CPU資源使該線程從就緒狀態轉為運行狀態。也可以自訂線程的有限層級
e)死結:至少兩個以上線程爭取兩個以上cpu資源,避免死結就避免使用嵌套鎖,只需要在他們需要同步的地方加鎖和避免無限等待
12、AOP與IOC的概念(即spring的核心)
a) IOC:Spring是開源架構,使用架構可以使我們減少工作量,提高工作效率並且它是分層結構,即相對應的層處理對應的商務邏輯,減少代碼的耦合度。而spring的核心是IOC控制反轉和AOP面向切面編程。IOC控制反轉主要強調的是程式之間的關係是由容器控制的,容器控制對象,控制了對外部資源的擷取。而反轉即為,在傳統的編程中都是由我們建立對象擷取依賴對象,而在IOC中是容器幫我們建立對象並注入依賴對象,正是容器幫我們尋找和注入對象,對象是被擷取,所以叫反轉。
b) AOP:面向切面編程,主要是管理系統層的業務,比如日誌,許可權,事物等。AOP是將封裝好的對象剖開,找出其中對多個對象產生影響的公用行為,並將其封裝為一個可重用的模組,這個模組被命名為切面(aspect),切面將那些與商務邏輯無關,卻被業務模組共同調用的邏輯提取並封裝起來,減少了系統中的重複代碼,降低了模組間的耦合度,同時提高了系統的可維護性。
13、hibernate的核心思想
a) Hibernate的核心思想是ROM對象關係映射機制。它是將表與表之間的操作映射成對象與對象之間的操作。也就是從資料庫中提取的資訊會自動按照你設定的映射要求封裝成特定的對象。所以hibernate就是通過將資料表實體類的映射,使得對對象的修改對應資料行的修改。
14、Struts1與Struts2的區別
15、最優刪除謀字串的某個字元
16、Arraylist與linkedlist的區別
a) 都是實現list介面的列表,arraylist是基於數組的資料結構,linkedlist是基於鏈表的資料結構,當擷取特定元素時,ArrayList效率比較快,它通過數組下標即可擷取,而linkedlist則需要移動指標。當儲存元素與刪除元素時linkedlist效率較快,只需要將指標移動指定位置增加或者刪除即可,而arraylist需要移動資料。
17、mybaties與ibatise的區別
18、資料庫最佳化
a) 選擇合適的欄位,比如郵箱欄位可以設為char(6),盡量把欄位設定為notnull,這樣查詢的時候資料庫就不需要比較null值
b) 使用關聯查詢( left join on)查詢代替子查詢
c) 使用union聯集查詢手動建立暫存資料表
d) 開啟事物,當資料庫執行多條語句出現錯誤時,事物會復原,可以維護資料庫的完整性
e) 使用外鍵,事物可以維護資料的完整性但是它卻不能保證資料的關聯性,使用外鍵可以保證資料的關聯性
f) 使用索引,索引是提高資料庫效能的常用方法,它可以令資料庫伺服器以比沒有索引快的多的速度檢索特定的行,特別是對於max,min,order by查詢時,效果更明顯
g) 最佳化的查詢語句,絕大多數情況下,使用索引可以提高查詢的速度,但如果sql語句使用不恰當的話,索引無法發揮它的特性。
19、Tomcat伺服器最佳化(記憶體,並發串連數,緩衝)
a) 記憶體最佳化:主要是對Tomcat啟動參數進行最佳化,我們可以在Tomcat啟動指令碼中修改它的最大記憶體數等等。
b) 線程數最佳化:Tomcat的並發串連參數,主要在Tomcat設定檔中server.xml中配置,比如修改最小空閑連接線程數,用於提高系統處理效能等等。
c) 最佳化緩衝:開啟壓縮功能,修改參數,比如壓縮的輸出內容大小預設為2KB,可以適當的修改。
20、HTTP協議
a) 常用的要求方法有get、post
b) Get與post的區別:傳送資料,get攜帶參數與訪問地址傳送,使用者可以看見,這的話資訊會不安全,導致資訊泄露。而post則將欄位與對應值封裝在實體中傳送,這個過程使用者是不可見的。Get傳遞參數有限制,而post無限制。
21、TCP/UDP協議
22、Java集合類架構的基本介面有哪些
a) Collection集合介面,List、set實現Collection介面,arraylist、linkedlist,vector實現list介面,stack繼承vector,Map介面,hashtable、hashmap實現map介面
23、類載入的過程
a) 遇到一個新的類時,首先會到方法區去找class檔案,如果沒有找到就會去硬碟中找class檔案,找到後會返回,將class檔案載入到方法區中,在類載入的時候,靜態成員變數會被分配到方法區的靜態地區,非靜態成員變數分配到非靜態地區,然後開始給靜態成員變數初始化,賦預設值,賦完預設值後,會根據靜態成員變數書寫的位置賦顯示值,然後執行靜態代碼。當所有的靜態代碼執行完,類載入才算完成。
24、對象的建立
a) 遇到一個新類時,會進行類的載入,定位到class檔案
b) 對所有靜態成員變數初始化,靜態代碼塊也會執行,而且只在類載入的時候執行一次
c) New 對象時,jvm會在堆中分配一個足夠大的儲存空間
d) 儲存空間清空,為所有的變數賦預設值,所有的對象引用賦值為null
e) 根據書寫的位置給欄位一些初始化操作
f) 調用構造器方法(沒有繼承)
25、jvm的最佳化
a) 設定參數,設定jvm的最大記憶體數
b) 記憶體回收行程的選擇
26、高並發處理
a) 瞭解一點高並發性問題,比如一W人搶一張票時,如何保證票在沒買走的情況下所有人都能看見這張票,顯然是不能用同步機制,因為synchronize是鎖同步一次只能一個人進行。這時候可以用到鎖機制,採用樂觀鎖可以解決這個問題。樂觀鎖的簡單意思是在不鎖定表的情況下,利用業務的控制來解決並發問題,這樣即保證資料的可讀性,又保證儲存資料的排他性,保證效能的同時解決了並髮帶來的髒讀資料問題。
27、事物的理解
a) 事物具有原子性,一致性,持久性,隔離性
b) 原子性:是指在一個事物中,要麼全部執行成功,要麼全部失敗復原。
c) 一致性:事物執行之前和執行之後都處於一致性狀態
d) 持久性:事物多資料的操作是永久性
e) 隔離性:當一個事物正在對資料進行操作時,另一個事物不可以對資料進行操作,也就是多個並發事物之間相互隔離。
28、Struts工作流程
a) 用戶端發出一個請求到servlet容器
b) 請求經過一些列過濾被filterdispatcher調用,filterdispatch通過actionMapper去找相對應的action。
c) Actionmapper找到對應的action返回給filterdispatch,dispatch把處理權交給actionproxy
d) Actionproxy通過設定檔找到對應的action類
e) Actionproxy建立一個actionIinvocation的執行個體處理商務邏輯
f) 一旦action處理完畢,actioninvocation負責根據stuts.xml的配置找到對應的返回結果。返回結果通常是jsp頁面。
Java 知識點