面試總結(jié)

1、servlet生命周期

(1) 初始化階段,調(diào)用init()方法
(2) 響應(yīng)客戶端請求階段,調(diào)用service()方法
(3) 終止階段,調(diào)用destroy()方法

servlet容器裝載servlet

  1. Servlet容器啟動時自動裝載某些Servlet,實現(xiàn)它只需要在web.XML文件中的<Servlet></Servlet>之間添加如下代碼:
    <loadon-startup>1</loadon-startup>
  2. 在Servlet容器啟動后,客戶首次向Servlet發(fā)送請求
  3. Servlet類文件被更新后,重新裝載Servlet,Servlet被裝載后,Servlet容器創(chuàng)建一個Servlet實例并且調(diào)用Servlet的init()方法進行初始化。在Servlet的整個生命周期內(nèi),init()方法只被調(diào)用一次。

servlet工作原理
  首先客戶發(fā)送一個請求,servlet調(diào)用service()方法對請求進行響應(yīng),service()方法對請求的方式進行匹配,選擇調(diào)用doGet(), doPost()這些方。servlet接口中沒有 doGet,doPost這些方法,httpServlet中有這些方法,但返回值都是error信息,所有需要將doPost,doGet重寫。
  每一個自定義的servlet都需要實現(xiàn)servlet接口(init,service,destory就在這個接口中)。GenericServlet是一個通用的、不特定于任何協(xié)議的servlet,它實現(xiàn)了servlet接口,而httpServlet又繼承與GenericServlet,所以我們定義servlet時只需要繼承httpServlet即可。
  httpServlet是特定于http協(xié)議的類,它實現(xiàn)了service()方法,并將servletRequest和servletResponse強轉(zhuǎn)為httpRequest和httpResponse。

2、sql 左外連接、右外連接、內(nèi)連接、全連接

--左外連接,就算emp表中員工的deptno沒有與dept表中的deptno對應(yīng)也會查出來,不過顯示emp表中的字段
select e.*,d.*
from emp e left join dept d on e.deptno=d.deptno;
左連接.png
--右外連接,就算emp表中員工的deptno沒有與dept表中的deptno對應(yīng)也會查出來,不過顯示dept表中的字段
select e.*,d.*
from emp e right join dept d on e.deptno=d.deptno;
右連接.png
-- 內(nèi)連接,只會查詢出兩表deptno一一對應(yīng)的數(shù)據(jù)
select e.*,d.*
from emp e inner join dept d on e.deptno=d.deptno;
內(nèi)連接.png
-- 全連接,不管兩張表的數(shù)據(jù)是否一一對應(yīng),全都會查出來
select e.*,d.*
from emp e full join dept d on e.deptno=d.deptno;
全連接.jpg

3、數(shù)據(jù)庫并發(fā)問題

數(shù)據(jù)庫帶來的并發(fā)問題有:

  1. 丟失更新。
  2. 未確認的相關(guān)性(臟讀)。
  3. 不一致的分析(非重復(fù)讀)。
  4. 幻讀。
1.1 丟失更新

當兩個或多個事務(wù)選擇同一行,然后基于最初選定的值進行更新,會發(fā)生丟失更新問題。每個事務(wù)都不知道其實事務(wù)的存在。最后進行提交的事務(wù)會將之前的更新覆蓋,導(dǎo)致數(shù)據(jù)丟失。
  此時需要對數(shù)據(jù)庫進行加鎖,兩種方式,一種是一開始就鎖住,防的很徹底,但是一旦鎖的時間過長會影響他人操作;另一種是在最后做更新提交時上鎖,將更新失敗視為小概率事件,只在最后一步才上鎖。
1.1.1 悲觀鎖
  當我們對數(shù)據(jù)進行修改時,首先需要將數(shù)據(jù)查詢出來,在查詢語中加鎖,即 select .......for update nowwait,在一開始的查詢中就開始加鎖,避免其他用戶更新
1.1.2 樂觀鎖
(a)舊值條件法:
  在更新語句中,使用舊的狀態(tài)值作為更新的條件(不推薦)
(b)版本列法:
  當我們設(shè)計表的時候往往會多設(shè)置兩個number/date類型的列,以便以后對表進行拓展。我們將一個number列作為版本列,每次修改數(shù)據(jù)時,以 限制條件 = 主鍵 + 版本列號的形式進行修改,同時每修改一次數(shù)據(jù),都對版本號進行更新。

我們通常在沖突較為嚴重的系統(tǒng)中使用悲觀鎖,其他情況優(yōu)先使用樂觀鎖。
2.1 未確認的相關(guān)性(臟讀)

當一個事務(wù)讀取到另一個事務(wù)還未提交的修改時候,產(chǎn)生臟讀。
  張三的工資原本是2000,財務(wù)不小心將張三工資改成了5000,此時尚未提交,張三查詢時發(fā)現(xiàn)自己工資變成5000后很開心,此時財務(wù)發(fā)現(xiàn)數(shù)據(jù)異常,回滾事務(wù),張三工資又變成了2000,這就叫臟讀。

解決辦法:在事務(wù)提交之前,其他任何事務(wù)都不能讀取其修改過的值。

3.1 不一致的分析(非重復(fù)讀)
4.1 幻讀

4、線程的兩種創(chuàng)建方式

第一種:new Thread 重寫 Thread 中的 run() 方法。

Thread thread = new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("1: " + Thread.currentThread().getName());
                    System.out.println("2: " + this.getName());
                }
            }
        };

第二種:Thread 的構(gòu)造方法中有一個是以 Runnable對象為參數(shù),Runnable是一個接口,當中有run()方法,Thread是implements了Runnable接口,繼而實現(xiàn)了run()方法,我們可以在new Thread的時候,通過構(gòu)造方法傳一個Runnable對象,而Runnable對象中又有run()方法,通過這種方式,也能實現(xiàn)線程的創(chuàng)建。

Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("3: " + Thread.currentThread().getName());
                }
            }
        });

5、SVN多用戶開發(fā) --- 代碼沖突&解決

修改同一文件的不同位置引發(fā)的沖突

現(xiàn)在有兩個用戶:zhangsan 和 lisi。他們需要同時修改一個文件,原始代碼如下:

public void Test{
    System.out.println("Test!");
    return 1;
}

此時 zhangsan 需要修改第二行代,

public void Test{
    System.out.println("Test!xingoo");
    return 1;
}

lisi 則修改第三行代碼,

public void Test{
    System.out.println("Test!");
    return 0;
}

假設(shè) zhangsan 先提交代碼,當 lisi 提交代碼時,會提示錯誤:
  提示用戶該文件已經(jīng)過期,需要先更新文件。
此時 lisi 需要先進行更新代碼,再提交代碼。
  這種情況,是最簡單的代碼沖突樣例。不同用戶修改了不同位置的代碼,因此只需要在提交前進行更新,就可以解決沖突。

修改同一文件相同位置引發(fā)的沖突

還是這個例子,zhangsan 當前代碼如下,版本號為9,

public void Test{
    System.out.println("Test!xingoo");
    return 1;
}

lisi 代碼如下,版本號為10,

public void Test{
    System.out.println("Test!xingoo");
    return 0;
}

此時 lisi 的代碼是最新的版本。
這時,zhangsan 想要修改第三行的返回值如下,

public void Test{
    System.out.println("Test!xingoo");
    return 2;
}

這時提交代碼會出現(xiàn)提示,發(fā)生錯誤,需要更新,OK,更新之后再次提交還是報錯,提示 文件存在沖突!

觀察文件目錄,會發(fā)現(xiàn)多了三個文件


SVN文件沖突

分別打開三個文件:
其中<<<<<<.mine到====之間為當前用戶修改的內(nèi)容;
====到>>>>>.r10為版本庫中的內(nèi)容:

public void Test{
    System.out.println("Test!xingoo");
<<<<<<< .mine
    return 2;
=======
    return 0;
>>>>>>> .r10
}

test.txt.mine 記錄當前用戶修改后的文件內(nèi)容快照

public void Test{
    System.out.println("Test!xingoo");
    return 2;
}

test.txt.r9 記錄當前用戶修改前,版本庫中的內(nèi)容快照

public void Test{
    System.out.println("Test!xingoo");
    return 1;
}

test.txt.r10 記錄當前版本庫中內(nèi)容快照

public void Test{
    System.out.println("Test!xingoo");
    return 0;
}

通過這四個文件就可以很快速的發(fā)現(xiàn),哪里有沖突。

至于如何修改:

直接拷貝mine文件,然后把r10文件的r10后綴去掉,進行更新。更新后,對比mine中的內(nèi)容在進行修改。

也可以直接與其他人員進行協(xié)商溝通;更新版本庫中的內(nèi)容。

6、排序算法

冒泡排序

左右相鄰的兩個數(shù)進行比較,將大的放到右邊,小的放到左邊,每次排序都會將最大的數(shù)放到序列的最后,最差時間復(fù)雜度為 O(n^2),最好情況為 O(n)

public class BubbleSort {
    public static void sort(int[] num) {
        for (int i = 0; i < num.length - 1; i++) {
            int demo = 0;
            for(int j = 0; j < num.length -1-i; j++) {
                if (num[j] > num[j + 1]) {
                    demo = num[j];
                    num[j] = num[j + 1];
                    num[j + 1] = demo;
                }
            }
        }
        for(int k = 0; k < num.length; k++) {
            System.out.print(num[k] + ", ");
        }
    }   

    public static void main(String[] args) {
        int[] num = {8, 2, 3, 1, 6, 9, 7};
        sort(num);
    }
}
插入排序

將序列的第一個數(shù)默認為已排序序列,從第二個數(shù)開始(目標數(shù)get),對已排序序列進行從后往前的比較,如果已排序序列的當前數(shù)大于get,則該元素移動到下一位,重復(fù)比較,直到已排序序列的當前數(shù)小于get,則在該元素后一個位置將get插入。

最好空間復(fù)雜度為 O(n),最壞為O(n^2),與冒泡排序類似。

這個過程類似與打撲克摸手牌,此時已排序序列表左手已經(jīng)抓好的牌,get表示右手新摸到的牌,從右往左進行比較,直到有小于get的牌,在其后插入get。

public class InsertionSort {
    public static void insertion(int[] arr) {
        int len = arr.length;
        for(int i = 1; i < len; i++) {
            int get = arr[i];
            int j = i -1;
            while(j >= 0 && get < arr[j]) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = get;
        }
    }
    
    public static void main(String[] args) {
        int[] arr = {2, 3, 1, 5, 6};
        insertion(arr);
        for(int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內(nèi)容