一些JAVA學(xué)習(xí)筆記
準(zhǔn)備工作
1、JDK:java develop kit ,java開(kāi)發(fā)工具包;
2、JRE:java runtime environment, java 運(yùn)行時(shí)環(huán)境;
3、JDK 的三個(gè)版本:
J2SE:java標(biāo)準(zhǔn)版,桌面程序和小應(yīng)用程序的開(kāi)發(fā)
J2EE:java企業(yè)版,企業(yè)級(jí)的開(kāi)發(fā)(WEB開(kāi)發(fā))
J2ME:主要是手持移動(dòng)設(shè)備程序的開(kāi)發(fā);
4、JAVA的特性:
a 簡(jiǎn)單的
java屏棄了c++中一些復(fù)雜的操作,如指針、結(jié)構(gòu)等
b 面向?qū)ο蟮?/font>
java是完全面向?qū)ο蟮?/font>
c 健壯的
java通過(guò)檢查編譯和運(yùn)行時(shí)的錯(cuò)誤來(lái)保證程序的可靠性
java提供的垃圾回收機(jī)制,保證了內(nèi)存不會(huì)泄露
d 安全的
e 解釋的
? java是解釋執(zhí)行的,而不是編譯執(zhí)行的,通過(guò)生成java的字節(jié)碼,來(lái)解釋執(zhí)行
f 平臺(tái)無(wú)關(guān)的
? java生成字節(jié)碼,由java解釋器來(lái)解釋
g 多線程的
? 在語(yǔ)言級(jí)上支持多線程
h 動(dòng)態(tài)的
? java將變量或方法的引用轉(zhuǎn)換成符號(hào)引用保存下來(lái),傳遞給解釋器,由解釋器來(lái)動(dòng)態(tài)決定其加載;
5、java跨平臺(tái)的原理:
·java的跨平臺(tái)是通過(guò)JVM來(lái)實(shí)現(xiàn)的。Java的編譯器在編譯java的源代碼的時(shí),并不是將變量和方法的引用編譯為數(shù)值引用,也不確定內(nèi)存布局,而是將這些信息保存在字節(jié)碼中,由解釋器在運(yùn)行時(shí)候確定內(nèi)存布局。也就是說(shuō),java的編譯器生成的字節(jié)碼中,并不包含與特定硬件平臺(tái)相關(guān)的信息。
·java解釋器的執(zhí)行過(guò)程分為:字節(jié)碼的裝載、校驗(yàn)、執(zhí)行。在裝載過(guò)程中,由裝載器裝載字節(jié)碼,所有本地代碼都被裝載到同一個(gè)內(nèi)存命名空間里,而所有外部引用的代碼都有自己的內(nèi)存命名空間,本地代碼只是保存了對(duì)其引用的符號(hào)信息。當(dāng)所有字節(jié)碼都裝載完成后,java解釋器就確定了內(nèi)存布局。
·通過(guò)實(shí)現(xiàn)不同平臺(tái)下的JVM,來(lái)實(shí)現(xiàn)字節(jié)碼的跨平臺(tái);
6、jdk\bin\jar.exe 可以對(duì)程序進(jìn)行打包、發(fā)布;
7、在java中,文件名必須與被聲明為public的類相同,所以在java文件中,最多只能有一個(gè)public的類;
8、java解釋器加載的是類,因此,對(duì)類名的大小寫是敏感的;
9、/** …..*/這種注釋可以自動(dòng)生成一個(gè)注釋的文檔;
10、當(dāng)定義了classpath后,java解釋器就會(huì)按照classpath進(jìn)行查找,而不查找當(dāng)前目錄,若想查找當(dāng)前,則在classpath中加入。;
11、java提供了8種基本數(shù)據(jù)類型:
byte 有符號(hào)的1字節(jié)的整數(shù) (-128---127)
注 byte類型參與運(yùn)算時(shí),java會(huì)將其類型自動(dòng)提升為int,
如 byte a ; a= (byte)(a*2);
? ? short ? 有符號(hào)的2字節(jié)的整數(shù) 注 同上
? int (4)
? long (8) ? 注 默認(rèn)1.3這樣的數(shù),默認(rèn)為double
? ? ? float (4)
? ? ? double (8) ? ? ? ? ? ? ? ? ? ? ? ?
? ? char ? ? 無(wú)符號(hào)的2個(gè)字節(jié) unicode編碼,表示
? boolean
12、java數(shù)組在定義時(shí),不能直接分配空間;
Int[] array;
Array={1,3}; //這種寫法是error的
13、java中二維數(shù)組,列數(shù)可以不相同,實(shí)際上每一行都是一個(gè)一維數(shù)組;
14、int i=3 ,count;
Count=(i++)+(i++)+(i++);
Out: count=12;
Count=(++i)+(++i)+(++i);
Out: count=15;
位運(yùn)算
1、計(jì)算機(jī)數(shù)據(jù)常用16進(jìn)制表示;
2、原碼:第一位為符號(hào)位,0表示正,1表示負(fù);
反碼:正數(shù)的反碼是原碼本身,負(fù)數(shù)的反碼是符號(hào)位不變,其他各位按原碼取反;
補(bǔ)碼:正數(shù)的補(bǔ)碼是原碼本身,負(fù)數(shù)的補(bǔ)碼是符號(hào)位不變,其他各位取反加1;
3、計(jì)算機(jī)采用補(bǔ)碼進(jìn)行數(shù)據(jù)處理;
4、位運(yùn)算符:
& 按位與 只有兩位都為1時(shí),結(jié)果為1;
| 按位或 兩位任意一位為1時(shí),結(jié)果為1;
^ ? 按位異或 只有兩位不同時(shí),結(jié)果才為1;
~ 按位取反
5、移位運(yùn)算符:
<< 左移
>> 帶符號(hào)右移 (負(fù)數(shù):所有空位都補(bǔ)1)
>>> 無(wú)符號(hào)右移
6、API
Java.lang.Integer. toHexString(int i); //整型轉(zhuǎn)換為其對(duì)應(yīng)的十六進(jìn)制數(shù)
7、移位運(yùn)算的效率要高于存儲(chǔ)運(yùn)算,在一些講求效率的程序中,應(yīng)考慮使用移位運(yùn)算;
8、<<1 左移一位,相當(dāng)于乘以2;
>>1 右移一位,相當(dāng)于除以2;
Java的面向?qū)ο缶幊?/font>
1、OOP:描述的是對(duì)象和對(duì)象之間的相互作用;
2、面向過(guò)程和面向?qū)ο缶幊痰膮^(qū)別:
·面向過(guò)程編程,一般是先確定算法,然后考慮數(shù)據(jù)結(jié)構(gòu),而面向?qū)ο缶幊蹋瑒t是先確定數(shù)據(jù)結(jié)構(gòu),在設(shè)計(jì)算法;
·面向過(guò)程編程,往往是將數(shù)據(jù)保存到數(shù)據(jù)結(jié)構(gòu)中,并通過(guò)方法來(lái)操作數(shù)據(jù),而面向?qū)ο蟮木幊讨校瑒t是將數(shù)據(jù)和方法組織到一個(gè)對(duì)象中;
3、類是對(duì)象的摸板,對(duì)象是類的實(shí)例;
4、面向?qū)ο缶幊趟悸罚合葘F(xiàn)實(shí)世界實(shí)體抽象成對(duì)象,然后考慮解決的方法;
5、類的構(gòu)造方法,沒(méi)有返回類型,名字與類名相同,構(gòu)造函數(shù)用于對(duì)類對(duì)象定義初始化狀態(tài),每個(gè)類必須有構(gòu)造函數(shù),若沒(méi)顯示定義,則java編譯器會(huì)自動(dòng)生成一個(gè)不含參數(shù)的構(gòu)造方法,若顯示定義,則java不會(huì)提供任何默認(rèn)構(gòu)造方法;
6、new 關(guān)鍵字:
·為對(duì)象分配空間 ·引起構(gòu)造函數(shù)的調(diào)用 ·返回一個(gè)對(duì)象的引用
7、方法的重載(OverLoad)
·構(gòu)成重載的條件:方法名稱相同,參數(shù)個(gè)數(shù)或參數(shù)類型不同;
8、this 關(guān)鍵字:
·this關(guān)鍵字代表著一個(gè)特定的類對(duì)象本身;
·this 只在方法內(nèi)部使用,代表調(diào)用方法的對(duì)象本身;
·this 可以簡(jiǎn)化構(gòu)造方法的調(diào)用this();
9、java的成員方法在內(nèi)存中都只包含一份拷貝,被所有對(duì)象所共享;而成員變量則有多份拷貝,屬于不同對(duì)象所擁有。當(dāng)特定對(duì)象調(diào)用一個(gè)成員方法的時(shí)候,this被表示為指代該對(duì)象,去調(diào)用成員方法,然后與該對(duì)象的成員變量進(jìn)行關(guān)聯(lián);
10、static 關(guān)鍵字
·被定義為static的方法或變量,是屬于一個(gè)類的,而不屬于某一個(gè)對(duì)象的;
·static的方法或變量,在類加載的時(shí)候,就分配了內(nèi)存空間,并且在內(nèi)存中只有一份拷貝;
·在static的方法中,不可以引用非static的方法和變量,而在非static的方法中,可以引用static的方法或變量;
·static的方法和變量可以通過(guò)類和對(duì)象來(lái)引用(實(shí)質(zhì)還是通過(guò)類來(lái)引用)
11、final 關(guān)鍵字
? ·被聲明為final的常量,是不允許被修改的,并且在定義時(shí),就必須對(duì)其進(jìn)行初始化(實(shí)際也可以將初始化放到構(gòu)造函數(shù)中);
·常把final的常量,同時(shí)聲明為static,可以節(jié)約空間;
12、java中通過(guò)extends 實(shí)現(xiàn)繼承,不允許多繼承;
13、override
在子類中實(shí)現(xiàn)一個(gè)與父類中,具有相同名稱,返回類型,參數(shù)的方法,稱為方法的重寫;
14、super 關(guān)鍵字
·super 提供了子類中訪問(wèn)被重寫或隱藏了的父類的方法或變量的方法;
·在子類的構(gòu)造函數(shù)中,都會(huì)在第一句隱式地加入一句super(),如果父類中沒(méi)有這樣的構(gòu)造函數(shù),則會(huì)報(bào)錯(cuò);
15、多態(tài):
java中根據(jù)傳遞參數(shù)所引用的對(duì)象的不同,來(lái)調(diào)用相應(yīng)子類的方法;
·編譯時(shí)多態(tài):方法的重載;
·運(yùn)行時(shí)多態(tài):根據(jù)傳遞對(duì)象的不同,來(lái)調(diào)用不同的方法;
16、instanceof
用于判斷一個(gè)對(duì)象是否為一個(gè)類的實(shí)例;
包
1、使用package關(guān)鍵字定義包,包層次對(duì)應(yīng)目錄的層次;
2、使用 javac –d 目錄 *.java 編譯,生成包
? 使用 java 包名.類名來(lái)執(zhí)行文件;
3、使用import 來(lái)導(dǎo)入一個(gè)包;
類的修飾符
1、·public:公共類 ? ? ? ? ?
·default:包內(nèi)可見(jiàn)
2、final:被聲明為final的類,是最終類,不允許被繼承;
? ·java.lang.String類是個(gè)final類;
3、abstract:包含抽象方法的類;
? ? ? 不允許產(chǎn)生抽象類的對(duì)象;
? ? ? 可以將不包含任何抽象方法的類,聲明為abstract,以避免產(chǎn)生這個(gè)類的任何對(duì)象;
4、方法訪問(wèn)說(shuō)明符
? public ? 公共的
protected 同一包中或不同包中的子類可以訪問(wèn)
default ? 同一包內(nèi)可以訪問(wèn)
private ? 同一個(gè)類內(nèi)可以訪問(wèn)
5、其他方法說(shuō)明符
· static
· final ?
將方法定義為final,則在繼承過(guò)程中,子類將不能重寫該方法;
private和static方法,自然都是final的;
· abstract 不包含方法體的方法;
· native:JNI(Java Native Interface)
? ? ? ·JNI允許JVM中運(yùn)行的java程序與其他語(yǔ)言編寫的應(yīng)用程序進(jìn)行互操作;
? ? ? ·JNI可以理解為java程序和本地應(yīng)用程序的之間的中介;
? ? ? ·JNI程序編寫步驟:
1、寫一段java代碼;
? ? ? ? 2、編譯java代碼
? ? ? ? 3、創(chuàng)建 .h文件(使用javah –jni 類名)
? ? ? ? 4、寫一個(gè)本地方法的實(shí)現(xiàn)
? ? ? ? 5、創(chuàng)建一個(gè)共享的庫(kù)
? ? ? ? 6、執(zhí)行java程序;
垃圾回收
1、沒(méi)有任何引用的對(duì)象,成為垃圾內(nèi)存,會(huì)被垃圾回收器回收;
2、垃圾回收器是自動(dòng)運(yùn)行的,當(dāng)JVM感覺(jué)到內(nèi)存不夠的時(shí),就會(huì)自動(dòng)運(yùn)行來(lái)處理垃圾內(nèi)存;
3、垃圾回收器在真正回收一個(gè)對(duì)象之前,會(huì)調(diào)用finalize()方法,子類重寫這個(gè)方法,來(lái)做一些配置系統(tǒng)資源或執(zhí)行其他清除的工作;
4、API
Java.lang.Object. finalize(); //垃圾回收前調(diào)用該方法
Java.lang.System.gc() ? //運(yùn)行垃圾回收器
接口
1、接口中全部方法默認(rèn)為public abstract,那么在實(shí)現(xiàn)接口的類中,也必須為public的;
2、實(shí)現(xiàn)一個(gè)接口,若想去創(chuàng)建一個(gè)實(shí)現(xiàn)類的對(duì)象,那么就必須去實(shí)現(xiàn)接口中的所有方法;
? 否則,實(shí)現(xiàn)類必須聲明為abstract;
3、接口中允許有數(shù)據(jù)成員,這些成員默認(rèn)為 Public static final
4、java中允許一個(gè)接口繼承另一個(gè)接口;
5、java 中不允許類的多繼承,但允許接口的多繼承;
6、先繼承類,然后再實(shí)現(xiàn)接口;
內(nèi)部類
1、在一個(gè)類中,定義一個(gè)類,這個(gè)類就叫做內(nèi)部類;
2、當(dāng)我們建立一個(gè)內(nèi)部類時(shí),內(nèi)部類的對(duì)象就會(huì)與外部類的對(duì)象之間產(chǎn)生某種聯(lián)系,這種聯(lián)系是通過(guò)this 引用形成的,從而使的內(nèi)部類可以隨意訪問(wèn)外部類的成員(包括private的)
3、在內(nèi)部類的方法中,通過(guò)this.x 引用內(nèi)部類的成員變量;通過(guò)outer.this.x引用外部類的成員變量;
4、使用外部類名.內(nèi)部類名(outer.inner)的方式,在outer類外部引用內(nèi)部類;
5、在未產(chǎn)生一個(gè)外部類對(duì)象時(shí),不能使用new來(lái)直接創(chuàng)建一個(gè)內(nèi)部類對(duì)象,因?yàn)閮?nèi)部類對(duì)象都是和一個(gè)外部類對(duì)象想關(guān)聯(lián)的,使用 Inner in=outer.new Inner()可以創(chuàng)建(outer為已創(chuàng)建的外部類對(duì)象);
6、內(nèi)部類可以放到方法、條件語(yǔ)句體、語(yǔ)句塊中,但不管嵌套的層次有多深,內(nèi)部類都可以隨意訪問(wèn)外部類的成員;
7、當(dāng)內(nèi)部類在一個(gè)方法內(nèi)部定義的時(shí)候,那么方法的參數(shù)或局部變量,必須聲明為final,才可以被內(nèi)部類調(diào)用;
8、內(nèi)部類可以被聲明為protected 和private的;
9、內(nèi)部類可以被聲明為static的類,這時(shí),創(chuàng)建內(nèi)部類對(duì)象就不需要必須首先產(chǎn)生一個(gè)外部類對(duì)象做為前提了,而這樣,內(nèi)部類也不能隨意訪問(wèn)外部類的非static的成員了;
? (static切斷了外部類與內(nèi)部類之間的關(guān)系)
10、非static的內(nèi)部類中,不能有靜態(tài)的方法或變量存在;
11、內(nèi)部類可以實(shí)現(xiàn)接口;
12、將內(nèi)部類聲明為private的,可以很好的隱藏實(shí)現(xiàn)的細(xì)節(jié);
13、匿名內(nèi)部類可以用于實(shí)現(xiàn)適配器類,在AWT編程中,經(jīng)常使用到;
異常處理
1、Exception類:定義了程序中遇到的輕微錯(cuò)誤條件,需要我們?cè)诔绦蛑羞M(jìn)行處理;
2、Error類:定義了程序中遇到的嚴(yán)重錯(cuò)誤條件,內(nèi)存溢出,文件格式錯(cuò)誤等,不需要我們?nèi)ヌ幚恚?/font>java 運(yùn)行時(shí)系統(tǒng)來(lái)進(jìn)行處理;
3、Java程序如果在運(yùn)行的過(guò)程,發(fā)生了異常,就會(huì)自動(dòng)生成一個(gè)異常對(duì)象,并將該異常對(duì)
? 象提交給java運(yùn)行時(shí)系統(tǒng)(拋出異常throws),接受到異常對(duì)象,java運(yùn)行時(shí)系統(tǒng)就會(huì)查找能夠處理該異常的代碼,并將該異常對(duì)象交給它進(jìn)行處理(捕獲異常catch)。如果找不到能夠處理該異常的代碼,java程序就會(huì)終止運(yùn)行;
4、try/catch/finally 來(lái)處理異常;
5、在try中,發(fā)生異常的語(yǔ)句后的程序段,不會(huì)被執(zhí)行,而是直接跳轉(zhuǎn)到catch語(yǔ)句里去;
執(zhí)行完catch里的語(yǔ)句,會(huì)繼續(xù)執(zhí)行后面的語(yǔ)句;finally里的語(yǔ)句始終都要執(zhí)行;
6、API
? Java.lang.Throwable. getMessage()
? Java.lang.Throwable. toString()
Java.lang.Throwable. printStackTrace() ? //以上都是捕獲異常的信息
6、在方法的參數(shù)列表后,跟上 throws Exception 用來(lái)聲明,該方法有可能會(huì)拋出異常。一旦,產(chǎn)生了異常,則異常會(huì)被拋給該方法的調(diào)用者。如果方法的調(diào)用者不做處理,依舊可以逐級(jí)向上拋,直到main函數(shù)也不做處理,將該異常拋給 java runtime system來(lái)處理;
7、throw 實(shí)際拋出一個(gè)異常
throws 聲明拋出一個(gè)異常
8、RunTime 異常一般不需要我們?nèi)ヌ幚恚蛇\(yùn)行時(shí)系統(tǒng)自己處理;
9、子類在覆蓋父類方法的時(shí)候,不能拋出新的異常,而只能是相同的異常或該異常的子集;
String類
1、String 類是final類,不允許被繼承;
2、= = 是比較變量的值(引用對(duì)象的地址)是否相等
? equals()是比較變量的內(nèi)容(引用的對(duì)象內(nèi)容)是否相等;
3、+ 用于連接字符串;
4、+ 和+=是java中唯一被重載的操作符;
5、String 變量是個(gè)常量,一旦被創(chuàng)建,就不能被改變;
6、在處理大量字符串的程序中,常用 StringBuffer 來(lái)代替String ;
7、API
? Java.lang.StringBuffer.append() //
8、StringBuffer 創(chuàng)建的對(duì)象空間初始為16個(gè)字符,但當(dāng)空間不夠的時(shí)候,會(huì)自動(dòng)增加;
9、java中的傳遞參數(shù),都是以傳值的方式,基本類型是傳遞值的拷貝,引用類型是傳遞的引用的拷貝;
10、當(dāng)打印一個(gè)對(duì)象的時(shí)候,會(huì)調(diào)用該對(duì)象的toString方法;
克隆機(jī)制:
·為了獲得對(duì)象的一份拷貝,我們可以使用Object類中的clone()方法,在派生類中重寫clone()方法,并聲名為public;
·必須在繼承類中實(shí)現(xiàn)cloneable接口(標(biāo)識(shí)接口),來(lái)告訴編譯器:該對(duì)象可以克隆了;
·在繼承類的clone()中調(diào)用 super。Clone();
·淺拷貝:當(dāng)在類中沒(méi)有引用對(duì)象存在時(shí),類中所有的變量都可以拷貝過(guò)去;
深拷貝:當(dāng)類中有存在引用對(duì)象時(shí),將該引用對(duì)象一同克隆一份的克隆方法;(將引用對(duì)象所對(duì)應(yīng)的類也重寫clone方法,并且實(shí)現(xiàn)cloneable接口,并且在引用類的clone方法中,將clone方法返回值賦值給引用的變量中);
數(shù)組操作:
1、API
java.lang.system.arraycopy //數(shù)組的拷貝
? java.util.Arrays.sort ? ? // 對(duì)數(shù)組進(jìn)行排序
? java.util.Arrays.binarySearch // 對(duì)有序數(shù)組進(jìn)行搜索
2、排序?qū)ο髷?shù)組,數(shù)組中的所有對(duì)象都必須實(shí)現(xiàn)Comparable接口;
封裝類:
1、針對(duì)八種基本類型,java中存在八個(gè)封裝類;
2、數(shù)字字符串轉(zhuǎn)換為Integer類型: valueOf(String s);
? 數(shù)字字符串轉(zhuǎn)換為int 類型: ? parseInt(String s);
反射API
1、java.lang.reflect包
單例模式:
1、每一個(gè)類都只有一個(gè)實(shí)例;
2、單例模式的構(gòu)造方法是private的
3、主要用于:需要一個(gè)類只提供一個(gè)實(shí)例的時(shí)候,例如計(jì)數(shù)器;
4、單例類的一個(gè)實(shí)現(xiàn):
? class Singleton
{
? private static Singleton st=new Singleton();
? private Singleton()
? {
}
public static Singleton getInstance()
{
return st;
}
}
5、參考書《java與模式》閻宏電子工業(yè)出版社
多線程:
1、程序:程序是一系列計(jì)算機(jī)指令的集合,以文件的形式存儲(chǔ)在計(jì)算機(jī)磁盤上;
? 進(jìn)程:進(jìn)程是一個(gè)程序在其自身地址空間內(nèi)的一次執(zhí)行活動(dòng),它可以申請(qǐng)系統(tǒng)資源,被調(diào)度、運(yùn)行;
? 線稱:線程是一個(gè)進(jìn)程中的一個(gè)單一連續(xù)控制流程,一個(gè)進(jìn)程可以擁有多個(gè)線程,沒(méi)有獨(dú)立的內(nèi)存空間,而是與其他線稱共享同一進(jìn)程的地址空間;
2、進(jìn)程與進(jìn)程切換上下文切換耗時(shí),遠(yuǎn)遠(yuǎn)低于線程間切換的效率;
3、java在語(yǔ)言級(jí)支持多線程;
4、實(shí)現(xiàn)多線程的方法:
? 一、繼承Thread 類;
? 二、實(shí)現(xiàn)Runnable接口;
5、實(shí)現(xiàn)run()方法,并用start()啟動(dòng)一個(gè)線程;
6、setDaemon(boolean )設(shè)置一個(gè)線程為后臺(tái)線程,當(dāng)程序的線程都為后抬線程時(shí),程序就會(huì)退出;
7、yield()方法可以使一個(gè)線程放棄自己的時(shí)間片,而讓出執(zhí)行機(jī)會(huì)給其他線程;
8、setPriority設(shè)置一個(gè)線程的優(yōu)先級(jí);
9、java的線程調(diào)度機(jī)制,不支持時(shí)間片輪換,而是支持搶占式的方式,對(duì)于具有相同級(jí)別的線程,如果操作系統(tǒng)支持時(shí)間片輪換,則java虛擬機(jī)也支持這種方式;
10、sleep():在指定的毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行)。該線程不丟失任何監(jiān)視器的所屬權(quán)。
11、線程同步:同步塊和同步方法;
? ·synchronized(obj)塊,一個(gè)線程進(jìn)入synchronized塊前,先給obj對(duì)象監(jiān)視器加鎖,其他線程則不能進(jìn)入,等離開(kāi)時(shí),則對(duì)監(jiān)視器解鎖;
? ·synchronized方法,使用synchronized聲明一個(gè)方法,這種方法的鎖是加到this對(duì)象上邊;
12、線程的死鎖:
13、wait():導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法
notify():?jiǎn)拘言诖藢?duì)象監(jiān)視器上等待的單個(gè)線程。如果所有線程都在此對(duì)象上等待,則會(huì)選擇喚醒其中一個(gè)線程。選擇是任意性的,并在對(duì)實(shí)現(xiàn)做出決定時(shí)發(fā)生。線程通過(guò)調(diào)用其中一個(gè)wait方法,在對(duì)象的監(jiān)視器上等待。
14、終止線程:
·設(shè)置一個(gè)flag變量;
·Intrrupte() 中斷有一個(gè)線程;
集合類:
1、集合框架(Collections Framework):就是一個(gè)用來(lái)表示和操作集合的統(tǒng)一的架構(gòu),包含了實(shí)現(xiàn)集合的類和接口;
2、集合框架中的接口:
? CollectionàSetàsortedSet ? ? ? ? ? MapàsortedMap
? ? ? ? à List
·collection:集合層次中的根接口,JDK中沒(méi)有提供這個(gè)接口的直接實(shí)現(xiàn)類;
·set:不能包含重復(fù)的元素。Sortedset是元素按照升序排列的set;
·list:是一個(gè)有序的集合(不是指的排列順序),可以包含重復(fù)的元素,提供按索引訪問(wèn)的方法;
·map:包含了key-value對(duì)。不能包含重復(fù)的元素。Sortedmap是一個(gè)將key值按升序排列的map;
3、ArrayList
·arraylist可以看成是一個(gè)可以增長(zhǎng)容量的數(shù)組;
·arraylist的實(shí)現(xiàn)是使用了一個(gè)對(duì)象數(shù)組,當(dāng)容量不夠的時(shí)候,會(huì)重新分配一個(gè)數(shù)組,將原來(lái)數(shù)組中的元素拷貝到新數(shù)組中;
·數(shù)組à List (Arrays.asList())
Listà數(shù)組 ? (arrayList.toArray())
·迭代器(Itertator):
·對(duì)于沒(méi)有提供get方法的集合類,可以使用iterator來(lái)返回集合中的元素;
·可以提供一個(gè)通用的方法來(lái)返回元素,如
Pubilc static vid printElems(Collection c)
{
? ? Iterator i=c.iterator();
? ? While(i.hasNext())
? ? {
? ? ? System.out.println(i.next());
}
}
4、collections
·collections類中所有的方法都是static的
·自然排序
·使用比較器排序
5、LinkedList
? ·使用雙向循環(huán)鏈表實(shí)現(xiàn)的;
? ·可以實(shí)現(xiàn)棧、隊(duì)列、雙向隊(duì)列;
·ArrayList和LinkedList的比較:
? ·arrayList的低層是采用數(shù)組來(lái)實(shí)現(xiàn)的,而linkedlist是采用雙向鏈表實(shí)現(xiàn)的,linkedlist的每一個(gè)對(duì)象中,都包含了除了自身數(shù)據(jù)元素外的,兩個(gè)值,一個(gè)指向前一個(gè)元素,一個(gè)指向后一個(gè)元素;
? ·如果經(jīng)常要在list中的第一個(gè)位置插入數(shù)據(jù)或頻繁插入或刪除操作,則使用LinkedList
? 如果要經(jīng)常地查找某一個(gè)元素,則使用ArrayList,它提供了按索引查找;
6、HashSet
? ·實(shí)現(xiàn)set接口的hash table,依靠hash map來(lái)實(shí)現(xiàn)的;
? ·hashset的默認(rèn)負(fù)載因子是0.75
? ·每一個(gè)對(duì)象都有個(gè)hashCode,根據(jù)內(nèi)存地址計(jì)算出來(lái)的;
·hashset中存儲(chǔ)元素,則元素的類必須實(shí)現(xiàn)hashCode()和equals()
7、ThreeSet
·ThreeSet是依靠threeMap來(lái)實(shí)現(xiàn)的;
·ThreeSet中的元素是有序的,缺省按照升序排列,因此threeset中的元素必須實(shí)現(xiàn)Comparable接口;
·HashSet 和TreeSet的比較:
HashSet是基于hash算法來(lái)實(shí)現(xiàn)的,通常其性能都是優(yōu)于TreeSet,通常都是使用hashset的;只有使用到排序功能的時(shí)候,才會(huì)使用TreeSet;
8、HashMap
9、TreeMap
·按照key排序
·HashMap和TreeMap的比較:
? 與set的一樣;
I/O操作
1、一個(gè)java中的File類,即可以表示一個(gè)文件,也可以表示一個(gè)目錄;
2、在程序運(yùn)行過(guò)程中,產(chǎn)生的運(yùn)行時(shí)臨時(shí)程序,可以通過(guò)deleteOnEixt(),在程序結(jié)束的時(shí)候清除這些中間文件;
3、java中的讀取和寫入都是通過(guò)流來(lái)完成的;
4、流:字節(jié)的源或目的;
5、流分類:節(jié)點(diǎn)流和過(guò)濾流(需要一個(gè)存在的節(jié)點(diǎn)流對(duì)象);
6、InputStream:
? Abstract int read()
? Int read(byte[])
? Int read(byte[],int off,int length)
? Void close()
7、outputStream:
? Abstract void write(int b)
? Void write(byte[] b)
? Void write(byte[] b,int off, int length)
? Void flush()
? Void close()
8、基本流:
? ·FileInputStream 和 FileOutputStream ? (節(jié)點(diǎn)流)
·BufferedInputStream 和 BufferedOutputStream (過(guò)濾流)
9、當(dāng)使用bufferedoutputstream()的時(shí)候,只有當(dāng)緩沖區(qū)滿的時(shí)候,才會(huì)輸出,可以使用flush()或關(guān)閉 close()方法強(qiáng)制輸出;
10、DataInputStream 和DataOutputStream (過(guò)濾流)
? ? 提供對(duì)基本數(shù)據(jù)類型的讀寫操作;
11、PipedInputStream 和 PipedOutputStream (管道流)
? ? 用于線程之間的通信;
12、java的輸入\輸出,提供的是一種鏈結(jié)機(jī)制,可以把兩個(gè)流首尾相結(jié),形成一個(gè)流管道。這種模式被稱為裝飾模型(Decorater)。
13、Reader 和 Writer 是用來(lái)讀寫字符流;
? InputStream 和 OutputStream 是用來(lái)讀寫字節(jié)流;
1、JDK:java develop kit ,java開(kāi)發(fā)工具包;
2、JRE:java runtime environment, java 運(yùn)行時(shí)環(huán)境;
3、JDK 的三個(gè)版本:
J2SE:java標(biāo)準(zhǔn)版,桌面程序和小應(yīng)用程序的開(kāi)發(fā)
J2EE:java企業(yè)版,企業(yè)級(jí)的開(kāi)發(fā)(WEB開(kāi)發(fā))
J2ME:主要是手持移動(dòng)設(shè)備程序的開(kāi)發(fā);
4、JAVA的特性:
a 簡(jiǎn)單的
java屏棄了c++中一些復(fù)雜的操作,如指針、結(jié)構(gòu)等
b 面向?qū)ο蟮?/font>
java是完全面向?qū)ο蟮?/font>
c 健壯的
java通過(guò)檢查編譯和運(yùn)行時(shí)的錯(cuò)誤來(lái)保證程序的可靠性
java提供的垃圾回收機(jī)制,保證了內(nèi)存不會(huì)泄露
d 安全的
e 解釋的
? java是解釋執(zhí)行的,而不是編譯執(zhí)行的,通過(guò)生成java的字節(jié)碼,來(lái)解釋執(zhí)行
f 平臺(tái)無(wú)關(guān)的
? java生成字節(jié)碼,由java解釋器來(lái)解釋
g 多線程的
? 在語(yǔ)言級(jí)上支持多線程
h 動(dòng)態(tài)的
? java將變量或方法的引用轉(zhuǎn)換成符號(hào)引用保存下來(lái),傳遞給解釋器,由解釋器來(lái)動(dòng)態(tài)決定其加載;
5、java跨平臺(tái)的原理:
·java的跨平臺(tái)是通過(guò)JVM來(lái)實(shí)現(xiàn)的。Java的編譯器在編譯java的源代碼的時(shí),并不是將變量和方法的引用編譯為數(shù)值引用,也不確定內(nèi)存布局,而是將這些信息保存在字節(jié)碼中,由解釋器在運(yùn)行時(shí)候確定內(nèi)存布局。也就是說(shuō),java的編譯器生成的字節(jié)碼中,并不包含與特定硬件平臺(tái)相關(guān)的信息。
·java解釋器的執(zhí)行過(guò)程分為:字節(jié)碼的裝載、校驗(yàn)、執(zhí)行。在裝載過(guò)程中,由裝載器裝載字節(jié)碼,所有本地代碼都被裝載到同一個(gè)內(nèi)存命名空間里,而所有外部引用的代碼都有自己的內(nèi)存命名空間,本地代碼只是保存了對(duì)其引用的符號(hào)信息。當(dāng)所有字節(jié)碼都裝載完成后,java解釋器就確定了內(nèi)存布局。
·通過(guò)實(shí)現(xiàn)不同平臺(tái)下的JVM,來(lái)實(shí)現(xiàn)字節(jié)碼的跨平臺(tái);
6、jdk\bin\jar.exe 可以對(duì)程序進(jìn)行打包、發(fā)布;
7、在java中,文件名必須與被聲明為public的類相同,所以在java文件中,最多只能有一個(gè)public的類;
8、java解釋器加載的是類,因此,對(duì)類名的大小寫是敏感的;
9、/** …..*/這種注釋可以自動(dòng)生成一個(gè)注釋的文檔;
10、當(dāng)定義了classpath后,java解釋器就會(huì)按照classpath進(jìn)行查找,而不查找當(dāng)前目錄,若想查找當(dāng)前,則在classpath中加入。;
11、java提供了8種基本數(shù)據(jù)類型:
byte 有符號(hào)的1字節(jié)的整數(shù) (-128---127)
注 byte類型參與運(yùn)算時(shí),java會(huì)將其類型自動(dòng)提升為int,
如 byte a ; a= (byte)(a*2);
? ? short ? 有符號(hào)的2字節(jié)的整數(shù) 注 同上
? int (4)
? long (8) ? 注 默認(rèn)1.3這樣的數(shù),默認(rèn)為double
? ? ? float (4)
? ? ? double (8) ? ? ? ? ? ? ? ? ? ? ? ?
? ? char ? ? 無(wú)符號(hào)的2個(gè)字節(jié) unicode編碼,表示
? boolean
12、java數(shù)組在定義時(shí),不能直接分配空間;
Int[] array;
Array={1,3}; //這種寫法是error的
13、java中二維數(shù)組,列數(shù)可以不相同,實(shí)際上每一行都是一個(gè)一維數(shù)組;
14、int i=3 ,count;
Count=(i++)+(i++)+(i++);
Out: count=12;
Count=(++i)+(++i)+(++i);
Out: count=15;
位運(yùn)算
1、計(jì)算機(jī)數(shù)據(jù)常用16進(jìn)制表示;
2、原碼:第一位為符號(hào)位,0表示正,1表示負(fù);
反碼:正數(shù)的反碼是原碼本身,負(fù)數(shù)的反碼是符號(hào)位不變,其他各位按原碼取反;
補(bǔ)碼:正數(shù)的補(bǔ)碼是原碼本身,負(fù)數(shù)的補(bǔ)碼是符號(hào)位不變,其他各位取反加1;
3、計(jì)算機(jī)采用補(bǔ)碼進(jìn)行數(shù)據(jù)處理;
4、位運(yùn)算符:
& 按位與 只有兩位都為1時(shí),結(jié)果為1;
| 按位或 兩位任意一位為1時(shí),結(jié)果為1;
^ ? 按位異或 只有兩位不同時(shí),結(jié)果才為1;
~ 按位取反
5、移位運(yùn)算符:
<< 左移
>> 帶符號(hào)右移 (負(fù)數(shù):所有空位都補(bǔ)1)
>>> 無(wú)符號(hào)右移
6、API
Java.lang.Integer. toHexString(int i); //整型轉(zhuǎn)換為其對(duì)應(yīng)的十六進(jìn)制數(shù)
7、移位運(yùn)算的效率要高于存儲(chǔ)運(yùn)算,在一些講求效率的程序中,應(yīng)考慮使用移位運(yùn)算;
8、<<1 左移一位,相當(dāng)于乘以2;
>>1 右移一位,相當(dāng)于除以2;
Java的面向?qū)ο缶幊?/font>
1、OOP:描述的是對(duì)象和對(duì)象之間的相互作用;
2、面向過(guò)程和面向?qū)ο缶幊痰膮^(qū)別:
·面向過(guò)程編程,一般是先確定算法,然后考慮數(shù)據(jù)結(jié)構(gòu),而面向?qū)ο缶幊蹋瑒t是先確定數(shù)據(jù)結(jié)構(gòu),在設(shè)計(jì)算法;
·面向過(guò)程編程,往往是將數(shù)據(jù)保存到數(shù)據(jù)結(jié)構(gòu)中,并通過(guò)方法來(lái)操作數(shù)據(jù),而面向?qū)ο蟮木幊讨校瑒t是將數(shù)據(jù)和方法組織到一個(gè)對(duì)象中;
3、類是對(duì)象的摸板,對(duì)象是類的實(shí)例;
4、面向?qū)ο缶幊趟悸罚合葘F(xiàn)實(shí)世界實(shí)體抽象成對(duì)象,然后考慮解決的方法;
5、類的構(gòu)造方法,沒(méi)有返回類型,名字與類名相同,構(gòu)造函數(shù)用于對(duì)類對(duì)象定義初始化狀態(tài),每個(gè)類必須有構(gòu)造函數(shù),若沒(méi)顯示定義,則java編譯器會(huì)自動(dòng)生成一個(gè)不含參數(shù)的構(gòu)造方法,若顯示定義,則java不會(huì)提供任何默認(rèn)構(gòu)造方法;
6、new 關(guān)鍵字:
·為對(duì)象分配空間 ·引起構(gòu)造函數(shù)的調(diào)用 ·返回一個(gè)對(duì)象的引用
7、方法的重載(OverLoad)
·構(gòu)成重載的條件:方法名稱相同,參數(shù)個(gè)數(shù)或參數(shù)類型不同;
8、this 關(guān)鍵字:
·this關(guān)鍵字代表著一個(gè)特定的類對(duì)象本身;
·this 只在方法內(nèi)部使用,代表調(diào)用方法的對(duì)象本身;
·this 可以簡(jiǎn)化構(gòu)造方法的調(diào)用this();
9、java的成員方法在內(nèi)存中都只包含一份拷貝,被所有對(duì)象所共享;而成員變量則有多份拷貝,屬于不同對(duì)象所擁有。當(dāng)特定對(duì)象調(diào)用一個(gè)成員方法的時(shí)候,this被表示為指代該對(duì)象,去調(diào)用成員方法,然后與該對(duì)象的成員變量進(jìn)行關(guān)聯(lián);
10、static 關(guān)鍵字
·被定義為static的方法或變量,是屬于一個(gè)類的,而不屬于某一個(gè)對(duì)象的;
·static的方法或變量,在類加載的時(shí)候,就分配了內(nèi)存空間,并且在內(nèi)存中只有一份拷貝;
·在static的方法中,不可以引用非static的方法和變量,而在非static的方法中,可以引用static的方法或變量;
·static的方法和變量可以通過(guò)類和對(duì)象來(lái)引用(實(shí)質(zhì)還是通過(guò)類來(lái)引用)
11、final 關(guān)鍵字
? ·被聲明為final的常量,是不允許被修改的,并且在定義時(shí),就必須對(duì)其進(jìn)行初始化(實(shí)際也可以將初始化放到構(gòu)造函數(shù)中);
·常把final的常量,同時(shí)聲明為static,可以節(jié)約空間;
12、java中通過(guò)extends 實(shí)現(xiàn)繼承,不允許多繼承;
13、override
在子類中實(shí)現(xiàn)一個(gè)與父類中,具有相同名稱,返回類型,參數(shù)的方法,稱為方法的重寫;
14、super 關(guān)鍵字
·super 提供了子類中訪問(wèn)被重寫或隱藏了的父類的方法或變量的方法;
·在子類的構(gòu)造函數(shù)中,都會(huì)在第一句隱式地加入一句super(),如果父類中沒(méi)有這樣的構(gòu)造函數(shù),則會(huì)報(bào)錯(cuò);
15、多態(tài):
java中根據(jù)傳遞參數(shù)所引用的對(duì)象的不同,來(lái)調(diào)用相應(yīng)子類的方法;
·編譯時(shí)多態(tài):方法的重載;
·運(yùn)行時(shí)多態(tài):根據(jù)傳遞對(duì)象的不同,來(lái)調(diào)用不同的方法;
16、instanceof
用于判斷一個(gè)對(duì)象是否為一個(gè)類的實(shí)例;
包
1、使用package關(guān)鍵字定義包,包層次對(duì)應(yīng)目錄的層次;
2、使用 javac –d 目錄 *.java 編譯,生成包
? 使用 java 包名.類名來(lái)執(zhí)行文件;
3、使用import 來(lái)導(dǎo)入一個(gè)包;
類的修飾符
1、·public:公共類 ? ? ? ? ?
·default:包內(nèi)可見(jiàn)
2、final:被聲明為final的類,是最終類,不允許被繼承;
? ·java.lang.String類是個(gè)final類;
3、abstract:包含抽象方法的類;
? ? ? 不允許產(chǎn)生抽象類的對(duì)象;
? ? ? 可以將不包含任何抽象方法的類,聲明為abstract,以避免產(chǎn)生這個(gè)類的任何對(duì)象;
4、方法訪問(wèn)說(shuō)明符
? public ? 公共的
protected 同一包中或不同包中的子類可以訪問(wèn)
default ? 同一包內(nèi)可以訪問(wèn)
private ? 同一個(gè)類內(nèi)可以訪問(wèn)
5、其他方法說(shuō)明符
· static
· final ?
將方法定義為final,則在繼承過(guò)程中,子類將不能重寫該方法;
private和static方法,自然都是final的;
· abstract 不包含方法體的方法;
· native:JNI(Java Native Interface)
? ? ? ·JNI允許JVM中運(yùn)行的java程序與其他語(yǔ)言編寫的應(yīng)用程序進(jìn)行互操作;
? ? ? ·JNI可以理解為java程序和本地應(yīng)用程序的之間的中介;
? ? ? ·JNI程序編寫步驟:
1、寫一段java代碼;
? ? ? ? 2、編譯java代碼
? ? ? ? 3、創(chuàng)建 .h文件(使用javah –jni 類名)
? ? ? ? 4、寫一個(gè)本地方法的實(shí)現(xiàn)
? ? ? ? 5、創(chuàng)建一個(gè)共享的庫(kù)
? ? ? ? 6、執(zhí)行java程序;
垃圾回收
1、沒(méi)有任何引用的對(duì)象,成為垃圾內(nèi)存,會(huì)被垃圾回收器回收;
2、垃圾回收器是自動(dòng)運(yùn)行的,當(dāng)JVM感覺(jué)到內(nèi)存不夠的時(shí),就會(huì)自動(dòng)運(yùn)行來(lái)處理垃圾內(nèi)存;
3、垃圾回收器在真正回收一個(gè)對(duì)象之前,會(huì)調(diào)用finalize()方法,子類重寫這個(gè)方法,來(lái)做一些配置系統(tǒng)資源或執(zhí)行其他清除的工作;
4、API
Java.lang.Object. finalize(); //垃圾回收前調(diào)用該方法
Java.lang.System.gc() ? //運(yùn)行垃圾回收器
接口
1、接口中全部方法默認(rèn)為public abstract,那么在實(shí)現(xiàn)接口的類中,也必須為public的;
2、實(shí)現(xiàn)一個(gè)接口,若想去創(chuàng)建一個(gè)實(shí)現(xiàn)類的對(duì)象,那么就必須去實(shí)現(xiàn)接口中的所有方法;
? 否則,實(shí)現(xiàn)類必須聲明為abstract;
3、接口中允許有數(shù)據(jù)成員,這些成員默認(rèn)為 Public static final
4、java中允許一個(gè)接口繼承另一個(gè)接口;
5、java 中不允許類的多繼承,但允許接口的多繼承;
6、先繼承類,然后再實(shí)現(xiàn)接口;
內(nèi)部類
1、在一個(gè)類中,定義一個(gè)類,這個(gè)類就叫做內(nèi)部類;
2、當(dāng)我們建立一個(gè)內(nèi)部類時(shí),內(nèi)部類的對(duì)象就會(huì)與外部類的對(duì)象之間產(chǎn)生某種聯(lián)系,這種聯(lián)系是通過(guò)this 引用形成的,從而使的內(nèi)部類可以隨意訪問(wèn)外部類的成員(包括private的)
3、在內(nèi)部類的方法中,通過(guò)this.x 引用內(nèi)部類的成員變量;通過(guò)outer.this.x引用外部類的成員變量;
4、使用外部類名.內(nèi)部類名(outer.inner)的方式,在outer類外部引用內(nèi)部類;
5、在未產(chǎn)生一個(gè)外部類對(duì)象時(shí),不能使用new來(lái)直接創(chuàng)建一個(gè)內(nèi)部類對(duì)象,因?yàn)閮?nèi)部類對(duì)象都是和一個(gè)外部類對(duì)象想關(guān)聯(lián)的,使用 Inner in=outer.new Inner()可以創(chuàng)建(outer為已創(chuàng)建的外部類對(duì)象);
6、內(nèi)部類可以放到方法、條件語(yǔ)句體、語(yǔ)句塊中,但不管嵌套的層次有多深,內(nèi)部類都可以隨意訪問(wèn)外部類的成員;
7、當(dāng)內(nèi)部類在一個(gè)方法內(nèi)部定義的時(shí)候,那么方法的參數(shù)或局部變量,必須聲明為final,才可以被內(nèi)部類調(diào)用;
8、內(nèi)部類可以被聲明為protected 和private的;
9、內(nèi)部類可以被聲明為static的類,這時(shí),創(chuàng)建內(nèi)部類對(duì)象就不需要必須首先產(chǎn)生一個(gè)外部類對(duì)象做為前提了,而這樣,內(nèi)部類也不能隨意訪問(wèn)外部類的非static的成員了;
? (static切斷了外部類與內(nèi)部類之間的關(guān)系)
10、非static的內(nèi)部類中,不能有靜態(tài)的方法或變量存在;
11、內(nèi)部類可以實(shí)現(xiàn)接口;
12、將內(nèi)部類聲明為private的,可以很好的隱藏實(shí)現(xiàn)的細(xì)節(jié);
13、匿名內(nèi)部類可以用于實(shí)現(xiàn)適配器類,在AWT編程中,經(jīng)常使用到;
異常處理
1、Exception類:定義了程序中遇到的輕微錯(cuò)誤條件,需要我們?cè)诔绦蛑羞M(jìn)行處理;
2、Error類:定義了程序中遇到的嚴(yán)重錯(cuò)誤條件,內(nèi)存溢出,文件格式錯(cuò)誤等,不需要我們?nèi)ヌ幚恚?/font>java 運(yùn)行時(shí)系統(tǒng)來(lái)進(jìn)行處理;
3、Java程序如果在運(yùn)行的過(guò)程,發(fā)生了異常,就會(huì)自動(dòng)生成一個(gè)異常對(duì)象,并將該異常對(duì)
? 象提交給java運(yùn)行時(shí)系統(tǒng)(拋出異常throws),接受到異常對(duì)象,java運(yùn)行時(shí)系統(tǒng)就會(huì)查找能夠處理該異常的代碼,并將該異常對(duì)象交給它進(jìn)行處理(捕獲異常catch)。如果找不到能夠處理該異常的代碼,java程序就會(huì)終止運(yùn)行;
4、try/catch/finally 來(lái)處理異常;
5、在try中,發(fā)生異常的語(yǔ)句后的程序段,不會(huì)被執(zhí)行,而是直接跳轉(zhuǎn)到catch語(yǔ)句里去;
執(zhí)行完catch里的語(yǔ)句,會(huì)繼續(xù)執(zhí)行后面的語(yǔ)句;finally里的語(yǔ)句始終都要執(zhí)行;
6、API
? Java.lang.Throwable. getMessage()
? Java.lang.Throwable. toString()
Java.lang.Throwable. printStackTrace() ? //以上都是捕獲異常的信息
6、在方法的參數(shù)列表后,跟上 throws Exception 用來(lái)聲明,該方法有可能會(huì)拋出異常。一旦,產(chǎn)生了異常,則異常會(huì)被拋給該方法的調(diào)用者。如果方法的調(diào)用者不做處理,依舊可以逐級(jí)向上拋,直到main函數(shù)也不做處理,將該異常拋給 java runtime system來(lái)處理;
7、throw 實(shí)際拋出一個(gè)異常
throws 聲明拋出一個(gè)異常
8、RunTime 異常一般不需要我們?nèi)ヌ幚恚蛇\(yùn)行時(shí)系統(tǒng)自己處理;
9、子類在覆蓋父類方法的時(shí)候,不能拋出新的異常,而只能是相同的異常或該異常的子集;
String類
1、String 類是final類,不允許被繼承;
2、= = 是比較變量的值(引用對(duì)象的地址)是否相等
? equals()是比較變量的內(nèi)容(引用的對(duì)象內(nèi)容)是否相等;
3、+ 用于連接字符串;
4、+ 和+=是java中唯一被重載的操作符;
5、String 變量是個(gè)常量,一旦被創(chuàng)建,就不能被改變;
6、在處理大量字符串的程序中,常用 StringBuffer 來(lái)代替String ;
7、API
? Java.lang.StringBuffer.append() //
8、StringBuffer 創(chuàng)建的對(duì)象空間初始為16個(gè)字符,但當(dāng)空間不夠的時(shí)候,會(huì)自動(dòng)增加;
9、java中的傳遞參數(shù),都是以傳值的方式,基本類型是傳遞值的拷貝,引用類型是傳遞的引用的拷貝;
10、當(dāng)打印一個(gè)對(duì)象的時(shí)候,會(huì)調(diào)用該對(duì)象的toString方法;
克隆機(jī)制:
·為了獲得對(duì)象的一份拷貝,我們可以使用Object類中的clone()方法,在派生類中重寫clone()方法,并聲名為public;
·必須在繼承類中實(shí)現(xiàn)cloneable接口(標(biāo)識(shí)接口),來(lái)告訴編譯器:該對(duì)象可以克隆了;
·在繼承類的clone()中調(diào)用 super。Clone();
·淺拷貝:當(dāng)在類中沒(méi)有引用對(duì)象存在時(shí),類中所有的變量都可以拷貝過(guò)去;
深拷貝:當(dāng)類中有存在引用對(duì)象時(shí),將該引用對(duì)象一同克隆一份的克隆方法;(將引用對(duì)象所對(duì)應(yīng)的類也重寫clone方法,并且實(shí)現(xiàn)cloneable接口,并且在引用類的clone方法中,將clone方法返回值賦值給引用的變量中);
數(shù)組操作:
1、API
java.lang.system.arraycopy //數(shù)組的拷貝
? java.util.Arrays.sort ? ? // 對(duì)數(shù)組進(jìn)行排序
? java.util.Arrays.binarySearch // 對(duì)有序數(shù)組進(jìn)行搜索
2、排序?qū)ο髷?shù)組,數(shù)組中的所有對(duì)象都必須實(shí)現(xiàn)Comparable接口;
封裝類:
1、針對(duì)八種基本類型,java中存在八個(gè)封裝類;
2、數(shù)字字符串轉(zhuǎn)換為Integer類型: valueOf(String s);
? 數(shù)字字符串轉(zhuǎn)換為int 類型: ? parseInt(String s);
反射API
1、java.lang.reflect包
單例模式:
1、每一個(gè)類都只有一個(gè)實(shí)例;
2、單例模式的構(gòu)造方法是private的
3、主要用于:需要一個(gè)類只提供一個(gè)實(shí)例的時(shí)候,例如計(jì)數(shù)器;
4、單例類的一個(gè)實(shí)現(xiàn):
? class Singleton
{
? private static Singleton st=new Singleton();
? private Singleton()
? {
}
public static Singleton getInstance()
{
return st;
}
}
5、參考書《java與模式》閻宏電子工業(yè)出版社
多線程:
1、程序:程序是一系列計(jì)算機(jī)指令的集合,以文件的形式存儲(chǔ)在計(jì)算機(jī)磁盤上;
? 進(jìn)程:進(jìn)程是一個(gè)程序在其自身地址空間內(nèi)的一次執(zhí)行活動(dòng),它可以申請(qǐng)系統(tǒng)資源,被調(diào)度、運(yùn)行;
? 線稱:線程是一個(gè)進(jìn)程中的一個(gè)單一連續(xù)控制流程,一個(gè)進(jìn)程可以擁有多個(gè)線程,沒(méi)有獨(dú)立的內(nèi)存空間,而是與其他線稱共享同一進(jìn)程的地址空間;
2、進(jìn)程與進(jìn)程切換上下文切換耗時(shí),遠(yuǎn)遠(yuǎn)低于線程間切換的效率;
3、java在語(yǔ)言級(jí)支持多線程;
4、實(shí)現(xiàn)多線程的方法:
? 一、繼承Thread 類;
? 二、實(shí)現(xiàn)Runnable接口;
5、實(shí)現(xiàn)run()方法,并用start()啟動(dòng)一個(gè)線程;
6、setDaemon(boolean )設(shè)置一個(gè)線程為后臺(tái)線程,當(dāng)程序的線程都為后抬線程時(shí),程序就會(huì)退出;
7、yield()方法可以使一個(gè)線程放棄自己的時(shí)間片,而讓出執(zhí)行機(jī)會(huì)給其他線程;
8、setPriority設(shè)置一個(gè)線程的優(yōu)先級(jí);
9、java的線程調(diào)度機(jī)制,不支持時(shí)間片輪換,而是支持搶占式的方式,對(duì)于具有相同級(jí)別的線程,如果操作系統(tǒng)支持時(shí)間片輪換,則java虛擬機(jī)也支持這種方式;
10、sleep():在指定的毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行)。該線程不丟失任何監(jiān)視器的所屬權(quán)。
11、線程同步:同步塊和同步方法;
? ·synchronized(obj)塊,一個(gè)線程進(jìn)入synchronized塊前,先給obj對(duì)象監(jiān)視器加鎖,其他線程則不能進(jìn)入,等離開(kāi)時(shí),則對(duì)監(jiān)視器解鎖;
? ·synchronized方法,使用synchronized聲明一個(gè)方法,這種方法的鎖是加到this對(duì)象上邊;
12、線程的死鎖:
13、wait():導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法
notify():?jiǎn)拘言诖藢?duì)象監(jiān)視器上等待的單個(gè)線程。如果所有線程都在此對(duì)象上等待,則會(huì)選擇喚醒其中一個(gè)線程。選擇是任意性的,并在對(duì)實(shí)現(xiàn)做出決定時(shí)發(fā)生。線程通過(guò)調(diào)用其中一個(gè)wait方法,在對(duì)象的監(jiān)視器上等待。
14、終止線程:
·設(shè)置一個(gè)flag變量;
·Intrrupte() 中斷有一個(gè)線程;
集合類:
1、集合框架(Collections Framework):就是一個(gè)用來(lái)表示和操作集合的統(tǒng)一的架構(gòu),包含了實(shí)現(xiàn)集合的類和接口;
2、集合框架中的接口:
? CollectionàSetàsortedSet ? ? ? ? ? MapàsortedMap
? ? ? ? à List
·collection:集合層次中的根接口,JDK中沒(méi)有提供這個(gè)接口的直接實(shí)現(xiàn)類;
·set:不能包含重復(fù)的元素。Sortedset是元素按照升序排列的set;
·list:是一個(gè)有序的集合(不是指的排列順序),可以包含重復(fù)的元素,提供按索引訪問(wèn)的方法;
·map:包含了key-value對(duì)。不能包含重復(fù)的元素。Sortedmap是一個(gè)將key值按升序排列的map;
3、ArrayList
·arraylist可以看成是一個(gè)可以增長(zhǎng)容量的數(shù)組;
·arraylist的實(shí)現(xiàn)是使用了一個(gè)對(duì)象數(shù)組,當(dāng)容量不夠的時(shí)候,會(huì)重新分配一個(gè)數(shù)組,將原來(lái)數(shù)組中的元素拷貝到新數(shù)組中;
·數(shù)組à List (Arrays.asList())
Listà數(shù)組 ? (arrayList.toArray())
·迭代器(Itertator):
·對(duì)于沒(méi)有提供get方法的集合類,可以使用iterator來(lái)返回集合中的元素;
·可以提供一個(gè)通用的方法來(lái)返回元素,如
Pubilc static vid printElems(Collection c)
{
? ? Iterator i=c.iterator();
? ? While(i.hasNext())
? ? {
? ? ? System.out.println(i.next());
}
}
4、collections
·collections類中所有的方法都是static的
·自然排序
·使用比較器排序
5、LinkedList
? ·使用雙向循環(huán)鏈表實(shí)現(xiàn)的;
? ·可以實(shí)現(xiàn)棧、隊(duì)列、雙向隊(duì)列;
·ArrayList和LinkedList的比較:
? ·arrayList的低層是采用數(shù)組來(lái)實(shí)現(xiàn)的,而linkedlist是采用雙向鏈表實(shí)現(xiàn)的,linkedlist的每一個(gè)對(duì)象中,都包含了除了自身數(shù)據(jù)元素外的,兩個(gè)值,一個(gè)指向前一個(gè)元素,一個(gè)指向后一個(gè)元素;
? ·如果經(jīng)常要在list中的第一個(gè)位置插入數(shù)據(jù)或頻繁插入或刪除操作,則使用LinkedList
? 如果要經(jīng)常地查找某一個(gè)元素,則使用ArrayList,它提供了按索引查找;
6、HashSet
? ·實(shí)現(xiàn)set接口的hash table,依靠hash map來(lái)實(shí)現(xiàn)的;
? ·hashset的默認(rèn)負(fù)載因子是0.75
? ·每一個(gè)對(duì)象都有個(gè)hashCode,根據(jù)內(nèi)存地址計(jì)算出來(lái)的;
·hashset中存儲(chǔ)元素,則元素的類必須實(shí)現(xiàn)hashCode()和equals()
7、ThreeSet
·ThreeSet是依靠threeMap來(lái)實(shí)現(xiàn)的;
·ThreeSet中的元素是有序的,缺省按照升序排列,因此threeset中的元素必須實(shí)現(xiàn)Comparable接口;
·HashSet 和TreeSet的比較:
HashSet是基于hash算法來(lái)實(shí)現(xiàn)的,通常其性能都是優(yōu)于TreeSet,通常都是使用hashset的;只有使用到排序功能的時(shí)候,才會(huì)使用TreeSet;
8、HashMap
9、TreeMap
·按照key排序
·HashMap和TreeMap的比較:
? 與set的一樣;
I/O操作
1、一個(gè)java中的File類,即可以表示一個(gè)文件,也可以表示一個(gè)目錄;
2、在程序運(yùn)行過(guò)程中,產(chǎn)生的運(yùn)行時(shí)臨時(shí)程序,可以通過(guò)deleteOnEixt(),在程序結(jié)束的時(shí)候清除這些中間文件;
3、java中的讀取和寫入都是通過(guò)流來(lái)完成的;
4、流:字節(jié)的源或目的;
5、流分類:節(jié)點(diǎn)流和過(guò)濾流(需要一個(gè)存在的節(jié)點(diǎn)流對(duì)象);
6、InputStream:
? Abstract int read()
? Int read(byte[])
? Int read(byte[],int off,int length)
? Void close()
7、outputStream:
? Abstract void write(int b)
? Void write(byte[] b)
? Void write(byte[] b,int off, int length)
? Void flush()
? Void close()
8、基本流:
? ·FileInputStream 和 FileOutputStream ? (節(jié)點(diǎn)流)
·BufferedInputStream 和 BufferedOutputStream (過(guò)濾流)
9、當(dāng)使用bufferedoutputstream()的時(shí)候,只有當(dāng)緩沖區(qū)滿的時(shí)候,才會(huì)輸出,可以使用flush()或關(guān)閉 close()方法強(qiáng)制輸出;
10、DataInputStream 和DataOutputStream (過(guò)濾流)
? ? 提供對(duì)基本數(shù)據(jù)類型的讀寫操作;
11、PipedInputStream 和 PipedOutputStream (管道流)
? ? 用于線程之間的通信;
12、java的輸入\輸出,提供的是一種鏈結(jié)機(jī)制,可以把兩個(gè)流首尾相結(jié),形成一個(gè)流管道。這種模式被稱為裝飾模型(Decorater)。
13、Reader 和 Writer 是用來(lái)讀寫字符流;
? InputStream 和 OutputStream 是用來(lái)讀寫字節(jié)流;
posted on 2008-12-08 16:41 幽夢(mèng)新影 閱讀(1805) 評(píng)論(4) 編輯 收藏