總結java
Java知識點

1.Java主要的特點:“一次編譯,到處運行”原理是:說的是java語言跨平臺的特性:
?JAVA是一種編譯型-解釋型語言,當執行java文件時,編譯器首先會將.java類型的源文件編譯成.class類型的字節碼文件。
之后jvm虛擬機再運行編譯好的字節碼文件時,將字節碼文件解釋成具體平臺上的機器指令。java的跨平臺特性與jvm虛擬機的存在密不可分,
jvm虛擬機可以使java語言在不同的環境中運行。
2.變量的字節大小及有效取值范圍
byte占用一個字節,數字大小為-27—27-1
short占用兩個字節,數字大小為-215—215-1
int占用四個字節,數字大小為-231—231-1
long占用八個字節,數字大小為-263—263-1
float占用四個字節,數字大小為1.4E-45~3.4E+38 , -1.4E-45~-3.4E+38 。用二進制的指數形式表示一個浮點數的格式,如:10122 , 1012-3
double占用八個字節,數字大小為4.9E-324~1.7E+308, -4.9E-324~-1.7E+308 。
char占兩個字節,數字大小為0—216-1,是unicode編碼。字符的本來面目,我們為什么可以直接將一個數字賦給字符變量。
Boolean占一個字節,其取值只有兩個,true和false。
3.數組
概念:一組相同類型的數據的組合, 數組也是一種引用類型,名稱:數組名稱不是固定的,與存放的數據的類型有關。
數組中只能存一種類型的數據,
4.棧內存和堆內存的區別
棧:在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配,當在一段代碼塊定義一個變量時,Java 就在棧中為這個變量分配內存空間,當超過變量的作用域后,Java 會自動釋放掉為該變量分配的內存空間,該內存空間可以立即被另作它
堆:堆內存用來存放由 new 創建的對象和數組,在堆中分配的內存,由 Java 虛擬機的自動垃圾回收器來管理。在堆中產生了一個數組或者對象之后,還可以在棧中定義一個特殊的變量,讓棧中的這個變量的取值等于數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量,以后就可以在程序中使用棧中的引用變量來訪問堆中的數組或者對象,引用變量就相當于是為數組或者對象起的一個名稱。
5.理解面向對象的概念
面向過程:
在一個結構體中定義窗口的大小,位置,顏色,背景等屬性,對窗口換作的函數與窗口本身的定義沒有任何關系,如
HideWindow,MoveWindow,MinmizeWindow,這些函數都需要接受一個代表要被操作窗口參數,是一種謂語與賓語的關系
面向對象:
定義窗口時,chul要指定在面向過程中規定哪些屬性,如大小,位置,顏色,背景等外,還要指定窗口可能具有的動作,如隱藏,移動,最小化等,這些函數被調用時候、,都是一某個窗口隱藏,某個窗口要移動的語法格式來使用,都是以某個窗口隱藏,某個窗口要移動的語法來使用的,這是一種
主語與謂語的關系
6.面向對象的三大特征:封裝,繼承,多態
7.重寫與重載:重寫表示子類重寫父類的方法;重載表示有多個同名函數同時存在,區別在于有不同的參數個數或類型
8.垃圾回收過程分析
回收算法有以下四種:
分代收集算法:是當前商業虛擬機都采用的一種算法,根據對象存活周期的不同,將Java堆劃分為新生代和老年代,并根據各個年代的特點采用最適當的收集算法。
新生代:大批對象死去,只有少量存活。使用『復制算法』,只需復制少量存活對象即可。
復制算法:把可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用盡后,把還存活著的對象『復制』到另外一塊上面,再將這一塊內存空間一次清理掉。
老年代:對象存活率高。使用『標記—清理算法』或者『標記—整理算法』,只需標記較少的回收對象即可。
標記-清除算法:首先『標記』出所有需要回收的對象,然后統一『清除』所有被標記的對象。
標記-整理算法:首先『標記』出所有需要回收的對象,然后進行『整理』,使得存活的對象都向一端移動,最后直接清理掉端邊界以外的內存。
9.靜態變量 類型說明符是static。
靜態變量屬于靜態存儲方式,其存儲空間為內存中的靜態數據區(在靜態存儲區內分配存儲單元),
該區域中的數據在整個程序的運行期間一直占用這些存儲空間(在程序整個運行期間都不釋放),
也可以認為是其內存地址不變,直到整個程序運行結束(相反,而auto自動變量,即動態局部變量,屬于動態存儲類別,占動態存儲空間,函數調用結束后即釋放)。靜態變量雖在程序的整個執行過程中始終存在,但是在它作用域之外不能使用。
10.靜態方法:
1:用static修飾一個變量是靜態變量
2:靜態變量,直接使用類名,靜態變量名賦值
3:靜態變量在內存中只有一份
4:靜態的方法就是不需要將類實例化就可以直接使用類名調用到方法或者屬性。
一:如果兩個方法都是普通方法,那么可以直接用方法名調用
二:如果兩個方法都是靜態方法, 那么可以直接用方法名調用
三:如果在靜態方法中調用非靜態方法,那么需要先創建對象,再通過對象名.方法名()
因此,需先創建對象,其次是對象名.方法名()
四:在非靜態方法中,可以使用靜態方法和靜態變量
11.單態設計模式:
所謂類的單態設計模式,就是采取一定的方法保證在整個的軟件系統中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法。
如果要讓類在一個虛擬機中只能產生一個對象,首先必須將類的構造方法的訪問權限設置為private,這樣就不能用new操作符在類的外部產生類的對象了,但在類內部仍可以產生該類的對
12.內部類:
內部類就是定義在另外一個類里面的類。它隱藏在外部類中,封裝性更強,不允許除外部類外的其他類訪問它;
但它可直接訪問外部類的成員。靜態內部類和非靜態內部類的區別有:
靜態內部類是指被聲明為static的內部類,可不依賴外部類實例化;而非靜態內部類需要通過生成外部類來間接生成。
靜態內部類只能訪問外部類的靜態成員變量和靜態方法,而非靜態內部類由于持有對外部類的引用,可以訪問外部類的所用
成員
13.一、包的作用
1 把功能相似或相關的類或接口組織在同一個包中,方便類的查找和使用。
2 如同文件夾一樣,包也采用了樹形目錄的存儲方式。同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當同時調用兩個不同包中相同類名的類時,應該加上包名加以區別。因此,包可以避免名字沖突。
3 包也限定了訪問權限,擁有包訪問權限的類才能訪問某個包中的類。
二、包的定義
在一個.java文件中可以一個public類和多個非public類,如果要將這些類組織在一個包當中,則在.java文件中除注釋以外的第一行使用關鍵字package即可實現。當需要調用此包中的類時,就可以使用關鍵字import進行導入。在定義包的時候,應該注意幾點:
1 為了盡量使包名保持唯一性,包名通常采用小寫、按倒寫互聯網址的形式進行定義。
2 在進行命名包時,應該避免使用與系統發生沖突的名字。
14.后臺線程:默認創建的都是前臺線程,對java程序來說,只要還有一個前臺線程在運行,這個進程就不會結束,如果一個進程中只有后臺線程運行,這個進程就會結束。如果我們對某個線程對象在啟動(調用start方法)之前調用了setDaemon(true)方法,這個線程就變成了后臺線程。
聯合線程:java中還可以將多個線程聯合成一個線程,但這里又比單線程靈活的多。比如,可以在某個條件下聯合,也可以聯合多久后再分開。聯合使用的語法是Thread類中的join()方法,將join()線程(線程1)加入到調用join()的線程(線程2)中,合成的新線程中,先執行線程1,然后再執行線程2。
線程的同步:其實,最主要在于那把鎖,同一把鎖。
15.線程間的通信:
wait:告訴我們當前線程放棄監視器并進入睡眠狀態直到其他線程進入同一監視器并調用notify為止
notify()¬ifyAll(): 喚醒一個(所有)正處于等待狀態的線程
16.
API(Application Programming Interface,應用程序編程接口)是一些預先定義的函數,目的是提供應用程序與開發人員基于某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內部工作機制的細節。
(1) Windows API:
API函數包含在Windows系統目錄下的動態連接庫文件中。Windows API是一套用來控制Windows的各個部件的外觀和行為的預先定義的Windows函數。
(2)linux API:
在linux中,用戶編程接口API遵循了UNIX中最流行的應用編程界面標準—POSIX標準。
17.String, StringBuffer和StringBuilder區別
String:不可變字符串;頻繁操作時,每次都需新開辟內存,極易造成內存浪費
StringBuffer:可變字符串、效率低、線程安全;執行速度慢
StringBuilder:可變字符串、效率高、線程不安全;執行速度快
(1)如果要操作少量的數據用 String;
(2)多線程操作字符串緩沖區下操作大量數據 StringBuffer;
(3)單線程操作字符串緩沖區下操作大量數據 StringBuilder(推薦使用)。
StringBuffer和StringBuilder類的對象能夠被多次的修改,并且不產生新的未使用對象。
StringBuilder類在Java5中被提出,它和StringBuffer之間的最大不同在于StringBuilder的方法不是線程安全的(不能同步訪問)。
由于StringBuilder相較于StringBuffer有速度優勢,所以多數情況下建議使用StringBuilder類。
然而在應用程序要求線程安全的情況下,則必須使用StringBuffer類。
18.
java 基本數據類型對象包裝類
byte Byte
short Short
int Integer
long Long
boolean Boolean
char Character
float Float
double Double
19.集合類:
Java中的集合類可以分為兩大類:一類是實現Collection接口;另一類是實現Map接口。
20.HashTable類不緊可以像Vector類一樣動態的存儲一系列的對象,而且對存儲的每一個對象(稱為值)都安排另一個對象(稱為關鍵字)與它相關聯。
21.Properties類:
Properties類是Hashtable的子類
增加了將Hashtable對象中的關鍵字和值保存到文件和從文件中讀取關鍵字和值到Hastable對象中的方法
22.System與Runtime類:
(1)System:System類提供了代表標準輸入、標準輸出和錯誤輸出的類變量,并提供一些靜態方法用于訪問環境變量、系統屬性的方法,還提供了加載文件和動態鏈接庫的方法。
(2)Runtime類代表Java程序的運行時環境,每個Java程序都有一個與之對應的Runtime實例,應用程序通過該對象與其運行時環境相連。應用程序不能創建自己的Runtime實例,但可以通過getRuntime()方法獲取與之關聯的Runtime對象。
一:IO/輸入與輸出
File類:
對java來說,File表示的是文件的路徑,路徑指向的文件可能是存在的,也可以是不存在的。
可以是相對路徑,也可以是絕對路徑。File的本質,我們可以看成是一串字符串。指向了一個文件。
File類有一個FileSystem成員變量,在進行大部分操作時,他都會用fileSystem對象解釋這個路徑。
File對象的3種類型:
普通類型:
"ok.txt"這個文件名,表示文件是在當前上下文路徑的“ok.txt”,fileSystem會認為file指向的文件是處于當前上下文路徑下的。因此對fileSystem來說,new File(“ok.txt”)就是指向 “上下文路徑/ok.txt”的文件。
斜杠開頭的類型:
“/ok.txt”表示在最外層根目錄(我的是D盤)下的ok.txt。fileSystem會認為file指向的文件是處于跟目錄下的。因此對fileSystem來說,new File("/ok.txt")就是指向 “C:/ok.txt”的文件,在解釋真實位置時,不會給file路徑加上上下文路徑的全部,而只是加上上下文路徑所在的盤符。
盤符開頭的類型:
盤符開頭的路徑,是一個絕對路徑,因此“D:/ok.txt”則是一個絕對路徑,fileSystem會認為file就是絕對路徑,在執行操作之前,不會再解釋。他跟斜杠開頭的區別是:斜杠開頭會在解釋時給file路徑加上盤符,而盤符開頭的類型則不會加。
二:RandomAccessFile類
RandomAccessFile類提供了眾多的文件訪問方法
RandomAccessFile類支持“隨機訪問”方式
RandomAccessFile類在隨機(相對順序而言)讀寫等長記錄格式的文件時有很大的優勢
RandomAccessFile類僅限于操作文件,不能訪問其他的IO設備,網絡,內存映像等
兩種構造方法:
new RandomAccessFile(f,“rw”);//讀寫方式
new RandomAccessFile(f,“r”);//只讀方式
三:理解流的感念
流是字節序列的抽象概念
文件是數據的靜態存儲形式,而流是指數據傳輸時的形態
流類分為兩個大類:節點流和過濾流類(也叫處理流類)
四:InputStream類:
InputStream這個抽象類是所有基于字節的輸入流的超類,抽象了Java的字節輸入模型。
InputStream類的方法:
int read()
二進制形式為11111111的數據,以byte類型表示為-1,以int類型表示255
int read(byte b)
int read(byte[] b,int off,int len)
long skip(long n)
int available()
void mark(int readlimit)
void reset()
boolean markSupported()
void close()
五:OutputStream類:
OutputStream類是抽象類,不能直接生成對象,它是所有字節輸出流類的父類。該類提供了輸出處理的基本方法,它的子類一般都重寫這些方法。
OutputStream類的方法:
void write(int b)
void write(byte [] b)
void write(byte [] b,int off, int len)
void flush()
void close()
六:PipedInputStream與PipedOutputStream類
PipedInputStream與PipedOutputStream類用于在應用程序中的創建管道通信。管道通信即發送進程以字符流形式將大量數據送入管道,接收進程可從管道接收數據,二者利用管道進行通信。
·使用PipedInputStream與PipedOutputStream類編寫兩個線程間進行通信的程序。
·PipedWriter和PipedReader類
·使用管道流類,可以實現各個程序模塊之間的松耦合通信。這樣可以將多個模塊的輸入流和輸出流相連,拼裝成滿足需要的應用程序,而不需要修改模塊內部代碼。
七:ByteArrayInputStream與ByteArrayOutputStream類
ByteArrayInputStream 與 ByteArrayOutputStream,
用于以IO流的方式來完成對字節數組內容的讀寫,
來支持類似內存虛擬文件或內存映像文件的功能。
ByteArrayInputStream的兩個構造函數:
ByteArrayStream(byte【】buf)
ByteArrayStream(byte【】buf,int offset,int length)
ByteArrayOutputStream的兩個構造函數
ByteArrayOutStream()
ByteArrayOutputStream(int)
八:字符編碼:
首先,說下編碼和解碼:計算機中儲存的信息都是用二進制數表示的;而我們在屏幕上看到的英文、漢字等字符是二進制數轉換之后的結果。通俗的說,按照何種規則將字符存儲在計算機中,如’a’用什么表示,稱為”編碼”;反之,將存儲在計算機中的二進制數解析顯示出來,稱為”解碼”。在解碼過程中,若使用了同編碼方式不同的編碼規則餓,則可能導致解析錯誤或者亂碼。
其次理解字符集和字符編碼:
字符集:是一個系統支持的所有抽象字符的集合。字符是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。一般來說,不同的字符集有不同的對應字符編碼規則,因此也常會看到有人說:字符集就規定了某個文字對應的二進制數字存放方式(編碼)和某串二進制數值代表了哪個文字(解碼)的轉換關系。
字符編碼:是一套法則,在符號集合(人們表達信息的方式)與數字系統(計算機存儲和處理信息的方式)之間建立對應關系,也就是說字符編碼就是將字符轉換為計算機可以接受用0、1表達的數。
九:過濾流與包裝類:
1、過濾流:使用節點流作為輸入或輸出。過濾流是使用一個已經存在的輸入流或輸出流連接創建的。?
2、包裝類:所謂包裝類,就是可以直接將簡單類型的變量表示為一個類,在執行變量類型的相互轉換時,我們會大量使用這些包裝類。Java共有六個包裝類,分別是Boolean、Character、Integer、Long、Float和Double,從字面上我們就可以看出它們分別對應于?boolean、char、int、long、float和double。而String和Date本身就是類。所以也就不存在什么包裝類的概念了。
3、BufferedInputStream和BufferedOutputStream,過濾流,需要使用已經存在的節點流來構造,提供帶緩沖的讀寫,提高了讀寫的效率。
a)?緩沖流為IO流增加了內存緩沖區,增加緩沖區有兩個基本目的:
i.?允許Java程序一次不止操作一個字節,提高了程序的性能
ii.?由于有了緩沖區,使得在流上執行skip,mark和reset方法都成為可能
b)?BufferedInputStream與BufferedOutputStream是Java提供的兩個緩沖區包裝類,不管底層系統是否使用了緩沖區,這兩個類在自己的實例對象中創建緩沖區。
?
4、DataInputStream和DataOutputStream,過濾流,需要使用已經存在的節點流來構造,提供了讀寫Java中的基本數據類型的功能。
a)?public?final?void?writeBytes(String?s)//將每個字節寫入目標設備中
b)?public?final?void?writeChars(String?s)//將每個字符寫入到目標設
c)?public?final?void?writeUTF(String?str)//將字符串按照UTF的編碼寫入到目標設備,目標設備帶有長度頭
5、?PrintStream類
???PrintStream類提供了一系列的print和println方法,可以將基本數據類型的數據格式化成字符串輸出,對于非基本數據類型先用調用對象的toString()然后打印出來。
6、ObjectInputStream與ObjectOutputStream類
???ObjectInputStream與ObjectOutputStream這兩個包裝類,用于從底層輸入流中讀取對象類型的數據和將對象類型的數據寫入到底層輸出流。
???這兩個類所讀寫的對象必須實現了Serializable接口。對象中的translent和static類型的成員變量不會被讀取和寫入。
7、字節流與字符流的轉換:InputStreamReader和OutputStreamWriter類
???InputStreamReader和OutputStreamWriter是用于將字節流轉換成字符流來讀寫的兩個類。InputStreamReader可以將一個字節流中的字節解碼成字符后讀取,OutputStreamWriter將字符編碼成字節后寫入到一個字節流中。
8、BufferedReader和BufferedWriter類
BufferedReader的readLine方法可以一次讀取一行文本,BufferedWriter的newLine方法可以同字符流中寫入不同操作系統下的換行符
十:java程序與其它進程的數據通信
在java程序中可以用Proess類的實現對象來表示子進程,子進程的標準輸入和輸出不再連接鍵盤和顯示器,而是以管道流的形式連接到父進程的一個
輸出流和輸入流對象上。
調用Proess類的getoutStream和getInputStream方法可以獲得連接到子進程的輸出流和輸入流對象。
編程實例:在TestOut類啟動java.exe命令執行另一個MyTest類,TestInOut和MyTest通過進程間的管道相互傳遞數據。
驗證管道緩沖區滿后,將發生下面的那種情況:
(1)新的數據寫入時,將最前面寫入的數據擠出去,從而發生數據丟失。
(2)與PipedInputStream相連的PipedOutStream無法再寫入新的數據,
PipedOutStream.write方法處于阻塞狀態。
(3)與PipedInputStream相連的PipedOutStram無法再寫入新的數據,PipedOutStream.write方法拋出異常
Java 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。