數(shù)據(jù)類型:
基本數(shù)據(jù)類型:
整數(shù)類型:
byte/short/int/long
小數(shù)類型:
float/double
字符類型:
char
布爾類型:
boolean
引用數(shù)據(jù)類型:
數(shù)組/接口/類
包裝類:
byte Byte
int Integer
short Short
long Long
float Float
double Double
char Character
boolean Boolean
裝箱/拆箱:
裝箱:
將基本類型轉(zhuǎn)換為封裝類型;
拆箱:
將封裝類型轉(zhuǎn)換為基本類型;
自增和自減:
前置++(++a):表示對a加1之后的結(jié)果進(jìn)行運算.(先增加后使用)
后置++(a++):表示對a變量加1之前的原始值進(jìn)行計算.(先使用后增加)
Java虛擬機(jī)棧:
簡稱棧,每當(dāng)方法創(chuàng)建的時候都會創(chuàng)建一個棧幀,用來存儲局部變量/操作棧/動態(tài)鏈接/方法出口等信息.
每當(dāng)調(diào)用一個方法時調(diào)用一個棧幀,存放當(dāng)前方法的局部變量,方法調(diào)用完,該方法的棧幀就被銷毀.
Java堆:
所有線程共享一塊存儲區(qū)域,當(dāng)JVM啟動時創(chuàng)建,所有對象和數(shù)組都要在堆上分配.
每次使用new關(guān)鍵字,就表示在堆內(nèi)存中開辟一塊新的存儲空間.
成員變量:存放在堆內(nèi),隨著對象的銷毀而銷毀;
局部變量:存儲在棧內(nèi)存中,隨著方法的調(diào)用結(jié)束而銷毀.
GC垃圾回收機(jī)制:
GC功能可以自動監(jiān)測對象是否超過作用域,從而達(dá)到自動回收內(nèi)存的目的.
當(dāng)JVM內(nèi)存資源不夠用時,就會自動清理堆中無用的對象(沒有被引用的對象)所占用的空間.
一般會自動進(jìn)行管理,要請求時可以調(diào)用system.gc()活RunnTime.getRuntime.gc().
垃圾回收機(jī)制的基本原理:
當(dāng)創(chuàng)建對象時,GC從就開始監(jiān)控這個對象的地址/大小以及使用情況,通常GC使用有向圖的方式進(jìn)行記錄和管理堆中的所有對象,以此來確定哪些是"可達(dá)的",哪些是"不可達(dá)的",當(dāng)GC確定"不可達(dá)"時,回收這些內(nèi)存空間.
方法參數(shù)的值傳遞機(jī)制:
傳遞基本類型參數(shù):傳遞參數(shù)值
傳遞引用類型參數(shù):傳遞參數(shù)所引用的堆空間地址值
單例模式(餓漢式):
必須在該類中;
私有化構(gòu)造器,防止外界通過構(gòu)造器創(chuàng)建新的工具類對象;
向外暴露一個公共靜態(tài)方法用于返回自身的對象;
public class ArrayUtils2{
private ArrayUtils2(){
}
private static ArrayUtils2 instance = new ArrayUtils2();
public static ArrayUtils2 getInstance(){
return instance;
}
}
使用枚舉示例:
public emnu ArrayUtils3{
INSTANCE;
public static void sort(int[] arr){
system.out.println("排序");
}
}
== 和 equals的區(qū)別:
==:
比較基本數(shù)據(jù)類型時:比較兩個值是否相等
比較對象數(shù)據(jù)時:比較兩個對象是否在同一塊內(nèi)存空間(比較的是兩個數(shù)據(jù)內(nèi)存地址是否相等)
equals:
比較的是存儲數(shù)據(jù)是否相等;
BigDecimal加減乘除操作:
藍(lán)色區(qū)域為乘法和除法按照四舍五入方式保留兩位小數(shù);
String和StringBuffer/StringBuilder的區(qū)別:
String是不可變字符串;
StringBuffer/StringBuilder是可變字符串;
StringBuffer/StringBuilder區(qū)別:
StringBuffer:中的方法都是用了synchronized修飾,保證了線程安全,但性能較低
StringBuilder:中的方法沒有使用synchronized修飾,線程不安全,但性能較高
SimpleDateFormat:
格式化(format):Date類型轉(zhuǎn)化為String類型;String format(Date date)
解析(parse):String類型轉(zhuǎn)化為Date類型;Date parse(String str)
Calendar:
日歷類
ArrayList和LinkedList:
ArrayList:查詢更改較快,新增和刪除較慢.
LinkedList:新增和刪除較快,查詢和更改較慢.
List和Set接口繼承Collection接口,Map接口不繼承Collection接口;
Collection接口:主要表示List和Set兩種存儲方式;
List接口:列表,允許記錄添加順序,允許元素重復(fù);
Set接口:不記錄添加順序,不允許元素重復(fù);
Map接口:映射關(guān)系;
List接口常用實現(xiàn)類:
ArrayList類:
數(shù)組列表,表示數(shù)組結(jié)構(gòu),采用數(shù)組實現(xiàn).
底層是一個object數(shù)組.
LinkedList類:
鏈表,表示雙向列表和雙向隊列結(jié)構(gòu).
底層采用鏈表算法,實現(xiàn)了鏈表/隊列/棧的數(shù)據(jù)結(jié)構(gòu).
Vector類:
向量,古老的ArrayList.
基于數(shù)組算法實現(xiàn)的列表,和ArrayList的區(qū)別在于使用了synchronized修飾,線程安全,效率低.
Stack類:
棧,表示棧結(jié)構(gòu),采用數(shù)組實現(xiàn).
是vector類的子類.擁有后進(jìn)先出特點,擁有push(入棧)/pop(出棧)方法.
Set接口常用實現(xiàn)類:
HashSet類:
底層使用哈希表實現(xiàn),元素對象的hashCode值決定了在哈希表中的存儲位置;
當(dāng)旺HashSet集合中添加新的元素對象時,先會判斷該對象和集合中的hashCode值:
不等:直接把這個對象存儲到hashCode指定的位置
相等:再繼續(xù)判斷新對象和集合對象中的equals作比較
若為true:則視為同一對象,不保存
若為false:存儲在之前對象同槽位的鏈表上
TreeSet類:
底層使用紅黑樹實現(xiàn),可對集合中元素排序.
HashSet做等值查詢效率高,TreeSet做范圍查詢效率高.
iterator:
迭代器,迭代器中擁有一個指針,默認(rèn)只想低于個元素之前
boolean hasNext():判斷指針后是否存在下一個元素
Object next():獲取指針位置下一個元素,獲取后指針向后移一位.
Iterator<String> it = list.iterator();
while(it.hasNext()){
String ele = it.next();
System.out.println(ele);
}
面向?qū)ο筇卣?繼承/封裝/多態(tài)/抽象
抽象:
分兩種 過程抽象/數(shù)據(jù)抽象,是指忽略一個主題中與當(dāng)前目標(biāo)無關(guān)的那些方面,以便更突出當(dāng)前目標(biāo)的方面.
繼承:
子類可以從父類中繼承方法和實例變量,并且可以修改和增加方法.
Java中類只支持單繼承,但支持多重繼承.(一個子類只能有一個父類,但是父類還可以作為子類繼承父類)
多態(tài):
允許不同類的對象對同一消息做出響應(yīng).
封裝:
把數(shù)據(jù)和過程包裝起來.
封裝的好處:
1.保證數(shù)據(jù)的安全性,防止調(diào)用者隨意修改數(shù)據(jù);
2.提高組件的重用性,把公用的方法放到一個類中,直接調(diào)用即可.
訪問修飾符:
public:表示當(dāng)前類私有,類訪問權(quán)限,只能在本類中操作,離開本類不能訪問;
defult(不寫默認(rèn)):表示當(dāng)前包私有,包訪問權(quán)限,定義和調(diào)用只能在同包中才能訪問;
prodected:表示子類訪問權(quán)限,同包中的可以訪問,即使不同包但是有繼承關(guān)系也可以訪問;
private:表示公共的,可以在當(dāng)前項目中任何地方訪問.
JavaBean規(guī)范:
1.類必須使用public修飾
2.必須保證有公共無參構(gòu)造器,即使手動提供了帶參數(shù)的構(gòu)造器,也得手動提供無參數(shù)構(gòu)造器
3.字段使用private修飾,每個字段提供一對getter和setter方法
方法重載(overload):
兩同一不同:
兩同:在同一類中,方法名相同
一不同:方法參數(shù)列表不同(參數(shù)類型,參數(shù)個數(shù),參數(shù)順序)
方法重載的作用:屏蔽同一功能的方法由于參數(shù)不同所造成的方法名稱不同.
方法重寫(override):
子類存在一個和父類一樣的方法時,稱之為子類覆蓋了父類的方法,也就是重寫;
1.實例方法簡明必須相同;
2.子類方法的返回值類型是和父類方法的返回值類型相同或是其子類;
3.子類方法中拋出的異常小于或等于父類方法聲明拋出異常類型;
4.子類方法的訪問權(quán)限比父類方法訪問權(quán)限更大或相等.
抽象方法:
1.使用abstract修飾的方法,沒有方法體,留給子類去覆蓋
2.抽象方法必須定義在抽象類或接口中
接口和實現(xiàn)類的關(guān)系:
接口:定義多個抽象方法,僅僅定義有哪些功能,卻不提供實現(xiàn)
實現(xiàn)類:實現(xiàn)接口,覆蓋接口中抽象方法,完成具體的實現(xiàn)
this:
表示當(dāng)前對象
主要存在于兩個位置:
在構(gòu)造器中:表示當(dāng)前被創(chuàng)建的對象
在方法中:哪一個對象調(diào)用this所在的方法,此時this就表示哪一個對象
this的使用場景:
1.解決局部變量和成員變量之間的二義性,此時必須使用
2.同一個類中非static方法間互調(diào)
3.構(gòu)造器重載的互調(diào)
super:
當(dāng)前對象的父類對象
super的使用場景:
1.在子類方法中:調(diào)用父類被覆蓋的方法
2.在子類構(gòu)造器中:調(diào)用父類構(gòu)造器
靜態(tài)代碼塊:
static{
System.out.println("靜態(tài)代碼塊");
}
使用static修飾的初始化代碼塊,當(dāng)該代碼塊的類的字節(jié)碼被加載進(jìn)JVM,就執(zhí)行static代碼塊代碼,在開發(fā)中用來加載資源,加載配置文件等.