在以前Java基礎知識回顧中,咱們回顧了基礎數據類型、修飾符和String、三大特性、集合、多線程和IO。本篇文章則對以前學過的知識進行總結。除了簡單的複習以外,還會增長一些相應的理解。java
基本數據類型主要有: byte、short、int、long、float、double、char、boolean 它們能夠分爲三類:編程
其中byte是8位,short是16位, int是32位以及 long是64的整數;而float 32位,double 64 位的浮點數。 數值類型的級別從低到高分別爲: byte,char,short(這三個平級)——>int——>float——>long——>double 其中由低級別轉到高級別,是屬於自動類型轉換,這點是由系統自動轉換的。在進行計算的時候,若是級別小於int,最終的數據類型會自動轉換爲int,若是高於int,最終數據結果會取其中最高的一個。 又高級別轉到低級別是強制類型轉換。強制類型轉換須要注意取值範圍和數據的精確度。設計模式
char是字符類型,能夠儲存任何字符。 boolean是布爾類型,只有false或true。數組
基礎數據類型更詳細的說明:http://www.panchengming.com/2018/03/18/pancm76/安全
通常咱們在用基礎數據類型的時候,也會用到包裝類型。 這裏順便說下包裝類型,也來彌補以前的文章講述不足。bash
什麼是包裝類型?包裝類型和基礎數據類型的關係。 包裝類就是基本類型數據轉換爲對象的一種類型。服務器
每一個基本類型在java.lang包中都有一個相應的包裝類。 基礎數據類型: boolean, char, byte,short,int, long, float,double 分別對應的包裝數據類型: Boolean,Character,Byte,Short,Integer,Long,Float,Double數據結構
包裝類型有什麼用?多線程
利於實現基本類型之間的轉換; 由於咱們瞭解到基本數據類型之間的相互轉換分爲自動類型轉換和強制類型轉換,自動類型轉換還好,可是強制類型轉換容易出現問題。因此出現了包裝類型,它能夠很方便的幫助轉換。 例如: String類型的轉int類型能夠經過 **Integer.parseInt()轉換成int,或使用Integer.valueOf()**轉換成Integer類型。架構
便於函數傳值; 爲何說方面函數傳值呢?假如一個方法的入參是Object 類型, 可是你的入參是個int類型,是沒法直接調用這個方法的,因此這時即可以將int類型的數據進行包裝成Integer類型,在進行調用即可以了。其實除了這個示例,比較常見的是咱們的pojo類型,通常會使用包裝類型,這樣的話在即可以使用null來進行判斷。不止這些,在集合的List、Map和Set等等泛型中的類型是,用的是包裝類型,例如: Map<String,Integer> map=new HashMap<String,Integer>();
**注意:在使用包裝數據類型進行值比較的時候,用equals進行比較,不要用==。**例如:
Integer a=127;
Integer b=127;
Integer c=128;
Integer d=128;
System.out.println(a == b);
System.out.println(a.equals(b));
System.out.println(c == d);
System.out.println(c.equals(d));
複製代碼
輸出結果:
true
true
false
true
複製代碼
Java修飾符主要分爲兩類:
其中訪問修飾符主要包括 private、default、protected、public。 非訪問修飾符主要包括 static、final、abstract、synchronized。
訪問修飾符的訪問權限:
修飾符 | 當前類 | 同一包內 | 子類 | 其它包 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
static: 用來修飾類變量和類方法。 修飾變量
static在修飾類變量的時候,不管該類被實例化了多少次,它的靜態變量只有一份拷貝。靜態變量也被稱爲類變量。局部變量是不能被聲明爲static變量的。
修飾方法
static在修飾類方法的時候,靜態方法是不能使用類的非靜態變量。靜態方法能夠直接經過類名調用,所以靜態方法中是不能用this和super關鍵字的。
final :用來修飾類、方法和變量。
final 修飾的類不可以被繼承,修飾的方法不能被繼承類從新定義,修飾的變量爲常量,是不可修改的。
abstract :用來建立抽象類和抽象方法。 修飾類
會使這個類成爲一個抽象類,這個類將不能生成對象實例,但能夠作爲對象變量聲明的類型(見後面實例),也就是編譯時類型。抽象類就至關於一類的半成品,須要子類繼承並覆蓋其中的抽象方法。
修飾方法
會使這個方法變成抽象方法,也就是隻有聲明而沒有實現,須要子類繼承實現。
synchronized: 修飾的方法同一時間只能被一個線程訪問。
transient:被 transient 修飾的實例變量時,java 虛擬機(JVM)跳過該特定的變量。
native: 被native修飾的方法實際是由另外一種語言進行實現的本地方法
修飾符更詳細的說明:http://www.panchengming.com/2018/03/24/pancm77/
封裝能夠被認爲是一個保護屏障,防止該類的代碼和數據被外部類定義的代碼隨機訪問。要訪問該類的代碼和數據,必須經過嚴格的接口控制。
使用封裝的好處
良好的封裝可以減小耦合。
類內部的結構能夠自由修改。
能夠對成員變量進行更精確的控制。
隱藏信息,實現細節。
繼承是java面向對象編程技術的一塊基石,由於它容許建立分等級層次的類。 繼承就是子類繼承父類的特徵和行爲,使得子類對象(實例)具備父類的實例域和方法,或子類從父類繼承方法,使得子類具備父類相同的行爲。
優缺點
雖然繼承大大提高了代碼的複用性,可是也提升了類之間的耦合性!
多態是指事物在運行過程當中存在不一樣的狀態。
多態的優勢
三大特性更詳細的說明:http://www.panchengming.com/2018/03/24/pancm78/
List 接口是繼承於 Collection接口並定義 一個容許重複項的有序集合。該接口不但可以對列表的一部分進行處理,還添加了面向位置的操做。
推薦單線程使用ArrayList進行查詢和遍歷,LinkedList進行插入和刪除。 多線程使用Collections.synchronizedList方法對List上鎖,效率比Vector高。
Map 接口並非 Collection 接口的繼承。Map提供key到value的映射。一個Map中不能包含相同的key,每一個key只能映射一個value。Map接口提供3種集合的視圖,Map的內容能夠被看成一組key集合,一組value集合,或者一組key-value映射。
推薦單線程隨機查詢用HashMap,天然順序或自定義順序用TreeMap,插入和刪除用LinkedHashMap。 多線程推薦使用ConcurrentHashMap。
Set是一種不包含重複的元素的Collection,即任意的兩個元素e1和e2都有e1.equals(e2)=false,Set最多有一個null元素。由於Set是一個抽象的接口,因此是不能直接實例化一個set對象。
Set s = new Set()
這種寫法是錯誤的。
推薦單線程隨機查詢用HashSet,天然順序或自定義順序用TreeSet,插入和刪除用LinkedHashSet。
集合更詳細的說明:http://www.panchengming.com/2018/04/19/pancm80/
多線程是指在同一程序中有多個順序流在執行。 簡單的說就是在一個程序中有多個任務運行。
建立(new)狀態: 準備好了一個多線程的對象 就緒(runnable)狀態: 調用了start()方法, 等待CPU進行調度 運行(running)狀態: 執行run()方法 阻塞(blocked)狀態: 暫時中止執行, 可能將資源交給其它線程使用 終止(dead)狀態: 線程銷燬
注:線程啓動的方法是start而不是run。 推薦建立單線程的時候使用繼承 Thread 類方式建立,多線線程的時候使用Runnable、Callable 接口的方式來建立建立線程。
多線程更詳細的說明:http://www.panchengming.com/2018/05/28/pancm84/
多線程中常常會使用這幾個關鍵字synchronized、lock和volatile。 synchronized: synchronized是JVM級別的,也就是在運行期由JVM解釋的。它是阻塞鎖(也就是在同一時間只會有一個線程持有);也是非公平鎖(也就是不遵循先來後到的原則,當一個線程A持有鎖,而線程B、C處於阻塞狀態時,若線程A釋放鎖,JVM將從線程B、C隨機選擇一個線程持有鎖並使其得到執行權)。能夠保證原子性、可見性以及有序性。
lock: lock是經過編碼實現的。它是非阻塞鎖;也是公平鎖。能夠保證原子性、可見性以及有序性。相比synchronized,更加靈活和強大。
volatile:輕量級的鎖。主要用戶保證共享變量對全部線程的可見性,以及禁止指令重排序)。由於沒法保證原子性,因此並不能保證線程安全。
線程安全與共享資源 1.局部變量中的基本數據類型(8種)永遠是線程安全的。 2.局部變量中的對象類型只要不會被其餘線程訪問到,也是線程安全的。 3.一個對象實例被多個線程同時訪問時,他的成員變量就多是線程不安全的。
IO的名稱又來是Input與Output的縮寫,也就是輸入流和輸出流。輸入流用於從源讀取數據,輸出流用於向目標寫數據。
字符流有兩個抽象類:Writer和Reader類。 其對應子類FileWriter和FileReader可實現文件的讀寫操做。 BufferedWriter和BufferedReader可以提供緩衝區功能,用以提升效率。
字節流也有兩個抽象類:InputStream和OutputStream類。 其對應子類有FileInputStream和FileOutputStream實現文件讀寫操做。 BufferedInputStream和BufferedOutputStream提供緩衝區功能
推薦讀取文本用字符流,讀取圖片、視頻和圖片等二進制文件用字節流。
IO流更詳細的說明:http://www.panchengming.com/2018/06/16/pancm85/
提及IO流,順便談下它的幾個孿生兄弟,NIO、BIO和AIO。
IO:
阻塞的,從硬盤讀取數據時,程序一直等待,數據讀完在繼續操做 。 操做時一次一個字節的讀取數據,一個輸出流一次輸出一個字節數據,一個輸出流一次消耗一個字節數據,數據的讀取和寫入效率很差。 I/O屬於底層操做,性能依賴與系統環境。
NIO:
同步非阻塞I/O,在讀取數據時程序能夠繼續執行,讀取玩數據之後,通知當前程序(即硬件的中斷,軟件中的回調),而後程序當即或執行完後處理數據。選擇器(selector)、緩衝(buffer)、管道(channel) 面向塊(緩衝區)。採起「預讀方式」。操做中一步產生或消費一個數據塊,按塊處理數據,同時數據讀取到一個稍後可能會處理的緩衝區,須要時也可在緩衝區先後移動。 方式適用於鏈接數目多且鏈接比較短(輕操做)的架構。例如聊天工具。畢竟好用的框架Netty和Mina。
BIO:
同步並阻塞,服務器實現模式爲一個鏈接一個線程,即客戶端有鏈接請求時服務器端就須要啓動一個線程進行處理,若是這個鏈接不作任何事情會形成沒必要要的線程開銷,固然能夠經過線程池機制改善。 方式適用於鏈接數目比較小且固定的架構
AIO:
異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啓動線程進行處理.。 方式使用於鏈接數目多且鏈接比較長(重操做)的架構。
簡單的介紹了下這些知識。詳細的能夠查看這篇文章:https://blog.csdn.net/huangwenyi1010/article/details/75577091?ref=myread
Java基礎知識的總結篇就介紹到這裏了,之後的博文主要編寫的方向是Java的進階知識了,主要內容爲設計模式,源碼解析和併發編程這塊吧!至於後面的這些博文沒有信心可以寫好,畢竟這些相對於來講仍是比較難以理解的。因此之後的這些相關博文我會按照本身的理解寫的,若是寫的很差,還請多多指點!
原創不易,若是感受不錯,但願給個推薦!您的支持是我寫做的最大動力! 版權聲明: 做者:虛無境 博客園出處:http://www.cnblogs.com/xuwujing CSDN出處:http://blog.csdn.net/qazwsxpcm 我的博客出處:http://www.panchengming.com