Java 學習路線圖

木橋丶發表於2020-12-28

Java 學習路線圖

Java 核心

類和物件

類、物件關係

  1. 什麼是類

    類是對某一種事物的抽象描述,是具備某些共同特徵的實體的集合,它是一種抽象的資料型別,它是對所具有相同特徵實體的抽象

  2. 什麼是物件

    物件是類的例項,是一個真實世界中的實體,物件與實體是一一對應關係的,意思就是現實世界的每一個實體都是一個物件,所以物件是一個具體的概念。物件是一種個性的表示,表示一個獨立的個體,每個物件擁有自己獨立的屬性,依靠屬性來區分不同物件。

  3. 物件與類的關係

    類是物件的模版,物件是類的例項

建立物件的幾種方式

  1. 使用new關鍵字
  2. 使用反射機制
  3. 使用clone方法
  4. 使用反序列化

類的成員變數和方法

  1. 成員變數

    1. 成員變數定義在類中

    2. 成員變數隨著物件的建立而建立,隨著物件的消失而消失,存在物件的堆記憶體中

      這裡可以聯想到動態陣列,如果一個動態陣列中的一個元素引用了一個物件,但是在擴容是放棄了之前的使用過的記憶體,那麼這塊變數很有可能還是存在堆記憶體當中

    3. 成員變數有預設的初始值

  2. 方法

  3. 類的建構函式

  4. Object

  5. Object類是所有類的父類

  6. 封裝、繼承、多型

    1. 封裝
      1. 定義:隱藏物件的屬性和實現的細節,僅僅對外公開介面,控制在程式中的屬性的讀和修改的訪問級別
      2. 目的:增強安全性和簡化程式設計
      3. 封裝的基本要求,把所有物件私有化,對應該暴露的屬性使用getter setter方法,如果類有帶引數的構造方法,那麼一定要重寫一個不帶引數的構造方法.
    2. 繼承
      1. 定義:當多個類具有相同特徵和行為時,可以把多個類的相同部分抽取出來放在一個類中作為父類,其它的類繼承這個類
      2. 目的:提高程式碼的複用
    3. 多型
      1. 定義:指允許不同類的物件對同一訊息做出響應。即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式。(傳送訊息就是函式呼叫)
      2. 目的:消除型別之間的耦合關係

JDK常用的類

System慎用

  1. System.out.printf
  2. System.out.println
  3. System.arraycopy(Object src, int srcPos,Object dest, int destPos,int length)

基礎型別的包裝類

  1. Integer
  2. Long
  3. Byte

String StringBuilder StringBuffer

  1. String 每一個new出來的物件都是不一樣的,即使你使用了相同的字面量

    1. equals方法

      public boolean equals(Object anObject) {
              if (this == anObject) {
                  return true;
              }
              if (anObject instanceof String) {
                  String anotherString = (String)anObject;
                  int n = value.length;
                  if (n == anotherString.value.length) {
                      char v1[] = value;
                      char v2[] = anotherString.value;
                      int i = 0;
                      while (n-- != 0) {
                          if (v1[i] != v2[i])
                              return false;
                          i++;
                      }
                      return true;
                  }
              }
              return false;
      }
      
    2. split方法:用於字串切割

    3. contains方法:是否包含子字元

    4. replace方法:字串替換

    5. subString方法:剪下字串

    6. trim方法:去除空格

  2. StringBuilder 使用了內部陣列儲存資料,內部陣列如果不指定則有一個預設的大小,如果超出了內部陣列的容量則會擴容

    1. append方法:往內部陣列中新增元素
    2. toString方法,根據內部陣列儲存的內容轉化為一個String物件

    為什麼要使用StringBuilder

    StringBuilder一般使用在有字串拼接的情況下,如果使用String則會產生大量無用的物件,而使用StringBuilder則不會

  3. StringBuffer

    StringBufferStringBuilder功能型別,可以看到StringBufferStringBuilder都繼承了AbstractStringBuilder類,並且都基本上只使用了父類的方法,StringBuffer只是在方法上面增加了一個synchronized關鍵字,這個關鍵字的作用是給方法加鎖,表示同一個時間端只能有一個執行緒訪問這個方法,

    如此就可以做到執行緒安全

正規表示式類

Date

  1. 建構函式

    1. public Date(long date) 根據Unix時間戳來生成Date物件
    2. 無參建構函式:生成當前時間的Date物件,實際上是呼叫了Date(System.currentTimeMillis())這也是多型的一個體現
    3. after(Date when) 如果呼叫此方法的Date物件在指定日期之後返回true
    4. before(Date when) 如果呼叫此方法的Date物件在指定日期之前返回true
  2. SimpleDateFormat

    1. 指定時間生成字串
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String s = sdf.format(date)
    
    1. 生成指定時間的Date物件
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = sdf.parse("2006-01-02 15:03:04")
    

Random

  1. math包中的random方法,只能生成double型別的0~1之間的隨機數
  2. Random

Math

  1. round(double x) 返回x的四捨五入的值
  2. ceil(double x) 向上取整
  3. floor(double x)向下取整
  4. abs()

Scanner

看看就好

抽象類

抽象類規則:

  1. 抽象類不能被例項化
  2. 抽象類中的方法可以包含方法體也可以不包括方法體
  3. 構造方法、靜態方法不能宣告為抽象方法

介面

介面的特性

  1. 介面中的每一個方法也是隱式抽象的,介面中的方法會餓斃隱式指定為public abstract
  2. 介面中可以包含變數,介面中的變數會被隱式指定為public static final
  3. 介面可以多繼承、多實現

JDK 1.8+介面可以有靜態程式碼塊和方法體,定義方法體使用了預留關鍵字default

異常

Java異常框架

    ,---------.                  
    |Throwable|                  
    |---------|                  
    |---------|                  
    `---------'                  
         ^
         |
    ----------
    |		 |
    |		 |
,-----.   ,---------.            
|Error|   |Exception|            
|-----|   |---------|            
|-----|   |---------|            
`-----'   `---------'            
     		  ^
     		  |
     -------------------
     |					|
     |					|
     |					|
,-----------.  ,----------------.
|IOException|  |RuntimeException|
|-----------|  |----------------|
|-----------|  |----------------|
`-----------'  `----------------'

異常通常被分為三類:

  1. 錯誤:錯誤不是異常,而是脫離程式設計師控制的問題。錯誤在程式碼中通常被忽略。例如,當棧溢位時,一個錯誤就發生了,它們在編譯也檢查不到的。
  2. 執行時異常:執行時異常是可能被程式設計師避免的異常。與檢查性異常相反,執行時異常可以在編譯時被忽略。
  3. 檢查性異常:最具代表的檢查性異常是使用者錯誤或問題引起的異常,這是程式設計師無法預見的。例如要開啟一個不存在檔案時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。

集合

集合框架

Java中的集合框架大致可以分為CollectionMap類,兩者的區別如下:

  1. Collection是單列集合;Map是雙列集合
  2. Collection中只有Set系列要求元素唯一;Map中鍵需要唯一,值可以重複
  3. Collection的資料結構是針對元素的;Map的資料結構是針對鍵的。

Collection體系

Collection包含了兩大體系:ListSet

  1. List 存取有序,有索引,可以根據索引來取值,元素可以重複
  2. Set 存取無序,元素不可重複
List

List主要學習以下兩種:ArrayListLinkedList

ArrayList底層使用了陣列實現,所以查詢速度是O(1),所以查詢速度快,但是增刪速度慢

LinkedList是基於雙向迴圈連結串列結構實現的,所以查詢速度為O(n),但是增加刪除速度快

Set

Set集合的特點:元素不會重複,存取是無序的,無下標Set集合下面有:HashSet LinkedHashSet TreeSet

LinkedHashSet是基於連結串列和hash表共同實現的,所以具有存取有序,元素唯一的特點

TreeSet: 存取無序,元素唯一,可以進行排序(排序是在新增的時候進行排序)

Map體系

Map是一個雙列集合,其中儲存的是鍵值對,鍵要求保持唯一性,值可以重複,

Map最重要的一個結構就是HashMap

課後習題

  1. 實現一個簡單的ArrayListLinkedList,LinkedList可以考慮使用雙向迴圈連結串列作為低層實現,儲存的資料型別可以只考慮int型別

範型

範型的意思就是就可以編寫模版程式碼來適應任意型別

  1. 範型類
//  定義一個泛型類
public class Generator<T> {
	T item;
}
  1. 範型方法
public class Generator<T> {
	T item;
    // 定義一個泛型方法
    public T getItem(){
        return this.item;
    }
}
  1. 範型介面
//定義一個泛型介面
public interface Generator<T> {
    public T next();
}

課後習題

  1. 使用範型支援ArrayList多型別儲存

註解

註解可以理解其為標籤,標籤本身並沒有什麼用處,但是我們可以給這個標籤賦予含義

註解的宣告和元註解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
	
} 

我們使用@interface宣告瞭一個註解,並使用@Target註解傳入ElementType.METHOD引數來表示這個註解只能應用在方法上,@Retention(RetentionPolicy.RUNTIME)則用來表示改註解生存期是在在執行時.

其中@Target@Retention是由Java提供的元註解,元註解的意義在於標註其它註解

@Target註解

@Target可以用來約束任何可以應用的地方,其中ElementType是一個列舉型別

如果一個註解未指定@Target註解則表示可以應用在任意元素上

@Retention註解

@Retention用來約束註解的生命週期,分別有三個值,原始碼級別(source),類檔案級別(class)或者執行時級別(runtime),其含有如下:

SOURCE:註解將被編譯器丟棄(該型別的註解資訊只會保留在原始碼裡,原始碼經過編譯後,註解資訊會被丟棄,不會保留在編譯好的class檔案裡)

CLASS:註解在class檔案中可用,但會被JVM丟棄(該型別的註解資訊會保留在原始碼裡和class檔案裡,在執行的時候,不會載入到虛擬機器中),請注意,當註解未定義Retention值時,預設值是CLASS,如Java內建註解,@Override@Deprecated@SuppressWarnning

RUNTIME:註解資訊將在執行期(JVM)也保留,因此可以通過反射機制讀取註解的資訊(原始碼、class檔案和執行的時候都有註解的資訊),如SpringMvc中的@Controller@Autowired@RequestMapping等。

檔案、IO

檔案IO操作是重點中的重點,Java中的IO是以為基礎進行輸入輸出的

IO流的劃分

IO流我們可以使用兩種形式來劃分:

  1. 輸入輸出流:程式從外部讀取資料使用輸入流(InputStream、Reader),程式向外部寫資料使用輸出(OutputStream、Writer)
  2. 位元組流、字元流:這是按照流中最小資料單元來區分的,位元組流以8位作為一個資料單元,字元流以16位作為一個資料單元,其中位元組流命名主要以InputStream、OutputStream為字尾,而字元流主要以Reader、Writer為字尾

主要的類和方法

IO的最基本的四個類為:InputStream、OutputStream、Reader、Writer,這四個類均為抽象類,我們具體使用的時候更多的是使用它們的子類,而使用它們作為宣告,比如:InputStream inputStream = new FileInputStream(file),(想想這裡是為什麼)

下面列舉了基本的方法

InputStream
方法方法介紹
public abstrcat int read()讀取一個位元組的資料,返回值為所對應的ANSCii碼值
public int read(byte b[])讀取b.length個位元組的資料填充到陣列中,返回具體讀了多少位元組的資料,如果到了檔案末尾則返回-1
public int read(byte b[], int off, int len)從第 off 位置讀取 len 長度位元組的資料放到 byte 陣列中,流是以 -1 來判斷是否讀取結束的
public long skip(long n)跳過多少個位元組不被讀取
public int available()返回有多少個位元組可被讀取
public void close()關閉流,釋放資源
public synchronized void mark(int readlimit)標記讀取位置,下次還可以從這裡開始讀取,使用前要看當前流是否支援,可以使用 markSupport() 方法判斷
public synchronized void reset()重置讀取位置為上次 mark 標記的位置
public boolean markSupported()判斷當前流是否支援標記流,和上面兩個方法配套使用
OutputStream
方法方法介紹
public abstract void write(int b)寫入一個位元組
public void write(byte b[])寫入b陣列中的資料
public void flush()把緩衝區中的資料刷入檔案中
public void close()關閉流
Reader

InputStream類似

Writer

OutputStream類似,多出

方法方法介紹
public Writer append(char c)追加一個字元

常用的類

  1. FileInputStream、FileOutputStream,檔案讀寫

  2. BufferedInputStream、DataInputStream、BufferedOutputStream、DataOutputStream用作緩衝區

  3. ByteArrayOutputStream常用快取

  4. FileReader、FileWriter 檔案讀寫

  5. BufferedWriter、BufferReader 用作緩衝區

課後習題

  1. 使用流進行檔案的拷貝
  2. 使用流進行影像的翻轉

執行緒

執行緒和程式的區別

程式是程式的一次動態執行過程,而執行緒是程式的一個執行單元,一個程式可以擁有多個執行緒,多個執行緒之間可以共享一個程式的資源

為什麼需要多執行緒

可以發揮多處理的強大功能,簡單來說就是為了加快程式的執行效率

Java實現多執行緒的幾種方式

  1. 實現Runnable介面,實現run方法
  2. 繼承Thread類,實現run方法,其中Thread也是實現了Runable
  3. 實現Callable介面,實現call方法

執行緒狀態的變化

任何執行緒一半具有5種狀態,即為建立、就緒、執行、阻塞、終止

  1. 建立狀態:當程式中用構造方法建立了一個執行緒物件之後,新的執行緒就處於建立狀態,此時它已經有了對應的記憶體空間和其它的資源,但是還是處於不可執行的狀態
  2. 就緒狀態:新建執行緒物件之後,呼叫該執行緒的start()方法就可以啟動一個執行緒,執行緒進入就緒狀態,此時執行緒就可以進去執行緒佇列,可以搶佔CPU了
  3. 執行狀態:當就緒狀態的執行緒獲取到了CPU資源的時候,執行緒就進入了執行狀態,CPU會自動呼叫該執行緒的run方法進行操作
  4. 阻塞狀態:一個處於執行狀態的執行緒由於某些特殊的原因,放棄CPU暫時中止自己的執行,在執行過程中,呼叫sleep() wait()方法會使程式進入阻塞狀態
  5. 死亡狀態:呼叫stop()方法或者run()方法執行結束後執行緒處於死亡狀態

執行緒狀態轉化圖如下

執行緒狀態轉化圖

Java鎖

課後習題

  1. 實現生產者消費者模型

網路程式設計

類載入和反射機制

JDBC

編碼規範

Java Web基礎

JSON

https://www.json.org/json-en.html

json解析庫:fastjsongson

json使用{}表示一個物件,使用[]表示一個陣列

HTTP 協議

請求報文

一個HTTP請求報文分為四個部分:請求行、請求頭、空行、請求資料,這四個部分排列順序是固定的!!!

  1. 請求行:請求行主要由請求方法欄位、URL欄位和HTTP協議版本欄位三個欄位組成,他們分別用空格分割開來,一個最經典的請求報文的請求行就是GET / HTTP/1.1

  2. 請求頭:HTTP客戶端程式向伺服器請求是必須指明請求型別:如GET POST,如有必要,也可以選擇傳送其它的請求頭,大多數請求頭不是必須的,但是Content-Length除外,對於POST請求來說,Content-Length是必須出現的.常見的請求頭欄位含義:

    1. Accept:瀏覽器可以接受的MIME型別
    2. Content-Length:表示請求報文的正文長度
    3. Host:客戶急通過這個告訴伺服器想要訪問的主機名,Host頭域指定請求資源的Intenet主機和埠號,必須表示請求URL的原始伺服器或者閘道器地址,HTTP/1.1請求必要包含主機頭域,不然系統會以400狀態碼返回
    4. User-Agent:這裡面的內容包含發出請求的使用者資訊、瀏覽器型別.(這個爬蟲非常有用)
    5. Cookie:客戶端通過這個頭像伺服器傳送資料,CookieSession的基礎
    6. Connection:處理完這次請求釋放斷開連線還是繼續保持連線,其中Keep-Alive是持久連線
    7. Content-Type:表示請求資料的型別
  3. 空行:即使空了一行,可以告訴伺服器頭部到此為止

  4. 請求資料:這個部分是攜帶的資料

響應報文

一個HTTP響應報文也主要分為四個部分:響應行、響應頭、空行、資料行

  1. 響應行:這個主要行擴了三個部分:協議型別和版本號、狀態碼、狀態碼的描述資訊

    這裡主要敘述HTTP狀態碼,HTTP狀態碼主要分為五大類

    1. 100~199 (資訊性狀態碼)
    2. 200~299(成功狀態碼)
    3. 300~399(重定向狀態碼)
    4. 400~499(客戶端錯誤狀態碼)
    5. 500~599(服務端錯誤狀態碼)
  2. 響應頭部

    重要的幾個:

    1. Set-Cookie:在客戶端設定資料
    2. Warning:比原因短語更詳細的一些的警告報文
  3. 空行

  4. 資料行

RESTFul

我們可以通過HTTP方法來對資源進行CURD

  1. GET: 我們使用GET來進行查詢,如

    GET /user   查詢所有使用者的資訊
    GET /user/1 查詢指定使用者ID為1 的使用者資訊
    GET /user/1/age 查詢指定使用者ID為1 的使用者資訊的年齡
    
  2. POST: 建立單個資源

    POST /user 新增一個使用者
    POST /user/1/teacher 為使用者ID為1 的使用者新增家教
    
  3. PUT: 更新單個資源

    PUT /user/1 更改使用者為1 的使用者資訊
    
  4. DELETE 刪除某個資源

    DELETE /user/1 刪除ID為1 的使用者資訊,不過刪除操作一半是把資料庫的is_del欄位置為true
    

相關文章