1、springMVC的執行流程:
springMVC是由dispatchservlet爲核心的分層控制框架。首先客戶端發出一個請求到web服務器,web服務器解析請求的url並去匹配dispatchservlet的映射url,如果匹
配上就將這個請求放入到dispatchservlet,dispatchservlet根據mapping映射配置去尋找相對應的handel,然後把處理權交給找到的handel,handel封裝了處理業務邏
輯的代碼,當handel處理完後會返回一個邏輯視圖modelandview給dispatchservlet,此時的modelandview是一個邏輯視圖不是一個正式視圖,所以dispatchservlet會通
過viewresource視圖資源去解析modelandview,然後將解析後的參數放到view中返回到客戶端並展現。
2、servlet執行流程:
客戶端發出http請求,web服務器將請求轉發到servlet容器,servlet容器解析url並根據web.xml找到相對應的servlet,並將request、response對象傳遞給找到的
servlet,servlet根據request就可以知道是誰發出的請求,請求信息及其他信息,當servlet處理完業務邏輯後會將信息放入到response並響應到客戶端。
3、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頁面。
4、簡單的解釋一下垃圾回收:
Java 垃圾回收機制最基本的做法是分代回收。內存中的區域被劃分成不同的世代,對象根據其存活的時間被保存在對應世代的區域中。一般的實現是劃分成3個世代:年
輕、年老和永久。內存的分配是發生在年輕世代中的。當一個對象存活時間足夠長的時候,它就會被複制到年老世代中。對於不同的世代可以使用不同的垃圾回收算法。
進行世代劃分的出發點是對應用中對象存活時間進行研究之後得出的統計規律。一般來說,一個應用中的大部分對象的存活時間都很短。比如局部變量的存活時間就只在
方法的執行過程中。基於這一點,對於年輕世代的垃圾回收算法就可以很有針對性。
5、樂觀鎖
總是認爲不會產生併發問題,每次去取數據的時候總認爲不會有其他線程對數據進行修改,因此不會上鎖,但是在更新時會判斷其他線程在這之前有沒有對數據進行修改,一般會使用版本號機制或CAS操作實現。
6、悲觀鎖
總是假設最壞的情況,每次取數據時都認爲其他線程會修改,所以都會加鎖(讀鎖、寫鎖、行鎖等),當其他線程想要訪問數據時,都需要阻塞掛起。可以依靠數據庫實現,如行鎖、讀鎖和寫鎖等,都是在操作之前加鎖,在Java中,synchronized的思想也是悲觀鎖。
編程題一(生成六位隨機數):
//生成六位隨機數
public static void main(String[] args) {
//第一種方法
System.out.println((int)((Math.random()*9+1)*100000));
//第二種方法
Random r = new Random();
String str = "";
for (int i = 0; i < 6; i++) {
str += r.nextInt(10);
}
System.out.println(str);
//第三種方法
String sources = "0123456789";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 6; i++) {
sb.append(sources.charAt(r.nextInt(9)));
}
System.out.println(sb.toString());
}
編程題二(獲取指定字符串出現的次數 ):
/**
* 獲取指定字符串出現的次數
*
* @param srcText 源字符串
* @param findText 要查找的字符串
* @return
*/
public static int appearNumber(String srcText, String findText) {
int count = 0;
Pattern p = Pattern.compile(findText);
Matcher m = p.matcher(srcText);
while(m.find()){
count++;
}
return count;
}
編程題三(判斷文件中某個字符出現的次數):
/**
* 判斷文件中某個字符出現的次數
* @param text 判斷的字符
* @param file 文件
* @return
* @throws Exception
* @data 2018年11月21日下午3:59:23
* @Author Cloud
*/
public static int appearNumber(String text, File file) throws Exception{
int count = 0;
InputStream is = new FileInputStream(file);
byte[] bytes = new byte[2014];
int a = is.read(bytes);
String[] strs = new String(bytes, 0 ,a).split("");
for (int i = 0; i < strs.length; i++) {
if(text.equals(strs[i])){
count++;
}
}
is.close();
return count;
}
編程題四(冒泡排序):
/**
* 冒泡排序
* @param arr
* @return
* @data 2018年11月22日上午10:22:31
* @Author Cloud
*/
public static int[] mpSort(int[] arr){
int warp = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if(arr[j] > arr[i]){
warp = arr[i];
arr[i] = arr[j];
arr[j] = warp;
}
}
}
return arr;
}
編程題五(二分查找算法):
/**
* 二分查找算法
* @param arr
* @param tag
* @return
* @data 2018年11月22日上午10:36:21
* @Author Cloud
*/
public static int efSelect(int[] arr, int tag){
int frist = 0;
int end = arr.length;
for (int i = 0; i < arr.length; i++) {
int moddle = (frist + end) / 2;
if(tag == arr[moddle]){
return moddle;
}
if(tag > arr[moddle]){
frist = moddle + 1;
}
if(tag < arr[moddle]){
end = moddle - 1;
}
}
return 0;
}