Java 學習路線圖
Java 學習路線圖
Java 核心
類和物件
類、物件關係
-
什麼是類
類是對某一種事物的抽象描述,是具備某些共同特徵的實體的集合,它是一種抽象的資料型別,它是對所具有相同特徵實體的抽象
-
什麼是物件
物件是類的例項,是一個真實世界中的實體,物件與實體是一一對應關係的,意思就是現實世界的每一個實體都是一個物件,所以物件是一個具體的概念。物件是一種個性的表示,表示一個獨立的個體,每個物件擁有自己獨立的屬性,依靠屬性來區分不同物件。
-
物件與類的關係
類是物件的模版,物件是類的例項
建立物件的幾種方式
- 使用
new
關鍵字 - 使用反射機制
- 使用
clone
方法 - 使用反序列化
類的成員變數和方法
-
成員變數
-
成員變數定義在類中
-
成員變數隨著物件的建立而建立,隨著物件的消失而消失,存在物件的堆記憶體中
這裡可以聯想到動態陣列,如果一個動態陣列中的一個元素引用了一個物件,但是在擴容是放棄了之前的使用過的記憶體,那麼這塊變數很有可能還是存在堆記憶體當中
-
成員變數有預設的初始值
-
-
方法
-
類的建構函式
-
Object
類 -
Object
類是所有類的父類 -
封裝、繼承、多型
- 封裝
- 定義:隱藏物件的屬性和實現的細節,僅僅對外公開介面,控制在程式中的屬性的讀和修改的訪問級別
- 目的:增強安全性和簡化程式設計
- 封裝的基本要求,把所有物件私有化,對應該暴露的屬性使用
getter setter
方法,如果類有帶引數的構造方法,那麼一定要重寫一個不帶引數的構造方法.
- 繼承
- 定義:當多個類具有相同特徵和行為時,可以把多個類的相同部分抽取出來放在一個類中作為父類,其它的類繼承這個類
- 目的:提高程式碼的複用
- 多型
- 定義:指允許不同類的物件對同一訊息做出響應。即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式。(傳送訊息就是函式呼叫)
- 目的:消除型別之間的耦合關係
- 封裝
JDK常用的類
System
類 慎用
System.out.printf
System.out.println
System.arraycopy(Object src, int srcPos,Object dest, int destPos,int length)
基礎型別的包裝類
Integer
Long
Byte
String StringBuilder StringBuffer
類
-
String
每一個new出來的物件都是不一樣的,即使你使用了相同的字面量-
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; }
-
split
方法:用於字串切割 -
contains
方法:是否包含子字元 -
replace
方法:字串替換 -
subString
方法:剪下字串 -
trim
方法:去除空格
-
-
StringBuilder
使用了內部陣列儲存資料,內部陣列如果不指定則有一個預設的大小,如果超出了內部陣列的容量則會擴容append
方法:往內部陣列中新增元素toString
方法,根據內部陣列儲存的內容轉化為一個String
物件
為什麼要使用
StringBuilder
StringBuilder
一般使用在有字串拼接的情況下,如果使用String
則會產生大量無用的物件,而使用StringBuilder
則不會 -
StringBuffer
類StringBuffer
與StringBuilder
功能型別,可以看到StringBuffer
和StringBuilder
都繼承了AbstractStringBuilder
類,並且都基本上只使用了父類的方法,StringBuffer
只是在方法上面增加了一個synchronized
關鍵字,這個關鍵字的作用是給方法加鎖,表示同一個時間端只能有一個執行緒訪問這個方法,如此就可以做到執行緒安全
正規表示式類
Date
類
-
建構函式
public Date(long date)
根據Unix
時間戳來生成Date
物件- 無參建構函式:生成當前時間的
Date
物件,實際上是呼叫了Date(System.currentTimeMillis())
這也是多型的一個體現 after(Date when)
如果呼叫此方法的Date
物件在指定日期之後返回true
before(Date when)
如果呼叫此方法的Date
物件在指定日期之前返回true
-
SimpleDateFormat
類- 指定時間生成字串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String s = sdf.format(date)
- 生成指定時間的
Date
物件
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse("2006-01-02 15:03:04")
Random
類
math
包中的random
方法,只能生成double
型別的0~1
之間的隨機數Random
類
Math
類
round(double x)
返回x的四捨五入的值ceil(double x)
向上取整floor(double x)
向下取整abs()
Scanner
類
看看就好
抽象類
抽象類規則:
- 抽象類不能被例項化
- 抽象類中的方法可以包含方法體也可以不包括方法體
- 構造方法、靜態方法不能宣告為抽象方法
介面
介面的特性
- 介面中的每一個方法也是隱式抽象的,介面中的方法會餓斃隱式指定為
public abstract
- 介面中可以包含變數,介面中的變數會被隱式指定為
public static final
- 介面可以多繼承、多實現
在JDK 1.8+
介面可以有靜態程式碼塊和方法體,定義方法體使用了預留關鍵字default
異常
Java
異常框架
,---------.
|Throwable|
|---------|
|---------|
`---------'
^
|
----------
| |
| |
,-----. ,---------.
|Error| |Exception|
|-----| |---------|
|-----| |---------|
`-----' `---------'
^
|
-------------------
| |
| |
| |
,-----------. ,----------------.
|IOException| |RuntimeException|
|-----------| |----------------|
|-----------| |----------------|
`-----------' `----------------'
異常通常被分為三類:
- 錯誤:錯誤不是異常,而是脫離程式設計師控制的問題。錯誤在程式碼中通常被忽略。例如,當棧溢位時,一個錯誤就發生了,它們在編譯也檢查不到的。
- 執行時異常:執行時異常是可能被程式設計師避免的異常。與檢查性異常相反,執行時異常可以在編譯時被忽略。
- 檢查性異常:最具代表的檢查性異常是使用者錯誤或問題引起的異常,這是程式設計師無法預見的。例如要開啟一個不存在檔案時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。
集合
Java
中的集合框架大致可以分為Collection
和Map
類,兩者的區別如下:
- Collection是單列集合;Map是雙列集合
- Collection中只有Set系列要求元素唯一;Map中鍵需要唯一,值可以重複
- Collection的資料結構是針對元素的;Map的資料結構是針對鍵的。
Collection
體系
Collection
包含了兩大體系:List
、Set
List
存取有序,有索引,可以根據索引來取值,元素可以重複Set
存取無序,元素不可重複
List
List
主要學習以下兩種:ArrayList
、LinkedList
ArrayList
底層使用了陣列實現,所以查詢速度是O(1)
,所以查詢速度快,但是增刪速度慢
LinkedList
是基於雙向迴圈連結串列結構實現的,所以查詢速度為O(n)
,但是增加刪除速度快
Set
Set
集合的特點:元素不會重複,存取是無序的,無下標Set
集合下面有:HashSet LinkedHashSet TreeSet
LinkedHashSet
是基於連結串列和hash
表共同實現的,所以具有存取有序,元素唯一的特點
TreeSet
: 存取無序,元素唯一,可以進行排序(排序是在新增的時候進行排序)
Map
體系
Map
是一個雙列集合,其中儲存的是鍵值對,鍵要求保持唯一性,值可以重複,
Map
最重要的一個結構就是HashMap
課後習題
- 實現一個簡單的
ArrayList
和LinkedList
,LinkedList
可以考慮使用雙向迴圈連結串列作為低層實現,儲存的資料型別可以只考慮int
型別
範型
範型的意思就是就可以編寫模版程式碼來適應任意型別
- 範型類
// 定義一個泛型類
public class Generator<T> {
T item;
}
- 範型方法
public class Generator<T> {
T item;
// 定義一個泛型方法
public T getItem(){
return this.item;
}
}
- 範型介面
//定義一個泛型介面
public interface Generator<T> {
public T next();
}
課後習題
- 使用範型支援
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流我們可以使用兩種形式來劃分:
- 輸入輸出流:程式從外部讀取資料使用輸入流(
InputStream、Reader
),程式向外部寫資料使用輸出(OutputStream、Writer
) - 位元組流、字元流:這是按照流中最小資料單元來區分的,位元組流以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) | 追加一個字元 |
常用的類
-
FileInputStream、FileOutputStream
,檔案讀寫 -
BufferedInputStream、DataInputStream、BufferedOutputStream、DataOutputStream
用作緩衝區 -
ByteArrayOutputStream
常用快取 -
FileReader、FileWriter
檔案讀寫 -
BufferedWriter、BufferReader
用作緩衝區
課後習題
- 使用流進行檔案的拷貝
- 使用流進行影像的翻轉
執行緒
執行緒和程式的區別
程式是程式的一次動態執行過程,而執行緒是程式的一個執行單元,一個程式可以擁有多個執行緒,多個執行緒之間可以共享一個程式的資源
為什麼需要多執行緒
可以發揮多處理的強大功能,簡單來說就是為了加快程式的執行效率
Java實現多執行緒的幾種方式
- 實現
Runnable
介面,實現run
方法 - 繼承
Thread
類,實現run
方法,其中Thread
也是實現了Runable
類 - 實現
Callable
介面,實現call
方法
執行緒狀態的變化
任何執行緒一半具有5種狀態,即為建立、就緒、執行、阻塞、終止
- 建立狀態:當程式中用構造方法建立了一個執行緒物件之後,新的執行緒就處於建立狀態,此時它已經有了對應的記憶體空間和其它的資源,但是還是處於不可執行的狀態
- 就緒狀態:新建執行緒物件之後,呼叫該執行緒的
start()
方法就可以啟動一個執行緒,執行緒進入就緒狀態,此時執行緒就可以進去執行緒佇列,可以搶佔CPU了 - 執行狀態:當就緒狀態的執行緒獲取到了CPU資源的時候,執行緒就進入了執行狀態,CPU會自動呼叫該執行緒的
run
方法進行操作 - 阻塞狀態:一個處於執行狀態的執行緒由於某些特殊的原因,放棄CPU暫時中止自己的執行,在執行過程中,呼叫
sleep() wait()
方法會使程式進入阻塞狀態 - 死亡狀態:呼叫
stop()
方法或者run()
方法執行結束後執行緒處於死亡狀態
執行緒狀態轉化圖如下
Java鎖
課後習題
- 實現生產者消費者模型
網路程式設計
類載入和反射機制
JDBC
編碼規範
Java Web
基礎
JSON
https://www.json.org/json-en.html
json解析庫:fastjson
、gson
json使用{}
表示一個物件,使用[]
表示一個陣列
HTTP 協議
請求報文
一個HTTP請求報文分為四個部分:請求行、請求頭、空行、請求資料,這四個部分排列順序是固定的!!!
-
請求行:請求行主要由請求方法欄位、URL欄位和HTTP協議版本欄位三個欄位組成,他們分別用空格分割開來,一個最經典的請求報文的請求行就是
GET / HTTP/1.1
-
請求頭:HTTP客戶端程式向伺服器請求是必須指明請求型別:如
GET POST
,如有必要,也可以選擇傳送其它的請求頭,大多數請求頭不是必須的,但是Content-Length
除外,對於POST
請求來說,Content-Length
是必須出現的.常見的請求頭欄位含義:Accept
:瀏覽器可以接受的MIME型別Content-Length
:表示請求報文的正文長度Host
:客戶急通過這個告訴伺服器想要訪問的主機名,Host
頭域指定請求資源的Intenet
主機和埠號,必須表示請求URL的原始伺服器或者閘道器地址,HTTP/1.1
請求必要包含主機頭域,不然系統會以400狀態碼返回User-Agent
:這裡面的內容包含發出請求的使用者資訊、瀏覽器型別.(這個爬蟲非常有用)Cookie
:客戶端通過這個頭像伺服器傳送資料,Cookie
是Session
的基礎Connection
:處理完這次請求釋放斷開連線還是繼續保持連線,其中Keep-Alive
是持久連線Content-Type
:表示請求資料的型別
-
空行:即使空了一行,可以告訴伺服器頭部到此為止
-
請求資料:這個部分是攜帶的資料
響應報文
一個HTTP響應報文也主要分為四個部分:響應行、響應頭、空行、資料行
-
響應行:這個主要行擴了三個部分:協議型別和版本號、狀態碼、狀態碼的描述資訊
這裡主要敘述HTTP狀態碼,HTTP狀態碼主要分為五大類
- 100~199 (資訊性狀態碼)
- 200~299(成功狀態碼)
- 300~399(重定向狀態碼)
- 400~499(客戶端錯誤狀態碼)
- 500~599(服務端錯誤狀態碼)
-
響應頭部
重要的幾個:
- Set-Cookie:在客戶端設定資料
- Warning:比原因短語更詳細的一些的警告報文
-
空行
-
資料行
RESTFul
我們可以通過HTTP方法來對資源進行CURD
-
GET: 我們使用GET來進行查詢,如
GET /user 查詢所有使用者的資訊 GET /user/1 查詢指定使用者ID為1 的使用者資訊 GET /user/1/age 查詢指定使用者ID為1 的使用者資訊的年齡
-
POST: 建立單個資源
POST /user 新增一個使用者 POST /user/1/teacher 為使用者ID為1 的使用者新增家教
-
PUT: 更新單個資源
PUT /user/1 更改使用者為1 的使用者資訊
-
DELETE 刪除某個資源
DELETE /user/1 刪除ID為1 的使用者資訊,不過刪除操作一半是把資料庫的is_del欄位置為true
相關文章
- Java學習路線圖應該怎麼學習?Java
- 圖靈書單:Java學習路線☕️圖靈Java
- Java新手入門學習路線圖Java
- 2020年最新Java學習教程路線圖Java
- JAVA學習路線Java
- 程式設計字典-Java(JavaEE)學習線路圖程式設計Java
- Vue學習路線圖Vue
- SwiftUI 學習路線圖SwiftUI
- Flutter 學習路線圖Flutter
- API 學習路線圖API
- JavaScript 學習路線圖JavaScript
- CSS 學習路線圖CSS
- Python學習路線圖Python
- Java Web 學習路線JavaWeb
- Java學習路線指南Java
- Java-學習路線Java
- 寫給Java程式設計師學習路線圖Java程式設計師
- Java學習課件框架,12月最新Java學習路線圖(完整詳細版)Java框架
- Java/後端學習路線Java後端
- Java後端學習路線Java後端
- Java學習路線·進階Java
- Java學習路線·入門Java
- 最新Java學習路線圖(完整詳細版)-千鋒Java教學出品Java
- java培訓分享:java培訓架構師學習線路圖Java架構
- Java學習路線圖,其五個必經階段Java
- Linux學習路線圖(從入門到上崗,帶自學路線圖)Linux
- 給學妹的 Java 學習路線Java
- Java學習路線圖,內附完整Java自學視訊教程+工具經驗Java
- 大資料學習路線圖大資料
- 資料庫學習線路圖資料庫
- java路線圖Java
- 自學JAVA學習路線是什麼?Java
- Java進階學習之Java架構師的學習路線Java架構
- 圖靈書單:前端學習路線?圖靈前端
- Web前端開發學習路線圖Web前端
- 會計進階學習路線圖
- Java體系化學習路線圖總結,帶走不謝!Java
- JAVA學習路線——匹馬行天下Java