1. 程式人生 > 實用技巧 >純乾貨分享!2020阿里java崗筆試面試題總結(附答案)

純乾貨分享!2020阿里java崗筆試面試題總結(附答案)

前言

2020金九銀十馬上結束,現為大家整理了這次金九銀十面試阿里的面試題總結,都是我從朋友那拿到的面試真題,話不多說,滿滿的乾貨分享給大家!

int a=10是原子操作嗎?

是的。
注意點:

  • i++(或++i)是非原子操作,i++是一個多步操作,而且是可以被中斷的。i++可以被分割成3步,第一步讀取i的值,第二步計算i+1;第三部將最終值賦值給i。
    * int a = b;不是原子操作。從語法的級別來看,這是也是一條語句,是原子的;但是從實際執行的二進位制指令來看,由於現代計算機CPU架構體系的限制,資料不可以直接從記憶體搬運到另外一塊記憶體,必須藉助暫存器中斷,這條語句一般對應兩條計算機指令,即將變數b的值搬運到某個暫存器(如eax)中,再從該暫存器搬運到變數a的記憶體地址:
mov eax, dword ptr [b]  
mov dword ptr [a], eax 

既然是兩條指令,那麼多個執行緒在執行這兩條指令時,某個執行緒可能會在第一條指令執行完畢後被剝奪CPU時間片,切換到另外一個執行緒而產生不確定的情況。

innodb支援全文索引嗎?

5.6版本之後InnoDB儲存引擎開始支援全文索引,5.7版本之後通過使用ngram外掛開始支援中文。之前僅支援英文,因為是通過空格作為分詞的分隔符,對於中文來說是不合適的。MySQL允許在char、varchar、text型別上建立全文索引。

innodb支援表鎖嗎?

支援,補充:普通的增刪改 是表鎖,加入索引的增刪改是行鎖,執行查詢時不加任何鎖的。

HTTP短連線怎麼變成長連線。

在header中加入 --Connection:keep-alive。

呼叫yeild()會阻塞嗎?

阻塞指的是暫停一個執行緒的執行以等待某個條件發生(如某資源就緒)。
yield() 方法:yield() 使得執行緒放棄當前分得的 CPU 時間,但是不使執行緒阻塞,即執行緒仍處於可執行狀態,隨時可能再次分得 CPU 時間。呼叫 yield() 的效果等價於排程程式認為該執行緒已執行了足夠的時間從而轉到另一個執行緒。yield()只是使當前執行緒重新回到可執行狀態,所以執行yield()的執行緒有可能在進入到可執行狀態後馬上又被執行。sleep()可使優先順序低的執行緒得到執行的機會,當然也可以讓同優先順序和高優先順序的執行緒有執行的機會;yield()只能使同優先順序的執行緒有執行的機會。

虛擬機器棧是執行緒共享的嗎?

不是。

JVM初始執行的時候都會分配好 Method Area(方法區) 和Heap(堆) ,而JVM 每遇到一個執行緒,就為其分配一個 Program Counter Register(程式計數器) , VM Stack(虛擬機器棧)和Native Method Stack (本地方法棧), 當執行緒終止時,三者(虛擬機器棧,本地方法棧和程式計數器)所佔用的記憶體空間也會被釋放掉。這也是為什麼我把記憶體區域分為執行緒共享和非執行緒共享的原因,非執行緒共享的那三個區域的生命週期與所屬執行緒相同,而執行緒共享的區域與JAVA程式執行的生命週期相同,所以這也是系統垃圾回收的場所只發生線上程共享的區域(實際上對大部分虛擬機器來說只發生在Heap上)的原因。

棧區:
  • 每個執行緒包含一個棧區,棧中只儲存基礎資料型別的值(比如int i=1中1就是基礎型別的物件)和物件的引用以及基礎資料的引用
  • 每個棧中的資料(基礎資料型別和物件引用)都是私有的,其他棧不能訪問。
  • 棧分為3個部分:基本型別變數區、執行環境上下文、操作指令區(存放操作指令)。
堆區:
  • 儲存的全部是物件,每個物件都包含一個與之對應的class的資訊。(class的目的是得到操作指令)
  • jvm只有一個堆區(heap)被所有執行緒共享,堆中不存放基本型別和物件引用,只存放物件本身 。
方法區:
  • 又叫靜態區,跟堆一樣,被所有的執行緒共享。方法區包含所有的class和static變數。
  • 方法區中包含的都是在整個程式中永遠唯一的元素,如class,static變數。(兩者區別為堆區存放new出來的物件資訊,方法區存放本身就具有的類資訊)

常量存放在JVM的那個區域?

方法區: 又叫靜態區,跟堆一樣,被所有的執行緒共享。它用於儲存已經被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。

window.postMessage() 方法可以安全地實現跨源通訊。通常,對於兩個不同頁面的指令碼,只有當執行它們的頁面位於具有相同的協議(通常為https),埠號(443為https的預設值),以及主機 (兩個頁面的模數 Document.domain設定為相同的值) 時,這兩個指令碼才能相互通訊。window.postMessage() 方法提供了一種受控機制來規避此限制,只要正確的使用,這種方法就很安全。

所有的物件都分配到堆中嗎?

答:不一定。

CopyOnWriteArrayList是執行緒安全的嗎?

答:是的。
CopyOnWriteArrayList使用了一種叫寫時複製的方法,當有新元素新增到CopyOnWriteArrayList時,先從原有的陣列中拷貝一份出來,然後在新的陣列做寫操作,寫完之後,再將原來的陣列引用指向到新陣列。建立新陣列,並往新陣列中加入一個新元素,這個時候,array這個引用仍然是指向原陣列的。​​​​​​​當元素在新陣列新增成功後,將array這個引用指向新陣列。
CopyOnWriteArrayList的整個add操作都是在鎖的保護下進行的。這樣做是為了避免在多執行緒併發add的時候,複製出多個副本出來,把資料搞亂了,導致最終的陣列資料不是我們期望的。

	public boolean add(E e) {
		//1、先加鎖
		final ReentrantLock lock = this.lock;
		lock.lock();
		try {
			Object[] elements = getArray();
			int len = elements.length;
			//2、拷貝陣列
			Object[] newElements = Arrays.copyOf(elements, len + 1);
			//3、將元素加入到新陣列中
			newElements[len] = e;
			//4、將array引用指向到新陣列
			setArray(newElements);
			return true;
		} finally {
			//5、解鎖
			lock.unlock();
		}
	}

由於所有的寫操作都是在新陣列進行的,這個時候如果有執行緒併發的寫,則通過鎖來控制,如果有執行緒併發的讀,則分幾種情況:

  • 如果寫操作未完成,那麼直接讀取原陣列的資料;
  • 如果寫操作完成,但是引用還未指向新陣列,那麼也是讀取原陣列資料;
  • 如果寫操作完成,並且引用已經指向了新的陣列,那麼直接從新陣列中讀取資料。

可見,CopyOnWriteArrayList的讀操作是可以不用加鎖的。
CopyOnWriteArrayList 有幾個缺點:
由於寫操作的時候,需要拷貝陣列,會消耗記憶體,
如果原陣列的內容比較多的情況下,可能導致young gc或者full gc
不能用於實時讀的場景,像拷貝陣列、新增元素都需要時間,
所以呼叫一個set操作後,讀取到資料可能還是舊的,
雖然CopyOnWriteArrayList 能做到最終一致性,但是還是沒法滿足實時性要求;
CopyOnWriteArrayList 合適讀多寫少的場景,不過這類慎用
因為誰也沒法保證CopyOnWriteArrayList 到底要放置多少資料,
萬一資料稍微有點多,每次add/set都要重新複製陣列,這個代價實在太高昂了。
在高效能的網際網路應用中,這種操作分分鐘引起故障。
CopyOnWriteArrayList透露的思想

  • 讀寫分離,讀和寫分開
  • 最終一致性
  • 使用另外開闢空間的思路,來解決併發衝突​​​​​​​

陣列越界問題

一般來講我們使用時,會用一個執行緒向容器中新增元素,一個執行緒來讀取元素,而讀取的操作往往更加頻繁。寫操作加鎖保證了執行緒安全,讀寫分離保證了讀操作的效率,簡直完美。
如果這時候有第三個執行緒進行刪除元素操作,讀執行緒去讀取容器中最後一個元素,讀之前的時候容器大小為i,當去讀的時候刪除執行緒突然刪除了一個元素,這個時候容器大小變為了i-1,讀執行緒仍然去讀取第i個元素,這時候就會發生陣列越界。
測試一下,首先向CopyOnWriteArrayList裡面塞10000個測試資料,啟動兩個執行緒,一個不斷的刪除元素,一個不斷的讀取容器中最後一個數據。

    public void test(){
        for(int i = 0; i<10000; i++){
            list.add("string" + i);
        }

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    if (list.size() > 0) {
                        String content = list.get(list.size() - 1);
                    }else {
                        break;
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    if(list.size() <= 0){
                        break;
                    }
                    list.remove(0);
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

Java介面可以多繼承嗎?

java類是單繼承的。classB extends classA
java介面可以多繼承。Interface3 extends Interface0, Interface1, interface……
不允許類多重繼承的主要原因是,如果A同時繼承B和C,而B和C同時有一個D方法,A如何決定該繼承那一個呢?
但介面不存在這樣的問題,介面全都是抽象方法繼承誰都無所謂,所以介面可以繼承多個介面。

(byte)300==(byte)100+(short)200?

答:false。
java中byte的取值範圍是-128~127,發生上溢下溢時要模256;130>127上溢,故模256得130,仍溢位,再減256得-126,所以s=-126。300>127上溢,故模256得44,44在byte取值範圍內,故s=44.
300 的 二進位制是:100101100;byte強制轉換後從右往左取8位為:00101100;因為第八位為0所以為正數,又知道正數的原反補碼都相同;所以00101100轉換為十進位制是:44(32+8+4)
(byte)100+(short)200,byte和short的結果會自動轉為short不會溢位。所以(byte)100+(short)200=(short)300,而(byte)300的結果是44.即兩者不相等。

作業系統具有程序管理,儲存管理,檔案管理和裝置管理的功能,下列有關描述中,哪一項是不正確的? (A)

A.程序管理主要是對程式進行管理
B.儲存管理主要管理記憶體資源
C.檔案管理可以有效的支援對檔案的操作,解決檔案共享、保密和保護問題
D. 裝置管理是指計算機系統中除了CPU和記憶體以外的所有輸入輸出裝置的管理

this和super正確的是(C):

A、都可以用在main()方法中  B、都是指一個記憶體地址 
C、不能用在main()方法中  D、意義相同
public static void main(String[] args),main方法是靜態方法,不可以使用物件特有的this或super關鍵字。

引用計數法是JVM GC演算法嗎?

答:是。

能在try{}catch(){}finally{}結構的finally{}中再次丟擲異常嗎?

答:能。
Exception in thread “main” java.lang.Exception: 異常4
at com.test.FinallyTry.f(FinallyTry.java:16)
at com.test.FinallyTry.main(FinallyTry.java:5)

--------在finally中拋異常或者return 會掩蓋之前的異常

HTTP2新特性?

答:減少頭部的體積、新增請求優先順序、伺服器推送、多路複用。

索引可以將隨機IO變成順序IO嗎?

答:對。
隨機IO:假設我們所需要的資料是隨機分散在磁碟的不同頁的不同扇區中的,那麼找到相應的資料需要等到磁臂(定址作用)旋轉到指定的頁,然後碟片尋找到對應的扇區,才能找到我們所需要的一塊資料,依次進行此過程直到找完所有資料,這個就是隨機IO,讀取資料速度較慢。
順序IO:假設我們已經找到了第一塊資料,並且其他所需的資料就在這一塊資料後邊,那麼就不需要重新定址,可以依次拿到我們所需的資料,這個就叫順序IO。

transient修飾的變數是臨時變數嗎?

答:對。

  • 一旦變數被transient修飾,變數將不再是物件持久化的一部分,該變數內容在序列化後無法獲得訪問。
  • transient關鍵字只能修飾變數,而不能修飾方法和類。注意,本地變數是不能被transient關鍵字修飾的。變數如果是使用者自定義類變數,則該類需要實現SERIALIZABLE介面。
  • 被transient關鍵字修飾的變數不再能被序列化,一個靜態變數不管是否被transient修飾,均不能被序列化。
    注意點:在Java中,物件的序列化可以通過實現兩種介面來實現,若實現的是SERIALIZABLE介面,則所有的序列化將會自動進行,若實現的是Externalizable介面,則沒有任何東西可以自動序列化,需要在writeExternal方法中進行手工指定所要序列化的變數,這與是否被transient修飾無關。

高、中、低三級排程。

高階排程:即作業排程,按照一定策略將選擇磁碟上的程式裝入記憶體,並建立程序。(存在與多道批處理系統中)
中級排程:即交換排程,按照一定策略在內外存之間進行資料交換。
低階排程:即CPU排程(程序排程),按照一定策略選擇就緒程序,佔用cpu執行。
其中低度排程是必須的。

下面那個檢視80埠是否被佔用?

  • 方式一:ps -ef |grep 80
  • 方式二:netstat -anp |grep :80
  • 方式三:lsof -i:80
  • 方式四:netstat -tunlp |grep :80
  • 方式五:netstat -an |grep :80

C++弱引用指標是那個?

weak_ptr也是一個引用計數型智慧指標,但是它不增加物件的引用計數,即弱引用。與之相對,shared_ptr是強引用,只要有一個指向物件的shared_ptr存在,該物件就不會析構,直到指向物件的最後一個shared_ptr析構或reset()時才會被銷燬。
利用weak_ptr,我們可以解決常見的空懸指標問題以及迴圈引用問題。

下面不屬於類的構造方法具備的特點是( )。

  • A.沒有返回值
  • B.使用者可以通過new自動呼叫。
  • C.構造方法名必須和類名相同
  • D.使用者可以直接呼叫
  • D [解析] 構造方法是類中的一種特殊方法,是為物件初始化操作編寫的方法,用它來定義物件的初始狀態。在Java語言中的每個類都有構造方法,它也是由方法名、引數和方法體組成。構造方法名必須與類名相同,它沒有返回值,使用者不能直接呼叫它,只能通過new自動呼叫。

spx協議工作在哪一層?

SPX(Sequenced Packet Exchange protocol,順序包交換)協議是Novell開發的用在NetWare中的協議,用來確保資訊成功傳送。SPX使用NetWare的IPX協議作為它的傳遞機制並在網路結點間提供客戶伺服器和層對層的互動通訊。它工作在傳輸層。

TCP第四次揮手後為什麼要等待2MSL後才斷開連結?等待時間為什麼是2MSL?

  • 答:1.為了保證客戶端最後一次揮手的報文能夠到達伺服器,若第4次揮手的報文段丟失了,伺服器就會超時重傳第3次揮手的報文段,所以客戶端此時不是直接進入CLOSED,而是保持TIME_WAIT(等待2MSL就是TIME_WAIT)。當客戶端再次收到伺服器因為超時重傳而傳送的第3次揮手的請求時,客戶端就會重新給伺服器傳送第4次揮手的報文(保證伺服器能夠收到客戶端的迴應報文)。最後,客戶端、伺服器才真正斷開連線。說白了,等待2MSL就是為了確保伺服器能夠受到客戶端最後的迴應。

* 2.如果客戶端直接CLOSED,然後又再次向伺服器發起一個新連線,誰也不能保證新發起的連線和剛關閉的連線的埠號是不同的,有可能新、老連線的埠號就是一樣的。假設新、老連線埠號一致,若老連線的一些資料仍滯留在網路中,這些滯留資料在新連線建立後才到達伺服器,鑑於前後埠號一致,TCP協議就預設這些資料屬於新連線,於是資料就這樣亂成一鍋粥了。所以TCP連線還要在TIME_WAIT狀態下等待2MSL,確保所有老連線的資料都在網路中消失!

  • 3.首先說明什麼是MSL,MSL是Maximum Segment Lifetime的縮寫,譯為報文最大生存時間,也就是任何報文在網路上存活的最大時間,一旦超過該時間,報文就會被丟棄。2MSL也就是指的2倍MSL的時間。
    為什麼是2倍呢?

  • 主動斷開的一側為A,被動斷開的一側為B。

  • 第一個訊息:A發FIN

  • 第二個訊息:B回覆ACK

  • 第三個訊息:B發出FIN此時此刻:B單方面認為自己與A達成了共識,即雙方都同意關閉連線。此時,B能釋放這個TCP連線佔用的記憶體資源嗎?不能,B一定要確保A收到自己的ACK、FIN。所以B需要靜靜地等待A的第四個訊息的到來:

  • 第四個訊息:A發出ACK,用於確認收到B的FIN

當B接收到此訊息,即認為雙方達成了同步:雙方都知道連線可以釋放了,此時B可以安全地釋放此TCP連線所佔用的記憶體資源、埠號。所以被動關閉的B無需任何wait time,直接釋放資源。但,A並不知道B是否接到自己的ACK,A是這麼想的:
1)如果B沒有收到自己的ACK,會超時重傳FiN那麼A再次接到重傳的FIN,會再次傳送ACK
2)如果B收到自己的ACK,也不會再發任何訊息,包括ACK
無論是1還是2,A都需要等待,要取這兩種情況等待時間的最大值,以應對最壞的情況發生,這個最壞情況是:
去向ACK訊息最大存活時間(MSL) + 來向FIN訊息的最大存活時間(MSL)。這恰恰就是2MSL( Maximum Segment Life)。等待2MSL時間,A就可以放心地釋放TCP佔用的資源、埠號,此時可以使用該埠號連線任何伺服器。同時也能保證網路中老的連結全部消失。

程序有那些狀態,並簡單描述一下?

  • 程序其基本狀態有5種,即建立狀態、就緒狀態、執行狀態、阻塞狀態、終止狀態。
  • 建立狀態:程序在建立時需要申請一個空白PCB,向其中填寫控制和管理程序的資訊,完成資源分配。
  • 就緒狀態:程序已經準備好,已分配到所需資源,只要分配到CPU就能夠立即執行。
  • 執行狀態:程序處於就緒狀態被排程後,程序進入執行狀態。
  • 阻塞狀態:正在執行的程序由於某些事件而暫時無法執行,程序受到阻塞。
  • 終止狀態:程序結束,或出現錯誤,或被系統終止,進入終止狀態,無法再執行。
  • 程序是指計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位。
  • 程序狀態是指一個程序的生命週期可以劃分為一組狀態,這些狀態刻畫了整個程序,程序狀態即體現一個程序的生命狀態。

建立NIO客戶端程式碼。

package com.cn.niochat;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Scanner;

/**
 * 用Java實現nio的客戶端
 */
public class NioClient {

    public void start() throws IOException {
        /**
         * 連結伺服器端
         */
        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1",8000));

        //向伺服器端傳送資料
        //從命令列獲取資料,獲取鍵盤的輸入
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()){
            //獲取這一行資料
           String request =  scanner.nextLine();
           //如果有資料,則傳送,且資料不為空
           if(request != null && request.length() > 0){
               socketChannel.write(Charset.forName("UTF-8").encode(request));
           }
        }
    }

    public static void main(String[] args) throws IOException {
        NioClient nioClient = new NioClient();
        nioClient.start();
    }
}

獲取一個類的class例項的方法有那些?

  • (1).呼叫執行時類本身的.class屬性
        Class clazz = String.class;
  • (2),通過執行時類的物件獲取
        public final Class<?> getClass()是非靜態方法.
        Person p = new Person();
        Class clazz = p.getClass();
  • (3)通過Class的靜態方法獲取:體現反射的動態性
        String className = “java.util.commons”;
        Class clazz = Class.forName(className);
  • (4)通過類的載入器
        String className = “java.util.commons”;
        ClassLoader classLoader = this.getClass().getClassLoader();
        Class claz = classLoader.loadClass(className);

a、b、c、d、e、f字元出現的次數分別為16、5、12、17、10、25。編碼的最少位元組是多少?

(25+16+17)×2+12×3+(5+10)×4=212。

MySQL中獲得結果集的記錄並在此記錄上做特殊的操作的最佳物件是?

遊標。

System.out.println(1+1+“1”)輸出21。System.out.println(“1”+1+1);輸出111。

Java的+表示式計算是從左往右的。若是兩個整形,會求值,若其中之一是String,會拼接,且結果為String。1+1+“1”,先計算1+1,因為兩個都是整形,求值=2,然後2+“1”,拼接,所以是
21,而“1”+1+1,先計算“1”+1,因為有String,結果為’11",再“11”+1就是“111”。

成員變數,靜態方法看左邊;非靜態方法:編譯看左邊,執行看右邊。

意思是:當父類變數引用子類物件時(Fu f = new Zi();
),在這個引用變數f指向的物件中,他的成員變數和靜態方法與父類是一致的,他的非靜態方法,在編譯時是與父類一致的,執行時卻與子類一致(發生了複寫)。

class Fu {
	intnum = 5;
	static void method4() {
 		System.out.println("fu method_4");
	}
	void method3() {
	 	System.out.println("fu method_3");
	}
}

class Zi extends Fu {
	intnum = 8;
	static void method4() {//注意點:靜態方法不能重寫
 		System.out.println("zi method_4");
 	}
	void method3() {
	 	System.out.println("zi method_3");
	}
}

class DuoTaiDemo4 {

	 public static void main(String[] args) {
		 Fu f = new Zi();
		 System.out.println(f.num);//與父類一致
		 f.method4();//與父類一致
		 f.method3();//編譯時與父類一致,執行時與子類一致
		 Zi z = new Zi();
		 System.out.println(z.num);
		 z.method4();
		 z.method3();
	 }
}

1開頭的http狀態碼

  • 表示臨時響應並需要請求者繼續執行操作的狀態程式碼。
  • 100 (繼續) 請求者應當繼續提出請求。 伺服器返回此程式碼表示已收到請求的第一部分,正在等待其餘部分。
  • 101 (切換協議) 請求者已要求伺服器切換協議,伺服器已確認並準備切換。

2開頭的http狀態碼

  • 表示請求成功
  • 200 成功處理了請求,一般情況下都是返回此狀態碼;
  • 201 請求成功並且伺服器建立了新的資源。
  • 202 接受請求但沒建立資源;
  • 203 返回另一資源的請求;
  • 204 伺服器成功處理了請求,但沒有返回任何內容;
  • 205 伺服器成功處理了請求,但沒有返回任何內容;
  • 206 處理部分請求;

3xx (重定向)

  • 重定向程式碼,也是常見的程式碼
  • 300 (多種選擇) 針對請求,伺服器可執行多種操作。 伺服器可根據請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇。
  • 301 (永久移動) 請求的網頁已永久移動到新位置。 伺服器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
  • 302 (臨時移動) 伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。
  • 303 (檢視其他位置) 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,伺服器返回此程式碼。
  • 304 (未修改) 自從上次請求後,請求的網頁未修改過。 伺服器返回此響應時,不會返回網頁內容。
  • 305 (使用代理) 請求者只能使用代理訪問請求的網頁。 如果伺服器返回此響應,還表示請求者應使用代理。
  • 307 (臨時重定向) 伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。

4開頭的http狀態碼錶示請求出錯

  • 400 伺服器不理解請求的語法。
  • 401 請求要求身份驗證。 對於需要登入的網頁,伺服器可能返回此響應。
  • 403 伺服器拒絕請求。
  • 404 伺服器找不到請求的網頁。
  • 405 禁用請求中指定的方法。
  • 406 無法使用請求的內容特性響應請求的網頁。
  • 407 此狀態程式碼與 401類似,但指定請求者應當授權使用代理。
  • 408 伺服器等候請求時發生超時。
  • 409 伺服器在完成請求時發生衝突。 伺服器必須在響應中包含有關衝突的資訊。
  • 410 如果請求的資源已永久刪除,伺服器就會返回此響應。
  • 411 伺服器不接受不含有效內容長度標頭欄位的請求。
  • 412 伺服器未滿足請求者在請求中設定的其中一個前提條件。
  • 413 伺服器無法處理請求,因為請求實體過大,超出伺服器的處理能力。
  • 414 請求的 URI(通常為網址)過長,伺服器無法處理。
  • 415 請求的格式不受請求頁面的支援。
  • 416 如果頁面無法提供請求的範圍,則伺服器會返回此狀態程式碼。
  • 417 伺服器未滿足”期望”請求標頭欄位的要求。

5開頭狀態碼並不常見,但是我們應該知道

  • 500 (伺服器內部錯誤) 伺服器遇到錯誤,無法完成請求。
  • 501 (尚未實施) 伺服器不具備完成請求的功能。 例如,伺服器無法識別請求方法時可能會返回此程式碼。
  • 502 (錯誤閘道器) 伺服器作為閘道器或代理,從上游伺服器收到無效響應。
  • 503 (服務不可用) 伺服器目前無法使用(由於超載或停機維護)。 通常,這只是暫時狀態。
  • 504 (閘道器超時) 伺服器作為閘道器或代理,但是沒有及時從上游伺服器收到請求。
  • 505 (HTTP 版本不受支援) 伺服器不支援請求中所用的 HTTP 協議版本。
  • 記憶口訣:1臨(臨時響應)2成(請求成功)3定向(重定向)4請(請求出錯)5服(伺服器錯誤)

最後

歡迎關注公眾號:前程有光,領取一線大廠Java面試題總結+各知識點學習思維導+一份300頁pdf文件的Java核心知識點總結! 這些資料的內容都是面試時面試官必問的知識點,篇章包括了很多知識點,其中包括了有基礎知識、Java集合、JVM、多執行緒併發、spring原理、微服務、Netty 與RPC 、Kafka、日記、設計模式、Java演算法、資料庫、Zookeeper、分散式快取、資料結構等等。