思來想去 還是覺得有個編程語言傍身,會有備無患。
java數(shù)組
靜態(tài)初始化
int [] array = new int[]{1,2,3};
int [] array1 = {1,2,3}動態(tài)初始化
int [] array2 = new int[3];
java 內(nèi)存
棧內(nèi)存
基本變量、 引用變量
速度快 用于執(zhí)行程序
堆內(nèi)存
new創(chuàng)建的對象和數(shù)組。
java gc自動回收
引用
引用變量是普通變量,定義時在棧中分配內(nèi)存 引用變量指向堆空間地址
java foreach寫法
for (int i : s){do same thing}

封裝

import


Java的常用包
java.lang:這個包下包含Java語言的核心類,如String、Math、System、和Thread 等。
java.util:這個包下包含了Java的大量工具類/接口和集合框架類/接口。如Arrays和List等
java.net:這個包下包含了一些Java網(wǎng)絡編程相關的類、接口。
java.io這個包下包含了一些Java輸入/輸出編程相關的類/接口。
java.text:這個包下包含了一些Java格式化相關的類。
java.sql:這個包下包含了Java進行JDBC數(shù)據(jù)庫編程的相關類/接口。
繼承

父類是對子類共性的抽象,父類和子類的關系,是由一般到特殊的關系。
父類包含的范圍總比子類包含的范圍要大,所以可以認為父類是大類,子類是小類
在設計類的繼承關系時,應當把共性放在父類,特性放在子類。
每一個類只能有一個直接父類,即單繼承。


3.5.2 帶有繼承又帶有靜態(tài)初始化塊
靜態(tài)初始化塊:用static修飾的代碼塊,也稱為類初始化塊。
靜態(tài)初始化塊只在類首次初始化時執(zhí)行。
靜態(tài)初始化塊要比普通初始化塊先執(zhí)行。
靜態(tài)初始化塊和靜態(tài)方法都是在類初始化時執(zhí)行,而不是創(chuàng)建對象時執(zhí)行。
靜態(tài)初始化塊與靜態(tài)方法的區(qū)別:
如果有些代碼必須在項目啟動的時候就執(zhí)行的時候,需要使用靜態(tài)代碼塊,這種代碼是主動執(zhí)行的;
需要在項目啟動的時候就初始化,在不創(chuàng)建對象的情況下,其他程序來調(diào)用的時候,需要使用靜態(tài)方法,這種代碼是被動執(zhí)行的. 靜態(tài)方法在類加載的時候就已經(jīng)加載可以用類名直接調(diào)用。
1)在類初始化階段,先執(zhí)行最頂層父類的靜態(tài)初始化塊,然后依次向下,直到執(zhí)行當前類的靜態(tài)初始化塊。
2)在對象初始化階段,先執(zhí)行最頂層父類的初始化塊、最頂層父類的構造器,然后依次向下,直到執(zhí)行當前類的初始化塊、當前類的構造構造器。
繼承
多態(tài)
接口
接口(interface)是抽象方法和常量值的定義的集合
一個類可以實現(xiàn)多個接口,接口也可以繼承其它接口
5)如果實現(xiàn)接口的類中沒有實現(xiàn)接口中的全部方法,必須將此類定義為抽象類

設計模式
單例模式
懶漢模式
// 單例模式
class Single{
private static Single single;
private Single(){}
public static Single getSingle(){
if (single == null)
single = new Single();
return single;
}
}
餓漢模式
// 單例模式 餓
class Single1{
private static Single1 single = new Single1();
private Single1(){}
public static Single1 getSingle(){
return single;
}
}
簡單工廠

運算類:是一個抽象類,有兩個屬性值,和一個抽象運算方法。
下面四個類是繼承抽象類,用多態(tài)實現(xiàn)運算結果。

簡單工廠模式最大的優(yōu)點在于工廠類中包含了必要的邏輯判斷,根據(jù)客戶端的條件動態(tài)實例化相關的類,對于客戶端來說,去除了與具體產(chǎn)品的依賴。如果要在運算里加取余或平方運算,需要在工廠里增加case 分支語句,修改 了原來的類,有點違反開放封閉原則。為了可擴展,采用工廠方法改寫。
開放封閉原則:軟件實體應該可以擴展,但是不可以修改。它有兩個特性:對擴展開放,對修改封閉。
工廠模式

package day3;
interface Shape{
void draw();
}
class Circle implements Shape{
@Override
public void draw(){
System.out.println("draw a circle");
}
}
class Rect implements Shape{
@Override
public void draw(){
System.out.println("draw a Rect");
}
}
class DrawFactory{
//簡單工廠模式 一個工廠
//工廠模式 多個工廠
public static Shape getShape(String type){
switch(type.toLowerCase()){
case ("circle"):
return new Circle();
case ("rect"):
return new Rect();
default:
return new Rect();
}
}
}
public class Factory {
public static void main(String args[]){
String drawshape = "circle";
DrawFactory factory = new DrawFactory();
Shape ShapeA = factory.getShape(drawshape);
ShapeA.draw();
Shape ShapeB = factory.getShape("rect");
ShapeB.draw();
}
}
非靜態(tài)內(nèi)部類
非靜態(tài)內(nèi)部類:沒有static修飾的成員內(nèi)部類。
當在非靜態(tài)內(nèi)部類的方法內(nèi)訪問某個變量時
1)系統(tǒng)優(yōu)先在該方法內(nèi)查找是否存在該名字的局部變量,如果存在就使用該變量。
2)如果不存在,則 到該方法所在的內(nèi)部類中查找是否存在該名字的成員變量,如果存在則使用該成員變量。
3)如果不存在,則到該內(nèi)部類所在的外部類中查找是否存在該名字的成員變量,如果存在則使用該變量。
4)如果還不存在,則系統(tǒng)將出現(xiàn)編譯錯誤,提示找不到該變量。
如果內(nèi)部類中沒有與外部類同名的變量,則可以直接用變量名訪問外部類變量。
內(nèi)部類如果訪問外部類成員變量、內(nèi)部類成員變量與內(nèi)部類方法的局部變量同名時,
訪問內(nèi)部類方法的局部變量:變量名
訪問內(nèi)部類成員變量:this.變量名
訪問外部類成員變量:外部類名.this.變量名
為什么能用Outer.this找到外部類的成員變量
有static 修飾的成員內(nèi)部類,就是靜態(tài)內(nèi)部類。
靜態(tài)內(nèi)部類屬于外部類的本身,而不屬于外部類的某個實例對象。
靜態(tài)內(nèi)部類不能訪問外部類的實例成員,只能訪問外部類的類成員。即使是內(nèi)部類的實例方法也不能訪問外部類的實例成員,只能訪問外部類的靜態(tài)成員。
枚舉類型


1)可達狀態(tài)
當一個對象被創(chuàng)建后,有一個以上的引用變量引用它。在有向圖中可以從起始頂點導航到該對象,那么它就出于可達狀態(tài),程序可以通過引用變量來調(diào)用該對象的屬性和方法。
2)可恢復狀態(tài)
如果程序中某個對象不再有任何引用變量引用它,他將進入可恢復狀態(tài),此時從有向圖的起始頂點不能導航到該對象。在這種狀態(tài)下,系統(tǒng)的垃圾回收機制轉(zhuǎn)變回收該對象所占用的內(nèi)存。在回收該對象之前,系統(tǒng)會調(diào)用可恢復狀態(tài)的對象的finalize方法進行資源清理,如果系統(tǒng)調(diào)用finalize方法重新讓一個以上的引用變量引用該對象,則該對象會再次編程可達狀態(tài);否則,該對象將進入不可達狀態(tài)。
3)不可達狀態(tài)
當對象的所有關聯(lián)都被切斷,且系統(tǒng)調(diào)用所有對象的finalize方法依然沒有使該對象變成可達狀態(tài)后,這個對象將永久性地失去引用,最后變成不可達狀態(tài)。只有當一個對象出于不可達狀態(tài),系統(tǒng)才會真正回收該對象所占用的資源。

強制垃圾回收
調(diào)用 System 類的 gc() 靜態(tài)方法:System.gc()
調(diào)用 Runtime 對象的 gc() 實例方法:Runtime.getRuntime().gc()
這種強制只是建議系統(tǒng)立即進行垃圾回收,系統(tǒng)完全有可能建議完全置之不理,垃圾回收機制會在收到通知后,盡快進行垃圾回收。
4.3 finalize 方法
Object類的finalize()方法。
finalize 方法的特點
1)永遠不要主動調(diào)用某個對象的finalize 方法,該方法應交給垃圾回收機制調(diào)用。finalize 方法何時被調(diào)用,是否被調(diào)用具有不確定性,不要把finalize 方法當成一定會被執(zhí)行的方法。
2)在 JVM 的規(guī)范中,只規(guī)定了 JVM 必須要有垃圾回收機制,但是什么時候回收卻沒有明確說明。也就是說,對象成為了垃圾對象之后, 并不一定會馬上就被垃圾回收。
3)Sun 公司采用的垃圾回收的方式,是“最少回收” 的方式:只有當內(nèi)存不夠的時候才會進行垃圾回收。
4)當JVM執(zhí)行finalize 方法時出現(xiàn)異常時,垃圾回收機制不會報告異常,程序繼續(xù)執(zhí)行。
目前已有很多用戶,建議拋棄Object 類的 finalize 方法。
- 任何java類都可以重寫Object類的finalize方法。
- finalize 方法在對象被垃圾回收的時候調(diào)用。
- 但是,由于 Sun 公司的 JVM 采用的是“最少”回收的機制,因此不應當把釋放資源的代碼寫在 finalize 方法中。
基本類型的包裝類型


equal
對對象來說 equal和== 相識,需要自己實現(xiàn)object的equal比較
類裝載
什么是類裝載時:
1)生成該類對象的時候,會加載該類及該類的所有父類;
2)訪問該類的靜態(tài)成員的時候;
3)class.forName("類名")(反射);

String StringBuffer StringBuilder
package day3;
public class StringIntern {
public static void main(String args[]){
String a = "aaa";
String b = "aaa";
System.out.println(a==b);
String c = a + "aaa";
System.out.println(c == (a + b));
//運行時確定
String d = new String("aaa");
System.out.println("aaa" == d);
//新創(chuàng)建實例
d = d.intern();
System.out.println("aaa" == d);
}
}
用來處理字符串常用的類有3種: String、StringBuilder、StringBuffer。
它們的異同點:
- 都是 final 類, 都不允許被繼承;
- String 長度是不可變的, StringBuffer、StringBuilder 長度是可變的;
- StringBuffer 是線程安全的, StringBuilder 不是線程安全的。
String VS StringBuffer
String 類型和StringBuffer的主要性能區(qū)別:String是不可變的對象, 因此在每次對String 類型進行改變的時候,都會生成一個新的 String 對象,然后將指針指向新的 String 對象,所以經(jīng)常改變內(nèi)容的字符串最好不要用 String ,因為每次生成對象都會對系統(tǒng)性能產(chǎn)生影響,特別當內(nèi)存中無引用對象多了以后, JVM 的 GC 就會開始工作,性能就會降低。
使用 StringBuffer 類時,每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象并改變對象引用。所以多數(shù)情況下推薦使用 StringBuffer ,特別是字符串對象經(jīng)常改變的情況下。
StringBuilder
StringBuilder是5.0新增的。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區(qū)被單個線程使用的時候(這種情況很普遍)。如果可能,建議優(yōu)先采用該類,因為在大多數(shù)實現(xiàn)中,它比 StringBuffer 要快。兩者的方法基本相同。
使用策略
- 基本原則:
如果要操作少量的數(shù)據(jù),用String ;
單線程操作大量數(shù)據(jù),用StringBuilder ;
多線程操作大量數(shù)據(jù),用StringBuffer。 - 不要使用String類的”+”來進行頻繁的拼接,因為那樣的性能極差的,應該使用StringBuffer或StringBuilder類,這在Java的優(yōu)化上是一條比較重要的原則。
- StringBuilder一般使用在方法內(nèi)部來完成類似”+”功能,因為是線程不安全的,所以用完以后可以丟棄。StringBuffer主要用在全局變量中。
- 相同情況下使用 StirngBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升,但卻要冒多線程不安全的風險。而在現(xiàn)實的模塊化編程中,負責某一模塊的程序員不一定能清晰地判斷該模塊是否會放入多線程的環(huán)境中運行,因此:除非確定系統(tǒng)的瓶頸是在 StringBuffer 上,并且確定你的模塊不會運行在多線程模式下,才可以采用StringBuilder;否則還是用StringBuffer。



Hashset 存放對象
- 覆蓋實現(xiàn)equals
-
覆蓋實現(xiàn)hashCode
ii

Collections util中的包

范型

//java7
List <String> list = new ArrayList<>();
范型類
返回值為Set<type> 的數(shù)據(jù)結構
java IO

其中:紅色斜體代表抽象基類,無法直接創(chuàng)建實例;藍色粗體代表節(jié)點流,必須直接與指定的物理節(jié)點關聯(lián)。
說明:
1)表中的4個訪問管道流,它們都用于實現(xiàn)進程之間通信功能。
2)表中的4個緩沖流增加了緩沖功能,可以提高輸入、輸出的效率,增加緩沖功能后需要使用flush()才可以將緩沖區(qū)的內(nèi)容寫入實際的物理節(jié)點。
3)表中的2個對象流主要用于實現(xiàn)對象的序列化。
4)表中的2個轉(zhuǎn)換流,用于實現(xiàn)將字節(jié)流轉(zhuǎn)換成字符流。
緩沖流
為了提高數(shù)據(jù)讀寫的速度,Java API提供了帶緩沖功能的流類,在使用這些流類時,會創(chuàng)建一個內(nèi)部緩沖區(qū)數(shù)組。
根據(jù)數(shù)據(jù)操作單位可以把緩沖流分為
字節(jié)流:BufferedInputStream和BufferedOutputStream
字符流:BufferedReader 和 BufferedWriter
緩沖流要“套接”在相應的節(jié)點流之上,對讀寫的數(shù)據(jù)提供了緩沖的功能,提高了讀寫的效率,同時增加了一些新的方法
對于輸出的緩沖流,寫出的數(shù)據(jù)會先在內(nèi)存中緩存,使用flush()將會使內(nèi)存中的數(shù)據(jù)立刻寫出。
