1. 程式人生 > >【JAVA面試】java面試題整理(1)

【JAVA面試】java面試題整理(1)

                                       java面試題整理(1)

JAVA常考點總結1

目錄

1、輸入網址,瀏覽器的響應過程

1、瀏覽器根據域名通過DNS伺服器查詢域名對應的伺服器的IP地址

2、瀏覽器主機根據IP地址與伺服器建立TCP連線。

3、瀏覽器將訪問請求封裝為一個HTTP請求報文,通過TCP協議傳送給伺服器。

4、伺服器收到請求並響應,生成一個HTTP響應報文,通過TCP協議傳送給瀏覽器主機。

5、瀏覽器得到響應報文之後,對響應報文進行解析以及渲染輸出。

5、瀏覽器非同步請求其他資源

2、程序和執行緒的區別

一、各自包含什麼?

程序是執行緒的容器,因此簡單地來講,一個程序內部包含一個或多個執行緒。

執行緒是程序的一個實體,包含程式計數器(指向當前指令)、暫存器(儲存執行緒內的區域性變數)和堆疊。

二、可獨立執行嗎?

程序是正在執行程式的一個例項,因此程序可以獨立執行。

執行緒依託於程序,執行緒不可獨立於程序而執行。

三、擁有系統資源嗎?

程序是系統進行資源分配基本單位,所以程序擁有系統資源。

執行緒不擁有系統資源,或者說很少。

四、獨立還是共享

各個程序有獨立的地址空間,即程序間互獨立。

處在同一個程序內的所有執行緒共享此程序內的所有資源,即同一程序內的執行緒資源共享。

五、建立與切換的開銷比較

從狹義上來講,程序是正在執行的程式的一個例項,啟動一個程式即建立一個程序,開銷是很大的。

執行緒是一種輕量級的程序,執行緒比程序小,基本上不擁有系統資源,因此建立執行緒的開銷比建立程序小得多。

3、如何老道介紹自己的專案

(1)先從業務需求入手,我為什麼做這個專案。

(2)專案裡有什麼功能,我負責了哪些模組。

(3)專案具體用到了什麼技術。

(4)專案最後達到了一個怎樣的效果,下載量、活躍度、盈利等。

4、反轉單鏈表

連結串列結點定義為:

 public class ListNode {

        int val;

        ListNode next;

        ListNode(int val) {

            this.val = val;

        }

    }

這裡我們採用兩種方法,分別是迭代與遞迴。

(1)迭代

從連結串列頭部開始處理,我們需要定義三個連續的結點pPre,當前需要反轉的結點pCur,下一個需要反轉的結點pFuture和一個永遠指向頭結點的pFirst。每次我們只需要將pPre指向pFuture,pCur指向pFirst,調整頭結點pFirst,調整當前需要反轉的結點為下一個結點即pFuture,最後調整pFuture為pCur的next結點。

public ListNode reverseList(ListNode head) {

        if (head == null) {

            return null;

        }

        //始終指向連結串列的頭結點

        ListNode pFirst = head;

        //三個結點中的第一個結點

        ListNode pPre = pFirst;

        //當前需要反轉的結點

        ListNode pCur = head.next;

        //下一次即將需要反轉的結點

        ListNode pFuture = null;

        while (pCur != null) {

            pFuture = pCur.next;

            pPre.next = pFuture;

            pCur.next = pFirst;

            pFirst = pCur;

            pCur = pFuture;

        }

        return pFirst;

    }

(2)遞迴

遞迴與迭代不同,遞迴是從連結串列的尾結點開始,反轉尾結點與前一個結點的指向。

程式碼演示:

public ListNode reverseList2(ListNode head) {

        if (head == null || head.next == null) {

            return head;

        }

        ListNode pNext = head.next;

        head.next = null;

        ListNode reverseListNode = reverseList2(pNext);

        pNext.next = head;

        return reverseListNode;

    }

5、OSI七層網路模型,每層的功能以及有哪些協議

在網際網路中實際使用的是TCP/IP參考模型。實際存在的協議主要包括在:物理層、資料鏈路層、網路層、傳輸層和應用層。各協議也分別對應這5個層次而已。

要找出7個層次所對應的各協議,恐怕會話層和表示層的協議難找到啊。。

       【1】物理層:主要定義物理裝置標準,如網線的介面型別、光纖的介面型別、各種傳輸介質的傳輸速率等。它的主要作用是傳輸位元流(就是由1、0轉化為電流強弱來進行傳輸,到達目的地後在轉化為1、0,也就是我們常說的數模轉換與模數轉換),這一層的資料叫做位元。

  【2】資料鏈路層:定義瞭如何讓格式化資料以進行傳輸,以及如何讓控制對物理介質的訪問,這一層通常還提供錯誤檢測和糾正,以確保資料的可靠傳輸。

  【3】網路層:在位於不同地理位置的網路中的兩個主機系統之間提供連線和路徑選擇,Internet的發展使得從世界各站點訪問資訊的使用者數大大增加,而網路層正是管理這種連線的層。

  【4】傳輸層:定義了一些傳輸資料的協議和埠號(WWW埠80等),如:TCP(傳輸控制協議,傳輸效率低,可靠性強,用於傳輸可靠性要求高,資料量大的資料),UDP(使用者資料報協議,與TCP特性恰恰相反,用於傳輸可靠性要求不高,資料量小的資料,如QQ聊天資料就是通過這種方式傳輸的), 主要是將從下層接收的資料進行分段和傳輸,到達目的地址後再進行重組,常常把這一層資料叫做段。

  【5】會話層:通過傳輸層(埠號:傳輸埠與接收埠)建立資料傳輸的通路,主要在你的系統之間發起會話或者接受會話請求(裝置之間需要互相認識可以是IP也可以是MAC或者是主機名)。

  【6】表示層:可確保一個系統的應用層所傳送的資訊可以被另一個系統的應用層讀取。例如,PC程式與另一臺計算機進行通訊,其中一臺計算機使用擴充套件二一十進位制交換碼(EBCDIC),而另一臺則使用美國資訊交換標準碼(ASCII)來表示相同的字元。如有必要,表示層會通過使用一種通格式來實現多種資料格式之間的轉換。

  【7】應用層: 是最靠近使用者的OSI層,這一層為使用者的應用程式(例如電子郵件、檔案傳輸和終端模擬)提供網路服務。

 以下列表是一些協議的歸類,如果有錯了或不對的地方,希望各位大神多多提出!其實在應用、表示和會話這三層之間的協議可共用(由於實際的網路協議將它們歸了一類所致)

應用層

DHCP · DNS · FTP · Gopher · HTTP · IMAP4 · IRC · NNTP · XMPP · POP3 · SIP · SMTP ·

SNMP · SSH · TELNET · RPC · RTCP · RTP ·RTSP · SDP · SOAP · GTP · STUN · NTP · SSDP

表示層

HTTP/HTML · FTP · Telnet · ASN.1(具有表示層功能)

會話層

ADSP·ASP·H.245·ISO-SP·iSNS·NetBIOS·PAP·RPC·

RTCP·SMPP·SCP·SSH·ZIP·SDP(具有會話層功能)

傳輸層

TCP · UDP · TLS · DCCP · SCTP ·RSVP · PPTP

網路層

IP (IPv4 · IPv6) · ICMP · ICMPv6 · IGMP ·IS-IS · IPsec · BGP · RIP · OSPF ·ARP · RARP

資料鏈路層

Wi-Fi(IEEE 802.11) · WiMAX(IEEE 802.16) ·ATM · DTM · 令牌環 · 乙太網路 ·

FDDI · 幀中繼 · GPRS · EVDO · HSPA · HDLC · PPP · L2TP · ISDN ·STP

物理層

乙太網路卡 · 調變解調器 · 電力線通訊(PLC) · SONET/SDH(光同步數字傳輸網) ·

G.709(光傳輸網路) · 光導纖維 · 同軸電纜 · 雙絞線

6、String、StringBuilder、StringBuffer三者的區別

三者都是處理字串常用的類,不同在於:

速度上:String<StringBuffer<StringBuilder;

安全上:StringBuffer執行緒安全,StringBuilder執行緒不安全;

原因在於,String的每次改變都會涉及到字元陣列的複製,而StringBuffer和StringBuilder直接在字元陣列上改變;同時,StringBuffer是執行緒安全的,而StringBuilder執行緒不安全,沒有StringBuffer的同步,所以StringBuilder快於StringBuffer。

總結:

如果對字串的改變少,使用String;

如果對字串修改的較多,需要執行緒安全就用StringBuffer,不需要就使用StringBuilder。

7、氣泡排序

氣泡排序的優化版本

 public static void bubbleSort(int[] a) {

        boolean flag = true;//flag表示這一趟是否存在元素調換

        while (flag) {

            flag = false;

            int temp = 0;

            for (int i = 0; i < a.length; i++) {

                for (int j = 0; j < a.length - i - 1; j++) {

                    if (a[j] > a[j + 1]) {

                        temp = a[j];

                        a[j] = a[j + 1];

                        a[j + 1] = temp;

                        flag = true;

                    }

                }

                //flag為false表示本趟不存在元素調換

                if (!flag) {

                    break;

                }

            }

        }

    }

8、二分查詢

//非遞迴

    public static int binarySearch1(int[] a, int key, int low, int high) {

        while (low <= high) {

            int mid = (low + high) / 2;

            if (key == a[mid]) {

                return mid;

            } else if (key > a[mid]) {

                low = mid + 1;

            } else {

                high = mid - 1;

            }

        }

        return -1;

    }

    //遞迴

    public static int binarySearch2(int[] a, int key, int low, int high) {

        if (low <= high) {

            int mid = (low + high) / 2;

            if (key == a[mid]) {

                return mid;

            } else if (key > a[mid]) {

                return binarySearch2(a, key, mid + 1, high);

            } else {

                return binarySearch2(a, key, low, mid - 1);

            }

        }

        return -1;

    }

9、sleep與wait的區別

【1】原理不同

(1)sleep用於執行緒控制自身的流程,使自己暫停指定的時間,把執行機會讓給其他執行緒,時間到,則自動甦醒。

(2)wait為Object類的方法(Object類中的其他方法見Object類的方法簡談),用於執行緒之間的通訊,會使擁有當前物件鎖的執行緒等待,直到其他執行緒呼叫notify或notifyAll方法才醒來。當然也可以指定時間,時間到,則自動醒來。

【2】對鎖的處理機制不同

(1)sleep不涉及執行緒之間的通訊,呼叫sleep方法不會釋放鎖

(2)wait方法,執行緒會釋放掉它所佔用的鎖,從而使得該執行緒所在的物件中的synchronized資料被其他執行緒使用。

【3】使用區域不同

(1)sleep方法可以放在任何地方使用,不用加任何限制

(2)wait方法必須放在同步控制方法或者同步語句塊中使用

【4】異常捕獲

(1)sleep方法必須捕獲異常,因為在某個執行緒的sleep過程中,有可能被其他物件呼叫它的interrupt方法,從而產生InterruptedException異常,因此需要捕獲。

(2)wait、notify和notifyAll方法都不需要捕獲異常

由於sleep方法不會釋放物件鎖,容易導致死鎖問題的產生。因此,在一般的情況下,不推薦使用sleep方法,而推薦使用wait方法。

10、資料庫事務ACID與隔離級別

如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性:

原子性(Atomicity)

  原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的概念,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。

一致性(Consistency)

  一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。

  拿轉賬來說,假設使用者A和使用者B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個使用者的錢相加起來應該還得是5000,這就是事務的一致性。

隔離性(Isolation)

  隔離性是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。

  即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後才開始,這樣每個事務都感覺不到有其他事務在併發地執行。

  關於事務的隔離性資料庫提供了多種隔離級別,稍後會介紹到。

永續性(Durability)

  永續性是指一個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

  例如我們在使用JDBC操作資料庫時,在提交事務方法後,提示使用者事務操作完成,當我們程式執行完成直到看到提示後,就可以認定事務以及正確提交,即使這時候資料庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是資料庫因為故障而沒有執行事務的重大錯誤。

  以上介紹完事務的四大特性(簡稱ACID),現在重點來說明下事務的隔離性,當多個執行緒都開啟事務操作資料庫中的資料時,資料庫系統要能進行隔離操作,以保證各個執行緒獲取資料的準確性,在介紹資料庫提供的各種隔離級別之前,我們先看看如果不考慮事務的隔離性,會發生的幾種問題:

髒讀

  髒讀是指在一個事務處理過程裡讀取了另一個未提交的事務中的資料。

  當一個事務正在多次修改某個資料,而在這個事務中這多次的修改都還未提交,這時一個併發的事務來訪問該資料,就會造成兩個事務得到的資料不一致。例如:使用者A向用戶B轉賬100元,對應SQL命令如下

    update account set money=money+100 where name=’B’;  (此時A通知B)

    update account set money=money - 100 where name=’A’;

  當只執行第一條SQL時,A通知B檢視賬戶,B發現確實錢已到賬(此時即發生了髒讀),而之後無論第二條SQL是否執行,只要該事務不提交,則所有操作都將回滾,那麼當B以後再次檢視賬戶時就會發現錢其實並沒有轉。

不可重複讀

  不可重複讀是指在對於資料庫中的某個資料,一個事務範圍內多次查詢卻返回了不同的資料值,這是由於在查詢間隔,被另一個事務修改並提交了。

  例如事務T1在讀取某一資料,而事務T2立馬修改了這個資料並且提交事務給資料庫,事務T1再次讀取該資料就得到了不同的結果,傳送了不可重複讀。

  不可重複讀和髒讀的區別是,髒讀是某一事務讀取了另一個事務未提交的髒資料,而不可重複讀則是讀取了前一事務提交的資料。

  在某些情況下,不可重複讀並不是問題,比如我們多次查詢某個資料當然以最後查詢得到的結果為主。但在另一些情況下就有可能發生問題,例如對於同一個資料A和B依次查詢就可能不同,A和B就可能打起來了……

虛讀(幻讀)

  幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中所有的行的某個資料項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行資料項,而這個資料項的數值還是為“1”並且提交給資料庫。而操作事務T1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務T2中新增的,就好像產生幻覺一樣,這就是發生了幻讀。

  幻讀和不可重複讀都是讀取了另一條已經提交的事務(這點就髒讀不同),所不同的是不可重複讀查詢的都是同一個資料項,而幻讀針對的是一批資料整體(比如資料的個數)。

  現在來看看MySQL資料庫為我們提供的四種隔離級別:

① Serializable (序列化):可避免髒讀、不可重複讀、幻讀的發生。

② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。

③ Read committed (讀已提交):可避免髒讀的發生。

④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

  以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當然級別越高,執行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(類似於Java多執行緒中的鎖)使得其他的執行緒只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。在MySQL資料庫中預設的隔離級別為Repeatable read (可重複讀)。

  在MySQL資料庫中,支援上面四種隔離級別,預設的為Repeatable read (可重複讀);而在Oracle資料庫中,只支援Serializable (序列化)級別和Read committed (讀已提交)這兩種級別,其中預設的為Read committed級別。

  在MySQL資料庫中檢視當前事務的隔離級別:

    select @@tx_isolation;

  在MySQL資料庫中設定事務的隔離 級別:

    set  [glogal | session]  transaction isolation level 隔離級別名稱;

    set tx_isolation=’隔離級別名稱;’

例1:檢視當前事務的隔離級別:

例2:將事務的隔離級別設定為Read uncommitted級別:

或:

記住:設定資料庫的隔離級別一定要是在開啟事務之前!

  如果是使用JDBC對資料庫的事務設定隔離級別的話,也應該是在呼叫Connection物件的setAutoCommit(false)方法之前。呼叫Connection物件的setTransactionIsolation(level)即可設定當前連結的隔離級別,至於引數level,可以使用Connection物件的欄位:

在JDBC中設定隔離級別的部分程式碼:

  後記:隔離級別的設定只對當前連結有效。對於使用MySQL命令視窗而言,一個視窗就相當於一個連結,當前視窗設定的隔離級別只對當前視窗中的事務有效;對於JDBC操作資料庫來說,一個Connection物件相當於一個連結,而對於Connection物件設定的隔離級別只對該Connection物件有效,與其他連結Connection物件無關。

11、http與https的區別

超文字傳輸協議HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞資訊,HTTP協議以明文方式傳送內容,不提供任何方式的資料加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的資訊,因此,HTTP協議不適合傳輸一些敏感資訊,比如:信用卡號、密碼等支付資訊。

為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文字傳輸協議HTTPS,為了資料傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證伺服器的身份,併為瀏覽器和伺服器之間的通訊加密。

一、HTTP和HTTPS的基本概念

HTTP:是網際網路上應用最為廣泛的一種網路協議,是一個客戶端和伺服器端請求和應答的標準(TCP),用於從WWW伺服器傳輸超文字到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網路傳輸減少。

HTTPS:是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。

HTTPS協議的主要作用可以分為兩種:一種是建立一個資訊保安通道,來保證資料傳輸的安全;另一種就是確認網站的真實性。

二、HTTP與HTTPS有什麼區別?

HTTP協議傳輸的資料都是未加密的,也就是明文的,因此使用HTTP協議傳輸隱私資訊非常不安全,為了保證這些隱私資料能加密傳輸,於是網景公司設計了SSL(Secure Sockets Layer)協議用於對HTTP協議傳輸的資料進行加密,從而就誕生了HTTPS。

簡單來說,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全。

HTTPS和HTTP的區別主要如下:

1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。

2、http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。

3、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。

4、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。

三、HTTPS的工作原理

我們都知道HTTPS能夠加密資訊,以免敏感資訊被第三方獲取,所以很多銀行網站或電子郵箱等等安全級別較高的服務都會採用HTTPS協議。

1、客戶端發起HTTPS請求

這個沒什麼好說的,就是使用者在瀏覽器裡輸入一個https網址,然後連線到server的443埠。

2、服務端的配置

採用HTTPS協議的伺服器必須要有一套數字證書,可以自己製作,也可以向組織申請,區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費服務)。

這套證書其實就是一對公鑰和私鑰,如果對公鑰和私鑰不太理解,可以想象成一把鑰匙和一個鎖頭,只是全世界只有你一個人有這把鑰匙,你可以把鎖頭給別人,別人可以用這個鎖把重要的東西鎖起來,然後發給你,因為只有你一個人有這把鑰匙,所以只有你才能看到被這把鎖鎖起來的東西。

3、傳送證書

這個證書其實就是公鑰,只是包含了很多資訊,如證書的頒發機構,過期時間等等。

4、客戶端解析證書

這部分工作是有客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。

如果證書沒有問題,那麼就生成一個隨機值,然後用證書對該隨機值進行加密,就好像上面說的,把隨機值用鎖頭鎖起來,這樣除非有鑰匙,不然看不到被鎖住的內容。

5、傳送加密資訊

這部分傳送的是用證書加密後的隨機值,目的就是讓服務端得到這個隨機值,以後客戶端和服務端的通訊就可以通過這個隨機值來進行加密解密了。

6、服務段解密資訊

服務端用私鑰解密後,得到了客戶端傳過來的隨機值(私鑰),然後把內容通過該值進行對稱加密,所謂對稱加密就是,將資訊和私鑰通過某種演算法混合在一起,這樣除非知道私鑰,不然無法獲取內容,而正好客戶端和服務端都知道這個私鑰,所以只要加密演算法夠彪悍,私鑰夠複雜,資料就夠安全。

7、傳輸加密後的資訊

這部分資訊是服務段用私鑰加密後的資訊,可以在客戶端被還原。

8、客戶端解密資訊

客戶端用之前生成的私鑰解密服務段傳過來的資訊,於是獲取瞭解密後的內容,整個過程第三方即使監聽到了資料,也束手無策。

六、HTTPS的優點

正是由於HTTPS非常的安全,攻擊者無法從中找到下手的地方,從站長的角度來說,HTTPS的優點有以下2點:

1、SEO方面

谷歌曾在2014年8月份調整搜尋引擎演算法,並稱“比起同等HTTP網站,採用HTTPS加密的網站在搜尋結果中的排名將會更高”。

2、安全性

儘管HTTPS並非絕對安全,掌握根證書的機構、掌握加密演算法的組織同樣可以進行中間人形式的攻擊,但HTTPS仍是現行架構下最安全的解決方案,主要有以下幾個好處:

(1)、使用HTTPS協議可認證使用者和伺服器,確保資料傳送到正確的客戶機和伺服器;

(2)、HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全,可防止資料在傳輸過程中不被竊取、改變,確保資料的完整性。

(3)、HTTPS是現行架構下最安全的解決方案,雖然不是絕對安全,但它大幅增加了中間人攻擊的成本。

七、HTTPS的缺點

雖然說HTTPS有很大的優勢,但其相對來說,還是有些不足之處的,具體來說,有以下2點:

1、SEO方面

據ACM CoNEXT資料顯示,使用HTTPS協議會使頁面的載入時間延長近50%,增加10%到20%的耗電,此外,HTTPS協議還會影響快取,增加資料開銷和功耗,甚至已有安全措施也會受到影響也會因此而受到影響。

而且HTTPS協議的加密範圍也比較有限,在黑客攻擊、拒絕服務攻擊、伺服器劫持等方面幾乎起不到什麼作用。

最關鍵的,SSL證書的信用鏈體系並不安全,特別是在某些國家可以控制CA根證書的情況下,中間人攻擊一樣可行。

2、經濟方面

(1)、SSL證書需要錢,功能越強大的證書費用越高,個人網站、小網站沒有必要一般不會用。

(2)、SSL證書通常需要繫結IP,不能在同一IP上繫結多個域名,IPv4資源不可能支撐這個消耗(SSL有擴充套件可以部分解決這個問題,但是比較麻煩,而且要求瀏覽器、作業系統支援,Windows XP就不支援這個擴充套件,考慮到XP的裝機量,這個特性幾乎沒用)。

(3)、HTTPS連線快取不如HTTP高效,大流量網站如非必要也不會採用,流量成本太高。

(4)、HTTPS連線伺服器端資源佔用高很多,支援訪客稍多的網站需要投入更大的成本,如果全部採用HTTPS,基於大部分計算資源閒置的假設的VPS的平均成本會上去。

(5)、HTTPS協議握手階段比較費時,對網站的相應速度有負面影響,如非必要,沒有理由犧牲使用者體驗。

12、執行緒安全的單例模式

(1)執行緒安全且效能較好的懶漢式(DCL)

public class SingletonDCL {

    private static SingletonDCL instance;

    private SingletonDCL() {

    }

    public static SingletonDCL getInstance() {

        if (instance == null) {

            synchronized (Singleton.class) {

                if (instance == null) {

                    instance = new SingletonDCL();

                }

            }

        }

        return instance;

    }

}

(2)靜態內部類

public class Singleton {

    private Singleton() {

    }

    private static class SingletonHolder {

        private static Singleton instance = new Singleton();

    }

    public static Singleton getInstance() {

        return SingletonHolder.instance;

    }

}

這樣做得好處是

(1)靜態內部類不會在類載入時就建立此類的例項,只有在顯示呼叫此靜態內部類時,此靜態內部類才會被載入,內部的物件例項才會被賦值,起到懶載入的作用。

(3)和餓漢式一樣,使用類載入機制,避免多執行緒下的同步問題。

13、get與post的區別

(1)get請求將資料附在URL之後(以?分割URL與具體資料,引數之間用&隔開,資料放在HTTP協議頭,),而post請求將資料放在請求體中。

(2)get的URL會有長度上的限制,而post理論上不會有長度的限制,還是得看具體瀏覽器和伺服器的配置。

(3)post比get稍微安全一點,體現在我們不可以直接看到請求的資料。或者說,get請求一般是用來獲取資料,而post用來更新或修改伺服器上的資料,造成的影響不同。

(4)get請求會被瀏覽器快取,而post請求不會被快取。

(5)GET和POST還有一個重大區別,簡單的說:GET產生一個TCP資料包;POST產生兩個TCP資料包。對於GET方式的請求,瀏覽器會把http header和data一併傳送出去,伺服器響應200(返回資料); 而對於POST,瀏覽器先發送header,伺服器響應100 continue,瀏覽器再發送data,伺服器響應200 ok(返回資料)。

(6)GET方法是安全、冪等、可快取的(除非有 Cache-ControlHeader的約束),GET方法的報文主體沒有任何語義。POST的語義是根據請求負荷(報文主體)對指定的資源做出處理,具體的處理方式視資源型別而不同。POST不安全,不冪等,(大部分實現)不可快取。(冪等的概念是指同一個請求方法執行多次和僅執行一次的效果完全相同。)

14、按層遍歷二叉樹

public void layerOrder(TreeNode root) {

        LinkedList<TreeNode> list = new LinkedList<>();

        TreeNode t;

        if (root != null) {

            list.push(root);

        }

        while (!list.isEmpty()) {

            t = list.removeFirst();

            System.out.print(t.getValue());

            if (t.getLeft() != null) {

                list.addLast(t.getLeft());

            }

            if (t.getRight() != null) {

                list.addLast(t.getRight());

            }

        }

    }

15、索引優化策略

(1)建立聯合索引時,需滿足最左字首匹配原則

(2)主鍵外來鍵一定要建索引

(3)對 where,on,group by,order by 中出現的列使用索引

(4)儘量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃描的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別欄位可能在大資料面前區分度就是0

(5)對較小的資料列使用索引,這樣會使索引檔案更小,同時記憶體中也可以裝載更多的索引鍵

(6)索引列不能參與計算,保持列“乾淨”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很簡單,b+樹中存的都是資料表中的欄位值,但進行檢索時,需要把所有元素都應用函式才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(’2014-05-29’);

(7)為較長的字串使用字首索引

(8)儘量的擴充套件索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可

(9)不要過多建立索引, 權衡索引個數與DML之間關係,DML也就是插入、刪除資料操作。這裡需要權衡一個問題,建立索引的目的是為了提高查詢效率的,但建立的索引過多,會影響插入、刪除資料的速度,因為我們修改的表資料,索引也需要進行調整重建

(10)對於like查詢,”%”不要放在前面。

SELECT  *  FROM houdunwang WHERE unameLIKE  '後盾%' -- 走索引

SELECT  *  FROM houdunwang WHERE unameLIKE  "%後盾%" -- 不走索引

(11)查詢where條件資料型別不匹配也無法使用索引

(12)字串與數字比較不使用索引;

CREATE TABLEa(  a  char(10)  );

EXPLAIN  SELECT  *  FROM  a  WHERE  a= "1" – 走索引

EXPLAIN  SELECT  *  FROM  a  WHERE  a= 1 – 不走索引

(13)正則表示式不使用索引,這應該很好理解,所以為什麼在SQL中很難看到regexp關鍵字的原因

語句一:select name from 商品表。不會用到索引,因為沒有where語句。

語句二:select * from 商品表 where name = ‘Java書’,會用到索引,如果專案裡經常用到name來查詢,且商品表的資料量很大,而name值的重複率又不高,那麼建議建索引。

語句三:select * from 商品表 where name like ‘Java%’ 這是個模糊查詢,會用到索引,請大家記住,用like進行模糊查詢時,如果第一個就是模糊的匹配符,比如where name like ‘%java’,那麼在查詢時不會走索引。在其他情況下,不論用了多少個%,也不論%的位置,只要不出現在第一個位置,那麼都能用到索引。

學生成績表裡有兩個欄位:姓名和成績。現在對成績這個整數型別的欄位建索引。

第一種情況,當數字型欄位遇到非等值操作符時,無法用到索引。比如:

​ select name from 學生成績表 where 成績>95 , 一旦出現大於符號,就不能用到索引,為了用到索引,我們應該改一下SQL語句裡的where從句:where 成績 in (96,97,98,99,100)

第二種情況,如果對索引欄位進行了某種左值操作,那麼無法用到索引。

​ 能用到索引的寫法:select name from 學生成績表 where 成績 = 60

​ 不能用到索引的寫法:select name from 學生成績表 where 成績+40 = 100

第三種情況,如果對索引欄位進行了函式操作,那麼無法用到索引。

​ 比如SQL語句:select * from 商品表 where substr(name) = ‘J’,我們希望查詢商品名首字母是J的記錄,可一旦針對name使用函式,即使name欄位上有索引,也無法用到。

16、三次握手與四次揮手是什麼?

三次握手過程圖

相關推薦

JAVA面試java試題整理1

                                       java面試題整理(1) JAVA常考點總結1 目錄

java試題整理1

pmap 復制 java對象 試題 取出 樹形 年輕代和老年代 com 足夠 1、Equals與==的區別?   ==是判斷兩個變量或者實例是不是指向同一個內存地址   equals是判斷兩個變量或者實例所指向的內存地址中的值是不是相同 2、Object有哪些公用方法?  

2018年JAVA試題整理1--基礎

最近個人也在準備找工作的事情!自己整理了一些JAVA面試題供大家參考,大家一起努力,找到一份好工作!如果大家還有一些基礎的面試題,可以評論給我!我做整理。謝謝大家分享。後續會提供比較難得面試題。Java面向物件的特徵是什麼三大特徵是:封裝、繼承和多型。(問到這些儘量回答出其含

JAVA面試java試題整理2

                                           java面試題整理(2) JAVA常考點總結2 目錄 1、

JAVA面試java試題整理3

                                     java面試題整理(3) JAVA常考點3 目錄 1. 講下JAVA的執行時區域 回答:執行時資料區整體分為兩類 執行緒私有和執行

JAVA面試java試題整理4

                                           java面試題整理(4) JAVA常考點4 目錄 Set集合如何保證不重複 弄清怎麼個邏輯達到元素不重複的,原始碼先上

Java多執行緒試題整理BATJ都愛問

今天給大家總結一下,面試中出鏡率很高的幾個多執行緒面試題,希望對大家學習和麵試都能有所幫助。備註:文中的程式碼自己實現一遍的話效果會更佳哦! 一、面試中關於 synchronized 關鍵字的 5 連擊 1.1 說一說自己對於 synchronized 關鍵字的瞭解 synchroniz

java試題整理4

10.索引的理解: 原文地址! 11.描述struts的工作流程:     struts1的工作流程:原文地址在這裡!   struts2的工作流程: 引用地址在這裡! 12.排序演算法有哪些?常見演算法練習?

java試題整理3

1.String為什麼是不可變的?        原文地址在這裡! 2.Tomcat,Jetty,Apache,Jboss,Nginx的區別: 原文地址在這裡 tomcat與Jetty:

java試題整理5

21.如何停止一個執行緒? 原文地址在這裡! 22.什麼是執行緒安全?synchronized 和 lock的區別? 以下內容來自於這裡! 23.wait和sleep,noti

Java試題—初級1

1.7 自動 多少 equals -a 創建 以及 cep 字節碼 1、一個".java"源文件中是否可以包括多個類(不是內部類)?有什麽限制? 可以有多個類,但只能有一個public的類,並且public的類名必須與文件名相一致。 2、Java有沒有g

.net開發者自學java系列使用Eclipse開發SpringMVC1

領域驅動設計 cuc HR 代碼 swagger cli FQ bdd http 第一篇隨筆,有點緊張。有錯別字是正常的。。。。 好了,自我描述下。我是一個有幾年.net開發經驗的老菜鳥。是的,老菜鳥。別跟我討論底層,別跟我討論協議。TMD啥都不會。 為什麽要學JAVA,我

Java試題全集1

1、面向物件的特徵有哪些方面? 答:面向物件的特徵主要有以下幾個方面: - 抽象:抽象是將一類物件的共同特徵總結出來構造類的過程,包括資料抽象和行為抽象兩方面。抽象只關注物件有哪些屬性和行為,並不關注這些行為的細節是什麼。 - 繼承:繼承是從已有類得到繼承資訊建立新類的過程。

劍指offer試題571:和為S的數字

題目 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,是的他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 ps: 對應每個測試案例,輸出兩個數,小的先輸出。 思路

Java GUI圖形使用者介面總結1

一、簡單視窗的顯示 import java.awt.Color; import java.awt.Container; import java.awt.Label; import javax.swing.*; public class SwingWin

java中級試題總結1

1、如何理解多型?類與物件的區別是什麼?  答:子類繼承父類時候 同時繼承父類方法,也重寫方法。 多型的三要素為:繼承;方法重寫;父類引用指向子類物件。 類是物件的抽象,物件是類的具體例項。 類是抽象的,不佔用記憶體,而物件是具體的,佔有記憶體空間。 例如:類就是水果,物

試題整理2

異常處理 特性 重新 有意 contain catch 類型 長度 all 1.什麽是叠代器? Iterator接口提供了很多對集合進行叠代的方法。每一個集合類都包含了可以返回叠代器實例的叠代方法。 叠代器可以在叠代過程中刪除底層集合的元素,但是不可以直接調用集合的re

Java面試系列總結 :JavaSE基礎1 面向物件/語法/異常

1. 面向物件都有哪些特性以及你對這些特性的理解 繼承:繼承是從已有類得到繼承資訊建立新類的過程。提供繼承資訊的類被稱為父類(超類、基類);得到繼承資訊的類被稱為子類(派生類)。繼承讓變化中的軟體系統有了一定的延續性,同時繼承也是封裝程式中可變因素的 重要

大資料相關試題整理簡單

1、hadoop:   1)hadoop是大資料分析的完整生態系統,從資料採集,儲存,分析,轉運,再到頁面展示,構成了整個流程     2)採集可以用flume,   3)儲存用hbase,hdfs,mangodb就相當於hbase,   4)分析用

python試題整理1-30

第一部分 Python基礎篇(80題)1、為什麼學習Python?     1、語言本身簡潔,優美,功能超級強大,     2、跨平臺,從桌面應用,web開發,自動化測試運維,爬蟲,人工智慧,大資料處理都能做     3、非常火爆的社群     4、很多有名的大公司堵在用2、