一、html
數據類型java |
字節數正則表達式 |
二進制位數算法 |
byte編程 |
1設計模式 |
8數組 |
short安全 |
2網絡 |
16多線程 |
int |
4 |
32 |
long |
8 |
64 |
float |
4 |
32 |
double |
8 |
64 |
char |
2 |
16 |
boolean |
1 |
1 |
boolean類型的值只有true和false兩種邏輯值,在編譯後會使用1和0來表示,這兩個數在內存中按位算,僅需1位(bit)便可存儲,位是計算機最小的存儲單位。
數據類型char在中文編碼GBK-2312中佔2個字節,在UTF-8中佔3個字節。
邏輯運算符 |
做用 |
& |
與做用,左右兩邊兩個判斷結果都爲true就是true,不然是false |
| |
或做用,左右兩邊兩個判斷結果只要有一邊爲true,結果就是true,不然就是false |
^ |
異或,你爲true我就是false |
&& |
左右兩邊,左邊若是爲false,右邊不執行,直接返回結果false |
|| |
同理:左邊若是爲true,右邊不執行直接返回true |
第一種:
if(條件表達式){
語句塊1
}else{
語句塊2
}
第二種:
if(條件表達式){
語句塊1
}else if{
語句塊2
} else {
以上條件均不知足而執行的默認的邏輯
}
第三種:
switch(被判斷的變量)
{
case 條件1:
執行條件1的邏輯
break;
case 條件2:
執行條件2的邏輯
break;
case n:
執行條件n的邏輯
break;
default:
以上條件均不知足而執行的默認的邏輯
}
第四種:
While(判斷語句){
循環體
}
Do{
循環體
}while(判斷語句);
While是先判斷後執行,do while 是先執行循環體語句,而後進行判斷語句,就是說不管判斷是否爲true都會至少執行一次循環體語句。
一、 數組是對應的容器集合,須要存儲同類的數據,在一個容器中。
二、 數組使用中,須要規定數組的長度,長度從1開始,設置後長度不可變。
三、 數組使用中,定義數據的類型爲:Object,能夠存儲全部類型:,不然根據須要定義類型,能夠是對象也能夠是基本數據類型
四、 數組要想遍歷(一個個的拿到數據內的數據),咱們須要for循環來完成,知道循環的次數,一個個的獲取。數組獲取中,若是超過角標,那麼就會報錯:角標越
界異常:indexoutofboundsException,由於角標從0開始
五、 排序算法:(選擇和冒泡)
一、冒泡排序算法
二、選擇排序算法
一、封裝屬性:對屬性的訪問權限進行了封裝,私有的只能本身用,公共的誰均可以用。
二、封裝方法:普通方法也可使用關鍵字進行封裝,效果同樣,私有的方法別人不能用。
三、對私有的屬性,能夠封裝一套獲取方法和設置方法,分別是set和get
Set別人設置我當前的私有屬性的數據。
Get別人獲取使用我當前的私有屬性的數據。
四、在建立對象的時候進行封裝:構造方法
建立對象的過程當中,我須要建立出來的對象是空對象,那麼就用空參構造方法。
建立對象的過程當中,我須要建立出來的對象是帶有數據的對象,不是一個空對象,那麼咱們就使用有參構造方法來建立。
若是對象中不寫構造方法,默認就有空參,若是寫了那麼就使用寫了的,若是隻寫有參不寫空參,那麼就沒法使用空參建立對象。默認的空參在你寫了有參的時候就會消失,須要手動再寫空參才能正常使用。
五、構造方法和普通方法同樣,能夠方法名相同,可是參數數據類型與數量不能相同,必須在同一個對象中,咱們稱之爲是方法的重載。
重載:方法名必須相同,參數類型不一樣。
重載:能夠修改方法的訪問修飾符,能夠修改返回類型,無返回仍是有返回。
六、封裝四個關鍵字使用的範圍
位置 |
private |
默認的 |
protected |
public |
同一個類 |
是 |
是 |
是 |
是 |
同一個包內的類 |
否 |
是 |
是 |
是 |
不一樣包內的子類 |
否 |
否 |
是 |
是 |
不一樣包而且不是子類 |
否 |
否 |
否 |
是 |
注意:當前屬性若是須要徹底給別人使用,咱們就須要設置公共的:public
注意:當前屬性若是隻能本身完成,別人不能使用,咱們就須要設置私有的:private
注意:private 使用:方法:get方法與set方法,能夠被別人使用。
一、 繼承:子類繼承父類,子類可使用父類的全部的非私有的屬性和方法
二、方法的重寫,須要注意事項:
一、方法名必須相同。
二、必須是繼承或者實現關係。
三、重寫方法傳遞的形參必須與父類的方法保持一致,不能設置其餘形參。
四、重寫的方法,訪問權限封裝關鍵字:子類的訪問權限能夠修改,可是權限的大小必定要比父類大。不能比父類小。
三、方法的重載和重寫的區別
一、方法的重寫:必須有子父類的關係,子類重寫父類的方法,提高方法的功能,重寫方法中,修飾符子類須要比父類更大不能更小,也能夠相同。方法名必須相
同,參數和返回值也必須相同。
二、方法的重載:在當前自身對象中,提供多種相同的方法,可是有區別的是,修飾符能夠不同、返回值能夠不同、可是方法名必須相同、小括號內參數,參
數類型不一樣或者參數數量不一樣來區分。
一個是發生在本身當前對象的:方法重載:overload
一個是發生在子父類對象的:方法重寫:override
一、多態建立出來的對象,能夠執行調用父類的非私有的屬性和方法。
二、使用多態,若是要想調用子類的方法,那麼子類的方法,必須是父類重寫的方法。不然沒法調用。
當前使用多態建立出來的對象,若是當前的方法,是子類重寫父類的方法,那麼就優先調用執行。若是當前的方法,子類沒有重寫父類的方法,
那麼調用的就是父類的方法。
三、多態調用執行:
一、多態優先調用子類重寫父類的方法。
二、多態能夠調用父類的非私有方法。
三、多態能夠調用父類的非私有屬性。
四、多態不能調用子類的非私有屬性。
五、多態不能調用子類的非私有方法。
四、解決多態不能調用子類的非私有屬性和方法。
若是使用多態想要調用子類的特有屬性和方法的話。咱們須要將多態建立出來的對象,進行強制類型轉換。將父類轉換成子類。
五、多態使用的細節總結:
一、使用多態必須是有繼承或者實現關係的。
二、使用多態咱們若是須要調用子類的方法,必須是重寫方法,重寫方法的權限最大。
三、使用多態建立出來的對象,不能調用子類的特有屬性和方法,若是真想調用,咱們就須要使用到強轉。
注意:在強轉的過程當中,你們頗有可能會出現一個異常:ClassCaseException:類型轉換異常。
四、注意:爲了不後期你們出現類型轉換的錯誤,咱們事先能夠先測試判斷一下類型轉換是否正確:instanceof
五、當前咱們可使用到,關鍵字進行判斷,判斷出來的結果,就是正確或者錯誤,咱們判斷當前轉換的類型,是否合格,若是合格咱們就轉換,若是不合格咱們
就不轉換,就能解決類型異常的問題。
一、抽象類:光定義方法但不實現方法。
二、抽象方法,只能出如今抽象類或者是接口中,不能出如今普通方法中。抽象方法:當前只定義,不實現。例:父親的願望須要兒子去實現(俗稱:負債子還)。
三、建立一個抽象類:關鍵字:abstract。
抽象類,其實和普通類相似,能夠有屬性、構造方法、普通方法、get方法set方法等等。可是,抽象類中還能夠定義抽象方法。
四、在抽象類中,定義抽象方法
五、子類若是實現的是抽象類,那麼必須實現抽象方法(必定要對抽象方法進行重寫)
若是子類不重寫父類的抽象方法,就會一直報錯。
六、建立對象的過程當中,抽象類是不容許被建立出來的
抽象的對象,是不容許直接被new建立的。
抽象類,若是要想建立,咱們就須要使用對應的實現類(兒子建立)
七、 抽象類的出現:抽象類當中存在抽象方法,若是要想實現,那麼就須要子類完成。可是抽象類,又不能直接初始化,仍是得用多態來初始化。
多態的產生,其實有兩部分的緣由:
一、 多態讓建立對象,變的更加的靈活,根據用戶的選擇能夠動態的進行建立。
二、 抽象類與接口是不能直接被建立的,而是須要經過多態的建立方式,讓子類具體實現,完成建立工做。
八、抽象類總結:
一、抽象類不能被final修飾,由於抽象類必需要有兒子。
二、抽象類不能在方法中使用 final修飾,由於抽象類的抽象方法必需要被重寫。
三、抽象類能夠繼承抽象類,全部的抽象方法須要在實現類中一塊兒實現。
四、抽象類中能夠有抽象方法,也能夠有普通方法、屬性、構造方法。
一、定義接口關鍵字:interface
二、接口中方法都是抽象方法,不能有方法體。不能有普通方法,不能有構造方法。當前的接口中,只能有抽象方法,不能有實體方法。
三、定義接口中的屬性:接口中不能有變量,只能存在常量。當前的屬性也可使用靜態來修飾。
使用靜態修飾的好處:接口對象名稱調用屬性能夠直接調用。
四、接口可否被final修飾?
一、接口是不能被final修飾的。
二、接口中的方法不能被final修飾。
三、接口中的屬性能夠被final修飾,由於默認就是使用的final。
五、使用接口:接口是不能直接被new出來的。因此當前必須先有實現類。
六、Java的關係映射:單繼承、多實現。
單繼承:對象與對象間,繼承只能繼承1次。
多實現:對象與接口,一個對象能夠實現多個接口。
七、接口和抽象類的區別:
一、抽象類能夠有普通方法和抽象方法。
二、抽象類中定義的屬性是變量。
三、抽象類能夠繼承抽象類或者普通類。
四、抽象類能夠實現接口,可是沒有必要。
五、抽象類不能直接建立,須要用多態的方法建立。
一、接口中只能有抽象的方法。
二、接口中屬性是常量定義。
三、接口能夠繼承接口,但不能實現。
四、接口繼承是多繼承,抽象類繼承是單繼承。
五、無論是接口仍是抽象類,對象不能使用final修飾。方法不能使用final修飾。
由於後期在Java中開發項目,項目後期確定要維護升級的,咱們若是使用抽象類,就只能單繼承,不方便維護,讓項目加大了局限性。而使用接口的話,實現的接口數
量不限,能夠多實現,解決了項目後期更新的侷限性問題。
理解:
抽象類就至關因而領導,領導定義任務,員工完成。
接口就至關因而規範,接口制定規範,全部員工須要遵照。
一、 this關鍵字
this對象:this關鍵字就是當前對象的引用關鍵字,用來區分傳遞形參與當前對象內的參數區別開來。
二、 super關鍵字
一、構造方法中使用super:
Super必須放在前面。
Super須要帶有小括號。帶有小括號就會調用父類對應的構造方法。
二、super在普通方法中使用
Super若是在普通方法中使用,那麼直接使用super便可,不須要添加小括號,不添加小括號的super,是直接引用的父類對象,不是構造方法。
三、 static關鍵字
一、static關鍵字修飾方法,咱們無需new對象,便可經過類名調用方法。
二、static關鍵字修飾屬性,咱們無需new對象,便可經過類名調用屬性。
三、緣由:static修飾的屬性和方法,在生成.class文件的時候就會被初始化出來。
四、static能夠設置一個靜態代碼塊:
Static{ }:運行的方式,是程序執行的時候,第一次就調用的,運行權限比構造方法還要大。程序一運行,第一個就調用的是靜態代碼塊。
使用場景:後期初始化數據的時候,咱們會使用到。
五、static缺點:若是是static修飾的屬性和方法,聲明週期就會拉長,內存數據回收就會變得不方便,有些佔用內存,後期在項目中,若是數據龐大的狀況下,仍是儘可能少使用。
四、 final關鍵字
一、final能夠修飾class屬性對象,被final所修飾的對象,將不能被繼承。
二、final能夠修飾屬性,被修飾的屬性,就從變量變成了常量,不可修改。
三、final修飾的方法,當前的方法只能使用,不能被重寫。
一、內部類:在當前的對象內,再建立一個對象,稱之爲內部類
二、咱們建立內部類對象規則:
內部類,必須在類對象的括號內建立,命名不能帶有小括號。
三、初始化內部類。
注意:由於當前的對象是內部對象,因此先要將外部對象建立出來,再來建立內部對象,外部對象建立內部對象中,使用到了調用,因此建立內部對象的時候,前面須要帶
上小點,進行調用。
四、內部對象,是否會生成.class文件:
會生成一個Animal$Cat.class文件,由於是否生成class文件,取決因而否使用了class關鍵字
五、內部類同樣和外部類使用,只是內部類是寫在對象內的。同樣也能夠封裝、繼承、多態
六、匿名對象:就是沒有名字的對象,通常使用在建立對象的時候。
注意:當前調用的方法與建立的對象,只會執行一次,它是一次性寫法。由於沒有給對象在建立的時候命名,因此方法執行完,對象也會隨着消失銷燬在內存中。因此若是
須要再次調用方法,那麼就須要從新再次建立對象。
七、匿名內部類:在當前類中建立一個類,可是不給名稱。(由於抽象類與接口不能直接被new,要先直接初始化其實也有方法,咱們當前就須要使用匿名內部類)
八、匿名內部類,也會生成一個class文件,雖然沒有明文寫出,生成的class文件仍是會出來,命名使用的是1命名。
一、基本數據類型:8種:
整數類型:byte、short、int、long
浮點類型:float、double
判斷類型:boolean
字符類型:char
二、引用數據類型:9種:
整數類型:Byte、Short、Integer、Long
浮點類型:Float、Double
判斷類型:Boolean
字符類型:Character
字符串:String
三、字符和字符串的區別:
一、字符是基本數據類型,字符串是引用數據類型。
二、字符定義的字符能夠轉換爲對應的ascii表,對應的數字,能夠進行加減乘除。
三、字符串由於是常量,數據是在常量池中,只能作對應的加法,是拼接。其他的減乘除都是不行的,由於String是不支持的
四、String對象,建立的幾種不一樣方式。
直接建立:從常量池就能直接拿到對應的常量數據
經過new關鍵字建立:常量池常量傳遞給堆,堆再給棧。
五、String建立的字符串都是常量,不能修改,修改的話就是從新在來生成一個,原有的就會等待回收機制回收。
六、String構造方法中,咱們能夠給空的、也能夠給具體的String字符串、還能夠給對應的數組讓數組對應的字符或者數字來生成一個字符串。
七、 自動裝箱與自動拆箱
基本數據類型,轉換爲引用數據類型,自動裝箱。
引用數據類型,轉換爲基本數據類型,自動拆箱。
一、String:字符串常量
StringBuffer:字符串變量
StringBuilder:字符串變量
二、線程安全
StringBuilder:線程非安全的
StringBuffer:線程安全的
三、三者使用:
1.若是要操做少許的數據用 = String
2.單線程操做字符串緩衝區 下操做大量數據 = StringBuilder
3.多線程操做字符串緩衝區 下操做大量數據 = StringBuffer
四、
一、StringBuffer對象,默認長度是:16
二、StringBuilder對象,默認長度是:16
一、Date日期對象,咱們就是經過它將對應的毫秒值轉化爲咱們看的懂的日期對象。
二、Date對象中,重寫了toString方法,裏面含有對應的返回日期格式。咱們看完後,查看到了對應的英文字母,這些就是定義日期格式的關鍵字符。
三、當前咱們若是須要本身定義日期顯示的樣式,咱們就須要對應設置本身所須要的字母關鍵字符,可是Date裏面是沒有給咱們提供設置方法的,咱們須要使用到日期的幫助類:SimpleDateFormat
四、SimpleDateFormat對象,對Date日期對象進行了一個顯示內容的封裝,讓當前的日期,能夠根據用戶自身的需求進行自定義格式。可是自定義格式中,咱們須要經過字母將格式設置完成後,才能使用。
五、當前Date與SimpleDateFormat對象兩個相結合,最終就能獲得咱們想要的日期格式,日期格式顯示出來的內容,就是根據毫秒值來轉換的。
六、日期爲何須要使用毫秒值,避免時間重複,時間計算是須要很是精準的。由於任何項目若是時間戳出了問題,就會產生不可逆的異常。
List |
ArrayList |
底層是數組 |
查詢速度快,增刪改慢 |
線程不安全 |
效率高 |
LinkedList |
底層是雙向鏈表 |
增刪速度快,查詢慢 |
線程不安全 |
效率高 |
|
Vector |
底層是數組 |
查詢快,增刪慢 |
線程安全 |
效率低 |
|
ArrayList 初始容量爲10,自增加度是(10*3/2)+ 1。 Vector 內部數據數組的大小爲10,其標準容量增量爲零。 |
Set |
HashSet |
底層是HashMap |
存取速度快, |
線程不安全 |
無序,不可重複 |
能夠存儲null,但只能放入一個null |
TreeSet |
底層是紅黑樹 |
排序存儲 |
線程不安全 |
有序,不可重複 |
不能夠存儲null |
|
HashSet其底層HashMap實例的默認初始容量是16,加載因子是0.75 |
Map |
HashMap |
底層是Hash表(數組+鏈表) |
效率高 |
線程不安全 |
鍵值能夠存儲null,但只能存儲一次,否則會被覆蓋 |
HashTable |
底層是Hash表(數組+鏈表) |
效率低 |
線程安全 |
不能夠存儲null |
|
HashMap 默認初始容量是16,加載因子是0.75 HashTable默認初始容量是11,加載因子是0.75 |
一、彙總:
Collection:是集合中的一個接口父類,它是一個分支,子類實現接口中:List和Set
Map:也是集合中的一個接口父類,子類中是:HashMap、HashTable
二、Map接口集合,與Collection區別:
Map結構分爲:k v,俗稱鍵值對。
K:key:鍵
V:value:值
在map集合中,k就是鍵,是主鍵的意思,不能重複。V就是值,值能夠重複。
在List集合中,角標就是鍵,裏面的內容就是值。角標從0開始,沒有重複的。
FileWriter:文件的字符輸出流,是Writer的子類。
FileReader:文件的字符輸入流,是Reader的子類。
BufferedWriter:字符高效輸出流,當前默認有緩衝區。
BufferedReader:字符高效輸入流,當前默認有緩衝區。
FileOutputStream:文件字節輸出流,當前是萬能輸出流。
FileInputStream:文件字節輸入流,當前是萬能輸入流。
BufferedOutputStream:文件高效字節輸出流,當前默認有緩衝區。
BufferedInputStream:文件高效字節輸入流,當前默認有緩衝區。
ObjectOutputStream:對象輸出流
ObjectInputStream:對象輸入流
只能將支持 java.io.Serializable 接口的對象寫入和讀取到流中。
在文件夾複製的工做中,文件夾中還有存在子文件夾,嵌套存在深度不一致多,有的多有的少。咱們須要複製過程當中考慮全面,就須要將代碼嵌套比較的多,效率極低。
當前解決的辦法:使用的是遞歸來解決文件夾嵌套建立的問題。
遞歸的好處:不斷調用自身,進行文件夾建立。
遞歸使用的注意事項:
須要遞歸的過程當中,設置出口,中止定義,不然就會一直調用致使堆棧溢出。
遞歸的算法:當前重複調用方法,直到拿到預期的目標跳出遞歸,進入出口。
遞歸的使用中:
入口:調用自身。
出口:獲得預期的目標,跳出進入出口,結束調用本身。
一、字節流和字符流
字符流:只能對文本文檔操做的流對象,由於當前讀寫設置的是char類型的容器。
字節流:是萬能流,不只能夠對文本文檔操做,還能對其餘類型的文檔操做,好比圖片、視頻、音頻等等,由於當前讀寫設置的容器類型爲byte類型,根據字符的編碼存儲編碼的序號數字,進行轉譯。
二、字節流與字符流,當前的效率字節流要快於字符流。
字節流複製文件,一個須要800多毫秒便可,可是字符流複製文件,一個須要7秒,一樣的大小200多MB的文件。
一、 在公司中開發,咱們經常使用的是字節流,由於字節流對應功能侷限性小,效率高。
二、 當前咱們學習字符流和字節流中,咱們還學習了對應的高效輸出輸入流。
三、 字節高效的輸入輸出流,要快於普通字節流,快的速度800毫秒能夠縮短到300毫秒。
字符流也是同理,高效的要高於普通的,由於高效的能夠讀取一行,直接寫入,須要換行寫入的時候能夠插入換行。
三、爲何高效的要快:由於當前底層設置了緩衝區,咱們能夠建立高效流的同時使用默認緩衝區,或者自定義緩衝區,咱們通常使用默認便可,由於默認已經足夠咱們使用了。
默認緩衝區大小:8192字節。
一、方法一:本身建立一個對象,繼承多線程對象,進行建立多線程。
二、方法二:經過實現一個接口Runnable接口,讓多線程對象使用。
一、方式一:使用同步代碼塊:關鍵步驟上鎖
注意:鎖對象必須是一致的,通常使用class文件,保持一致。或者使用單例設計模式建立對象。
二、方式二:同步方法:將整個方法進行上鎖
注意:當前線程能夠開啓多個,可是runnable實現類必須只有一個,不能實現多個實現類,不然同步方法無效
方法三:靜態同步方法,全部的對象都上鎖,一鎖鎖全部
注意:當前若是要實現多個runnable實現類,不一樣的對象間使用方法鎖的話,可使用靜態同步方法,這樣的話就可以解決方法二不能鎖住的問題。
三、方法三:靜態同步方法,全部的對象都上鎖,一鎖鎖全部
注意:當前若是要實現多個runnable實現類,不一樣的對象間使用方法鎖的話,可使用靜態同步方法,這樣的話就可以解決方法二不能鎖住的問題。
一、 單例設計模式
懶漢式:
餓漢式:
二、 生產者與消費者模式
一、生產者生產數據到緩衝區中,消費者從緩衝區中取數據。
若是緩衝區已經滿了,則生產者線程阻塞;
若是緩衝區爲空,那麼消費者線程阻塞。
二、wait:等待方法
被等待的線程是自身喚醒的,必須得依靠別的線程或者對象喚醒,喚醒經過鎖對象調用喚醒方法。
三、notify:喚醒方法(喚醒單個)
喚醒單個:隨機喚醒等待的線程中的一個線程
四、notifyAll:喚醒方法(喚醒所有)
喚醒所有:將當前全部等待的線程進行喚醒,喚醒後不必定全部線程都執行,具體誰執行還須要看CPU給誰分配了資源搶佔了鎖對象。
注意:當前鎖對象若是不是同一把鎖,就沒法喚醒,同時也可能產生一直等待的狀態,線程堵塞
五、sleep方法,當前休息睡眠必定的時間後,本身就可以清醒過來,進行繼續運行。
區別:等待喚醒機制,若是當前處於等待的狀態,就會釋放鎖對象,丟給其餘對象使用而且執行,當前自身處於等待不執行的狀態。 睡眠方法,則不一樣,當前線程若是是睡眠方法,那麼在睡眠的過程當中是不會釋放鎖資源的,等清醒後,繼續操做執行,直到執行結束,結束操做,釋放鎖資源,提供給其餘對象使用。
一、網絡編程的三要素:IP地址、端口號、網絡協議。
二、網絡協議:底層協議:UDP、TCP
UDP:直接鏈接的網絡協議,通常使用的場景:視頻、語音、聊天室。
TCP:三次握手鍊接,通常使用的場景:傳輸圖片、發送聊天文字等等。
區別:
UDP:效率快,可是數據丟失沒法找回,數據傳輸不穩定。
TCP:效率相對慢,傳輸的數據,穩定丟失比較低。
使用網絡協議傳輸的過程當中,咱們基本上使用的都是流對象傳輸。
一、反射
一、對象反射的方式一共有:三種
第一種:建立出來對象,經過對象的引用獲取。
第二種:經過類的包名 + 類名直接尋找。
第三種:直接經過類名調用class關鍵字。
二、暴力訪問,將setAccessible的狀態設爲true,而後就能夠獲取私有的屬性和方法。
二、正則表達式
一、使用一個正則對象
|
matcher |
|
matches |
使用示例: