当年我们一起追过的Java,Java SE 个人笔记
目錄
JDK的安裝和配置運行Java程序
java基本語法
面向對象
異常
多線程l
API(Application Programming Interface)各種功能的類說明
集合類
?IO輸入輸出
GUI圖形用戶界面
網絡編程
Java SE基礎筆記
java是一門面向對象的高級程序設計語言,拋棄指針,運算符重載等C++特性而使用引用來開發的一門語言。本文從個人學習角度需求進行記錄,不涉及具體實現代碼,只做基本內容使用的說明。同時部分以C語言作為參考與對比
?
JDK的安裝和配置運行Java程序
JDK目錄:
bin目錄:放置一些可執行的程序如javac.exe,java.exe,jar.exe,javadoc.exe等
db目錄:小型的數據庫,純java實現
jre目錄:Java Runtime Enviroment(Java運行環境)
include目錄:C/C++庫
src.zip放置JDK核心類的源代碼
java運行操作
javac.exe是java編譯器工具,可以將java文件編寫成java字節碼文件,源文件擴展名為.java,編譯后為.class
java.exe是java運行工具,它會啟動一個JVM進程,一個虛擬的運行系統
編譯java文件? ? javac xx.java? ? ?運行java文件? ? ? ?java? xx
不使用任何IDE編譯,通過安裝的JDK進行編譯:
打開CMD命令窗口,然后通過cd命令進入安裝路徑,使用javac命令編譯,使用java命令運行
JDK配置
我的電腦-->屬性-->系統屬性-->編輯-->編輯系統變量進行編輯
path直接添加安裝路徑\bin,classpath需要創建然后使用安裝路徑\bin? path調用的是java工具,classpath是查找類
jar-vcf打包類 ?? java-jar解壓類
?
?
java基本語法
java分為結構定義語句和功能執行語句,必須使用分號
java區分大小寫,且是行內執行,不能跨行
注釋為????????? // 單行注釋 ? ? ? ? ? ? ? ? /*??????? */多行注釋 ??????????? 以及文檔注釋/**?????????? */
文檔注釋可以添加一些文檔說明,如個人或者公司等
javadoc -d . -version -author Person.java
幫助文檔可以在網上下一個CHM格式的文檔,或者使用eclipse,在里面配置一個jdk.zip文檔。
?
java書寫規范
1.包名所有字母一律小寫
2.類名和接口名每個單詞的首字母都要大寫
3.常量名所有字母都大寫,單詞之間用下劃線連接
4.變量名和方法名的第一個單詞首字母小寫,從第二個單詞開始每個單詞首字母大寫
| abstract | boolean | break | byte | case | catch | char | const | class | continue |
| default | do | double | else | extends | final | finally | float | for | goto |
| if | implements | import | instanceof | int | interface | long | native | new | package |
| private | protected | public | return | short | static | strictfp | super | switch | this |
| throw | throws | transient | try | void | volatile | while | synchronized | ? | ? |
Java中的常量1.整型常量??????? 2.浮點數常量?????? 3.字符常量?????? 4.字符串常量??????? 5.布爾常量??????? 6.null常量???????
變量的類型
| 數據類型 | ||||||||
| 基本數據類型 | 引用數據類型 | |||||||
| 數值型 | 字符型(char) | 布爾型(boolean) | 類(class) | 接口(interface) | 數組 | 枚舉(enum) | 注解(annotation) | |
數值型可分為1.整數類型???????????????? byte(1b)??????? short(2b)??????? int(4b)??????? long(8b)? 一般為int,特定需要時添加后綴
? ? ? ? ? ? ? ? ? ? ? 2.浮點類型??????????????? float(4b)??????? double(8b)? ? ?? 一般為double,需要特定指出float時添加f ?
| 邏輯運算符 | ||
| & | 與 | 兩值皆為真則真,兩值運算皆執行 |
| | | 或 | 一值為真則真,兩值皆運算 |
| ^ | 異或 | 一真一假為真,兩真或兩假為假 |
| ! | 非 | 取反 |
| && | 短路與 | 和與一樣,但前一值為假即不執行后一值運算 |
| || | 短路或 | 前值為真則再不運算 |
| 位運算符 | ||
| & | 按位與 | 兩值為1則1,否則為0 |
| | | 按位或 | 一值為1則1,否則為0 |
| ^ | 按位異或 | 只有一值為真時才真,否則為假 |
| ~ | 取反 | 一位取反 |
| << | 左移 | 數值加上左移位數 |
| >> | 右移 | 根據符號位補0或1 |
算術運算符++/--在變量前為這先執行自增后執行其它運算,在變量之后為先以當前值進行運算,行內代碼執行完成后進行自增
賦值運算符+=/-=等二元簡寫運算符形式如:a+=b--->a=a+b? ??
語句:
if(??????? ){?????? }??????? else if(??????? ){??????? }??????? else{??????? }
switch(??????? ) {case:??????? }
while(??? true ?? ){??????? }?????????????????????????????????????????????? do{??????? }while(? true ???? )
for(? ;? ;){???? }
break??????? continue
方法重載為方法名相同,參數個數或者類型不同
數組int[] arr=new int[];
?
面向對象
面向對象的特性1.封裝性??????? 2.繼承性??????? 3.多態性
?
類是對象的抽象,可以定義成員變量即屬性,成員行為即方法
類名 對象名稱 =new 類名() new開啟引用地址 ,類名后的括號用于構造方法的創建,每一個類均有一個或多個構造方法
對象.對象成員???????????????????????????? 訪問對象的屬性或者方法
類的封裝——使用private私有屬性,除所在類外不能訪問,但可通過公有的方法訪問私有屬性的值,起到對私有屬性的保護
構造方法:1.方法名和類名相同?????? 2.在方法名前面沒有返回值類型的聲明??????? 3.方法不帶有返回值?????? 實例化對象時自動調用構造方法
this關鍵字用于訪問該對象的成員
this()調用構造方法,只能在構造方法里面調用其他構造方法,必須位于構造方法的第一行,并且不能兩個構造方法互相調用。構造方法相當于一個static靜態方法,在創建對象時自動創建,并且與super調用父類相沖突,只能選擇其中一個
?
java自動垃圾回收,但也可以通過System.gc()通知虛擬機進行垃圾回收??? 當對象在內存中被釋放時,其finalize()方法會被自動執行
static靜態
靜態變量:static創建的數據為各個類的實例所共享,通過類名.變量名訪問??? 即屬于類的范圍,類引用時創建(按需要調用)
靜態方法:static方法,通過類名.方法名調用,靜態的成員均不需要創建對象就能直接調用(按需要調用)
靜態代碼塊:當類被加載時,靜態代碼塊會執行,由于類只加載一次,因此代碼塊就執行一次
?
單例模式
class Single{private static Single INSTANCE=new Single(); //私有靜態實例,由于是靜態,類加載時創建且唯一private Single(); //私有構造方法,不能通過new創建新對象public static Single getInstance(){ //公有靜態方法,引用類。方法調用方法體 return INSTANCE;} }?
內部類——成員內部類,靜態內部類,方法內部類
成員內部類:成員內部類可以訪問外部類的所有成員,同樣,外部類成員通過創建內部類對象訪問內部類數據,在其他類中,需要創建外部類對象才能訪問內部類。內部類就是一個類里面還包含一個新創建的類。
class Outclass{ //外部類class Inner{ //內部類} }由于編譯時內部類需要創建外部類然后生成關聯文件到內部類上,因此要訪問內部類的形式如下:
外部類名.內部類名? ? ? 變量名=new 外部類名().內部類名()? ? ? ??
靜態內部類
class Outclass{ //外部類static class Inner{ //靜態內部類} }外部類名.內部類名? ? ? ?變量名=new? 外部類名.內部類名();
內部類與靜態內部類的差別,首先需要說明類和對象的差別:類是對象的抽象,因此創建對象需要調用關于該類的構造方法,但注冊在該類的靜態成員會隨著類的引用而生成,不需要創建對象。靜態成員只能訪問靜態成員。靜態內部類只能定義靜態成員,非靜態內部類不能定義靜態成員。這涉及到一個類的生成、對象生成、靜態成員創建的順序。
方法內部類:在成員方法中定義的類,只能在方法中被調用
class outer{public void test(){class Inner{}} }方法內部類可以調用外部類的成員變量,調用方法內部類需要通過外部類創建對象調用該方法,然后在方法中調用內部類。? ? ? ?
?
繼承
子類會自動擁有父類所有可繼承的屬性和方法,使用extends關鍵字繼承父類
子類重寫父類方法時,不能使用比父類中被重寫的方法更嚴格的訪問權限
當子類重寫父類的方法時,子類不能直接訪問父類的方法,需要通過super.方法名()訪問父類中的方法
子類實例化時會默認調用父類的無參構造方法,也可以通過super(實參)指定調用父類中的其余構造方法。當父類不存在無參構造方法時,當心子類自動調用父類構造方法。因此創建類時定義一個無參的構造方法會減少被繼承時的錯誤。
所有類都繼承Object。
final關鍵字——可用于修飾類、變量、和方法
- final修飾的類不能被繼承
- final修飾的方法不能被子類重寫
- final修飾的變量是常量(成員變量和局部變量),只能賦值一次
- final修飾的成員變量不會對其初始化,因此在定義時需要初始化變量
?
抽象類和接口
abstract void 方法名();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //定義抽象方法
當定義抽象方法時該類必須是抽象類,但定義抽象類可以不是抽象方法,抽象類不可以被實例化,因為抽線類可能含有抽線方法,抽線方法沒有實體,不可以被調用
接口是所有方法都是抽象的,定義接口使用的關鍵字是interface,需要區分方法和變量的定義,方法是抽象的,變量是實體的,接口默認為public abstract 而接口變量為 public static final全局常量
一個普通類(非抽象或者接口類型)實現或者繼承抽象類或者接口時需要實現所有抽象方法
普通類,所有方法皆實體? ? ? ? ?抽象類,方法可以是實體或者抽象? ? ? ? ? ?接口,所有方法皆抽象
class普通類所有方法都有實體 abstract? class抽象類可以有抽象方法 interface接口沒有實體方法
因此 某類extends繼承無論是類還是interface接口,會繼承所有可使用方法,并且可通過super調用繼承的類或接口成員(不包括未實現的方法),但implement實現接口需要實現所有的方法,但抽象類因為可以擁有抽象方法,可以不實現接口的所有方法。抽象類和普通類的區別是抽象類可以有抽象方法,并且不能被實例化,即不能使用new一個對象,同樣,抽象類一樣可以繼承類或者接口
多態
允許使用一個父類類型的變量來引用子類類型的對象
interface Interface{void method(); //接口抽象方法 } class First implements Interface{public void method(){ //實體方法1……} } class Second implements Interface{public void method(){ //實體方法2…………} } class Test{public static void main(String[] args){Interface fir=new First(); //實例化方法1對象,使用Interface類型變量fir引用Interface sed=new Second(); //實例化方法2對象,使用Interface類型變量sed引用methods(fir); //輸出方法1實體method(sec); //輸出方法2實體}public static void methods(Interface an){ an.method() //調用方法}}實例化不同類型的對象雖然都是同一個類型引用,但不能互相訪問
判斷一個對象是否為某個類的實例或者子類實例 對象 instanceof 類或接口
?
匿名內部類
方法調用時,參數為新創建的實例,并將該類寫入
Otherclass.method(new Innerclass( ){? ?類的代碼塊?});因此不需要創建對象名,但重復調用時困難。
?
?
?
異常
圖表不全,只能表示大概的異常類,可參考API
主要以RuntimeException
| 方法聲明 | 功能描述 |
| String getMessage() | 返回此throwable的詳細信息字符串 |
| void printStackTrace() | 將次throwable及其追蹤輸出到標準錯誤流 |
| void printStackTrace(PrintStream s) | 將此throwable及其追蹤輸出到指定的輸出流 |
try{ 需要執行的代碼塊?}catch{ 異常捕獲,Exception類及其子類? }finally{? ?是否異常都要執行? }? ? ? ? ? ?
throws——方法中扔出的Exception類? ? throw——具體步驟扔出異常對象? ?
要么在運行時try catch解決異常,要么使用throws將異常拋出給操作? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
包是專門用來存放類的,關鍵字package,導入包為import
private——只能被該類的成員訪問,其他類無法直接訪問
defoult——默認,該類或者類的成員只能被本包訪問
protected——同一個包可以訪問,不同包中該類的子類訪問
public——不受限制
?
多線程
線程與進程的區別;進程,一個程序開始執行到結束運行叫進程為其分配內存等資源,線程是對于CPU而言,每次執行一個進程然后切換到另一個進程,由于太快所以感覺是同步進行。
線程的創建一個是繼承Thread類,然后覆寫run()方法。另一種是實現Runnable接口,重寫run()方法,然后創建一個Thread類并在構造方法Thread(Runnable Target)傳入一個Runnable接口引用。
Runnable接口,只有一個run()方法。可創建一個實現對象,然后開啟多個線程調用同一個實例對象實現多線程操作。
Thread.currentThread()方法得到當前的線程的實例對象,getName()可以過得線程的名稱,構造方法Thread(對象,名稱)為線程命名。
新創建的線程默認都是前臺線程,某個線程啟動之前(.start)調用了setDaemon(true)方法開啟后臺線程。
?
線程分為5個周期,除新建狀態和死亡狀態是單向外,其余3個就緒狀態,阻塞狀態,運行狀態都可以互相轉換
1.新建狀態(New):創建一個線程對象后,該線程對象就處于新建狀態,此時它不能運行,和其他Java對象一樣,僅僅由Java虛擬機為其分配了內存,沒有表現出任何線程的動態特性
2.就緒狀態(Runnable):當線程對象調用了start()方法后,該線程就進入就緒狀態(也稱可運行狀態)。處于就緒狀態的線程位于可運行池中,此時它只是具備了運行的條件,能否獲得CPU的使用權開始運行,還需要等待系統的調度。
3.運行狀態(Running):如果處于就緒狀態的線程獲得了CPU的使用權,開始執行run()方法中的線程執行體,則該線程處于運行狀態。當一個線程啟動后,它不可能一直處于運行狀態(除非它的線程執行體足夠短,瞬間就結束了),當使用系統分配的時間后,系統就會剝奪線程占用的CPU資源,讓其他線程獲得執行的機會。需要注意的是,只有處于就緒狀態的線程才能轉換到運行狀態。
4.阻塞狀態(Blocked):一個正在執行的線程在某些特殊情況下,如執行耗時的輸入/輸出操作時,會放棄CPU的使用權,進入阻塞狀態。線程進入阻塞狀態后,就不能進入排隊隊列。只有當引起阻塞的原因被清除后,線程才可以轉入就緒狀態。
- 當線程試圖獲得某個對象的同步鎖時,如果該鎖被其他線程所持有,則當前線程會進入阻塞狀態,如果想從阻塞狀態進入就緒狀態必須得獲得其他線程所持有的鎖
- 當線程調用一個阻塞的IO方法時,該線程就會進入阻塞狀態,如果想進入就緒狀態就必須等這個阻塞的IO方法返回
- 當線程調用了某個對象的wait()方法時,會使線程進入阻塞狀態,如果想進入就緒狀態就需要使用notify()方法喚醒該線程
- 當線程調用了Thread的sleep(long millis)方法時,也會使線程進入阻塞狀態,在這種情況下,只需等到線程睡眠的時間到了以后,線程就會自動進入就緒狀態
- 當在一個線程中調用了另一個線程的join()方法時,會使當前線程進入阻塞狀態,在這種情況下,需要等到新加入的線程運行結束后才會結束阻塞狀態,進入就緒狀態
5.死亡狀態(Terminated):線程的run()方法正常執行完畢或者賢臣拋出一個未捕獲的異常/錯誤,線程就進入死亡狀態。一旦進入死亡狀態,線程就不再擁有運行的資格,也不能再轉換到其他狀態。
CPU調度分為分時模式,搶占模式,Java默認使用的是搶占模式。
static int MAX_PRIORITY 表示線程的最高優先級
static int MIN_PRIORITY? 表示線程的最低優先級
static int NORM_PRIORITY biaoshi 表示線程的普通優先級
線程有限級?對象.?setPriority(int newPriority)方法設置??
線程休眠 對象.sleep(time),進入阻塞狀態,會拋出異常,需要捕獲異常 休眠需要注意同步問題。
線程讓步,回到就緒狀態,只有與當前線程優先級相同或者更高才能獲得運行yield()對象.yield()
線程插隊 join()對象.join()
synchronized(lock)鎖對象,當鎖為1時執行,執行期間將為0,其他線程遇到鎖為0時進入阻塞
可使用同步代碼塊或者同步方法 synchronized(lock){代碼塊} ;需要注意同步對象創建不能放在run()方法中? ?
synchronized 返回值類型 方法名 (){? ? ? ? }? ? ?注意死鎖
同步代碼塊鎖為自己創建的對象,同步方法為當前調用的對象,靜態方法為該對象的類名.class獲得
void notify()——喚醒此同步鎖上等待的第一個調用wait()方法的線程
void notifyAll()——喚醒此同步鎖上調用wait()方法的所有線程
void wait()——使當前線程放棄同步鎖并進入等待,直到其他線程進入此同步鎖,并調用notify()方法,或notifyAll()方法喚醒該線程為止
?
API(Application Programming Interface)各種功能的類說明
String
構造方法String()創建一個空的字符串 ????? String(char[] value) 根據字符數組創建對象 ????? String(String value)根據字符串內容創建對象
| int index(int ch) | 返回指定字符在此字符串中第一次出現處的索引 |
| int lastIndexOf(int ch) | 返回指定字符串在此字符串中最后一次出現處的索引 ? |
| char charAt(int index) | 返回字符串中index位置上的字符,其中index的取值范圍是:0~(字符串長度-1) |
| boolean endsWith(String suffix) | 判斷此字符串是否以指定的字符串結尾 |
| int length() | 返回此字符串的長度 |
| boolean equals(Object anObject) | 將此字符串與指定的字符串比較 |
| boolean isEmpty() | 當且僅當字符串長度為0時返回true |
| boolean startsWith(String prefix) | 判斷此字符串是否以指定的字符串開始 |
| boolean contains(CharSequence cs) | 判斷此字符串是否包含指定的字符序列 |
| String toLowerCase() | 使用默認語言環境的規則將String中的所有字符都轉換為小寫 |
| String toUpperCase() | 使用默認語言環境的規則將String中的所有字符都轉換為大寫 |
| String valueOf() | 返回int參數的字符串形式 |
| char[] toCharArray() | 將此字符串轉換為一個字符數組 |
| String replace(CharSequence oldstr,CharSequemce newstr) | 返回一個新的字符串,它是通過用newstr替換此字符串中出現的所有oldstr得到的 |
| String[] split(String regex) | 根據參數regex將原來的字符串分割為若干個子字符串 |
| String substring(int beginIndex) | 返回一個新字符串,它包含字符串中索引beginIndex后的所有字符 |
| String substring(int beginIndex,int endIndex) | 返回一個新字符串,它包含字符串從中索引beginIndex到索引endIndex之間的所有字符 |
| String trim() | 返回一個新字符串,它去除了原字符串首尾的空格 |
StringBuffer(長度可變的String)
| 方法說明 | 功能描述 |
| StringBuffer append(char c) | 添加參數到StringBuffer對象中 |
| StringBuffer insert(int offset,String str) | 將字符串中的offset位置插入字符串str |
| StringBuffer deleteCharAt(int index) | 移除此序列指定位置的字符 |
| StringBuffer delete(int start,int end) | 刪除StringBuffer對象中指定范圍的字符串序列 |
| StringBuffer replace(int start,int end,String s) | 在StringBuffer對象中替換指定的字符或字符串序列 |
| void setCharAt(int index,char ch) | 修改指定位置index處的字符序列 |
| String toString() | 返回StringBuffer緩沖區中的字符串 |
| StringBuffer reverse() | 將此字符序列用其反轉形式取代 |
System
| 方法說明 | 功能說明 |
| static? void exit(int status) | 該方法用于終止當前正在運行的Java虛擬機,其中參數status表示狀態碼,若狀態碼非0,則表示異常終止 |
| static long gc() | 運行垃圾回收器,并對垃圾進行回收 |
| static long currentTimeMillis() | 返回以毫秒為單位的當前時間 |
| static void arraycopy(object src,int srcPos,Object dest, int destPos,int length) | 從src引用的指定源數組復制到dest引用的數組,復制從指定的位置開始,到目標數組的指定位置結束 |
| static Properties getProperties() | 取得當前的系統屬性 |
| static String getProperty(String key) | 獲得指定鍵描述的系統屬性 |
Runtime類
Runtime run=Runtime.getRuntime()??? 對象方法提供availableProcessors freeMemory maxMemory exec等方法,以調用計算機信息
Math類和Random類
Math的靜態方法
- Math.abs()??????? //絕對值
- Math.ceil()??????? //大于參數的最小整數
- Math.floor()?????? //小于參數的最大整數
- Math.round()??? //四舍五入
- Math.max()????? //最大值
- Math.min()????? //最小值
- Math.random()?? // 隨機數,大于等于0小于1
Random
Random random=new Random()
對象方法用于返回指定類型的隨機數,構造方法傳入固定值則生成同樣的序列,不指定參數時每次生成不一樣的隨機數
- boolean nextBoolean() ——隨機生成Boolean類型的隨機數
- double nextDouble()——隨機生成double類型的隨機數
- float nextFloat()——隨機生成float類型的隨機數
- int nextInt()——隨機生成int類型的隨機數
- int nextInt(int n)——隨機生成0~n之間int類型的隨機數
- long nextLong()——隨機生成long類型的隨機數
包裝類
首先需要說明為什么會有包裝類,因為基本類型的和對象類型運行在內存的不同位置,相對來說,基本類型的調用相對頻繁,同樣是存放在內存上,但訪問和創建的方式不一樣,調用的方式也不一樣。但對象擁有基本類型沒有的方法,因此有時需要將基本類型包裝起來使用。
基本類型的包裝類
| byte | Byte | long | Long | char | Character | float | Float |
| int | Integer | double | Double | short | Short | boolean | Boolean |
裝箱是將基本類型轉換為對象的形式,拆箱是將對象類型轉換為基本類型
類 引用變量=new 類(基本類型)
Integer類型的一些方法
| toBinaryString(int i) | 以二進制無符號整數形式返回一個整數參數的字符串 |
| toHexString(int i) | 以十六進制無符號整數形式返回一個整數參數的字符串 |
| toOctalString(int i) | 以八進制無符號整數形式返回一個整數參數的字符串 |
| valueOf(int i) | 返回一個表示指定的int值的Integer實例 |
| valueOf(String s) | 返回保存指定的String值的Integer對象 |
| parseInt(String s) | (靜態方法)將字符串參數作為有符號的十進制整數進行解釋 |
| intValue() | 將Integer類型的值以int類型返回 |
其中,除Character類外都有靜態方法valueOf將字符串轉換為包裝類型,都有靜態方法parseXXX將字符串轉換為基本類型
Date
對象 只建議兩個構造方法,其余都過時,一個無參的構造方法返回當前時間對象,另一個帶有參數的構造方法創建指定時間的對象Date date = new Date()或Date data = new Date(long date)
Calendar
Calendar為一個抽象類,不能被實例化,通過靜態方法返回一個Calendar對象,準確說是返回一個繼承該類的對象,引用了多態的形式
| 方法聲明 | 功能描述 |
| int get(int field) | 返回指定日歷字段的值 |
| void add(int field,int amount) | 根據日歷規則,為指定的日歷字段增加或減去指定的時間量 |
| void set(int field,int value) | 為指定日歷字段設置指定值 |
| void set(int year,int month,int date) | 設置Calendar對象的年、月、日三個字段的值 |
| void set(int year,int month,int date,int hourOfDay,int minute,int second) | 設置Calendar對象的年、月、日、時、分、秒六個字段的值 |
Calendar calendar=Calendar.getInstance()返回一個實例對象,然后調用get方法并傳入參數:參數如下
Calendar.YEAR? ? ?Calendar.MONTH? ? Calendar.SECOND? ? Calendar.DATE? ? ?Calendar.Hour? ? Calendar.MINUTE
Calendar.setLenient模式 月份默認為0開始,因此得到月份需要添加1
?
DateFormat類
| 方法聲明 | 功能描述 |
| static DateFormat getInstance() | 用于創建默認語言環境和格式化風格的日期格式器 |
| static DateFormat getInstance(int style) | 用于創建默認語言環境和指定格式化風格的日期格式器 |
| static DateFormat getDateTimeInstance() | 用于創建默認語言環境和格式化風格的日期/時間格式器 |
| static DateFormat getDateTimeInstance(int dateStyle,int timeStyle) | 用于創建默認語言環境和指定格式化風格的日期/時間 |
| String format(Date date) | 將一個Date格式化為日期/時間字符串 |
| Date parse(String source) | 將給定字符串解釋成一個日期 |
?
集合類
單列集合Collection
- List:元素有序、元素可重復(ArrayList/LinkedList)
- Set:元素無序、不可重復(HashSet/TreeSet)
雙列集合Map
- HashMap
- TreeMap
Collection
Collection接口
方法聲明 功能描述 boolean add(Object o) 向集合中添加一個元素 boolean addAll(Collection c) 將指定Collection中的所有元素添加到該集合中 void clear() 刪除該集合中的所有元素 boolean removbe(Object o) 刪除該集合中指定的元素 boolean removeAll(Colection c) 刪除指定集合中的所有元素 boolean isEmpty() 判斷該集合是否為空 boolean contains(Object o) 判斷該集合中是否包含某個元素 boolean containsAll(Collection c) 判斷該集合中是否包含指定集合中的所有元素 Iterator iterator() 返回在集合的元素上進行迭代的迭代器,用于便利該集合所有元素
int size()
獲得該集合元素個數
list接口,元素允許重復,有序,存入和取出順序一致
| 方法聲明 | 功能描述 |
| void add(int index,Object element) | 將元素element插入在List集合的index處 |
| boolean addAll(int index,Collection c) | 將集合c所包含的所有元素插入到List集合的index處 |
| Object get(int index) | 返回集合索引index處的元素 |
| Object remove(int index) | 刪除index索引處的元素 |
| Object set(int index,Object element) | 將索引index處元素替換成element對象,并將替換后的元素返回 |
| int indexOf(Object o) | 返回對象o在List集合中出現的位置索引 |
| int lastIndexOf(Object o) | 返回對象o在List集合中最后出現的位置索引 |
| List subList(int fromIndex,int toIndex) | 返回從索引fromIndex(包括)到toIndex(不包括)處所有元素集合組成的子集合 |
ArrayList為List的一個實現類,可理解為長度可變的數組,查找方便,但增刪不方便
LinkedList是List的另一個實現類,雙向鏈表,增減方便
| 方法聲明 | 功能描述 |
| void add(int index,E element) | 在此列表中指定的位置插入指定的元素 |
| void addFirst(Object o) | 將指定元素插入此列表的開頭 |
| void addLast(Object o) | 將指定元素添加到此列表的結尾 |
| Object getFirst() | 返回此列表的第一個元素 |
| Object getLast() | 返回此列表的最后一個元素 |
| Object removeFirst() | 移除并返回此列表的第一個元素 |
| Object removeLast() | 移除并返回此列表的最后一個元素 |
Iterator接口用于遍歷列表元素,通過列表元素的 iterator()方法返回一個Iterator的引用對象,調用該對象的hasNext()方法判斷是否具有下一個元素,如果存在則調用next()方法輸出,修改元素需要使用迭代器自身的方法
ListInerator接口為Inerator的子類 listname.listIterator(起始位置)返回一個ListIterator對象
- void add(Object o)? ? ? ? ? ? ? ?將指定的元素插入列表(可選操作)
- boolean hasPrevious()? ? ? ? 如果以逆向遍歷列表,列表迭代器有多個元素,則返回true
- Object previous()? ? ? ? ? ? ? ? 返回列表中的前一個元素
- void remove()? ? ? ? ? ? ? ? ? ? ?從列表中移除由next或previous返回的最后一個元素(可選操作)
同樣for語句可遍歷列表,但不能修改其中的值
Set
- HashSet根據對象的哈希值進行存儲位置,良好的存取和查找性能,需要重寫hashCode方法和equals方法
- TreeSet二叉樹排序? ? 需要重寫compareTo方法確定排序方法
Vector線程安全
?
Map接口
| 方法聲明 | 功能描述 |
| void put(Object key,Object value) | 將指定的值與此映射中的指定鍵關聯(可選操作) |
| Object get(Object key) | 返回指定鍵所映射的值,如果此映射不包含該鍵的映射關系,則返回null |
| boolean containsKey(Object Key) | 如果此映射包含指定鍵的映射關系,則返回true |
| boolean containsValue(Object value) | 如果此映射將一個或多個鍵映射到指定值,則返回true |
| Set keySet() | 返回此映射中包含的鍵的Set視圖 |
| Collection<V> values() | 返回此映射中包含的值的Collection視圖 |
| Set<Map.Entry<K,V>> entrySet() | 返回此映射中包含的映射關系的Set視圖 |
HashMap,鍵值關系的列表,鍵相同時,以后值覆蓋前值達到元素的不重復,根據哈希值存儲位置
LinkedHashMap對應于LinkedList,屬于雙向列表
TreeMap二叉樹原理
Properties集合? ?線程安全 setProperty getProperty 用于創建一個配置文件。對象.setProperty()方法中添加鍵值對,getProperty用于獲取鍵/值序列表
?
Comparator接口 ? compare()方法 compareTo()方法
comparator接口對集合進行比較排序,重寫compare方法,該方法自動抓取序列種的兩個值,然后使用compareTo方法進行比較
class MyComparetor implements Comparator{public void compare(o1,o2){String t1=(String) o1;String t2=(String) o2;t1.compareTo(t2);泛型
對集合中存儲或者取出的元素進行限制,避免出現類型不匹配的錯誤
?
| 方法聲明 | 功能描述 |
| static <T> boolean addAll(Collection <? super T>c,T...elements) | 將所有指定元素添加到指定的collection中 |
| statci void reverse(List list) | 反轉指定List集合中元素的順序 |
| static void shuffle(List list) | 對List集合中的元素進行隨機排序(模擬玩撲克中的"洗牌") |
| static void short(List list) | 根據元素的自然順序對List集合中的元素進行排序 |
| static void swap(List list,int i,int j) | 將指定List集合中i處元素和j處元素進行交換 |
| static int binarySearch(List list,Object key) | 使用二分法搜索指定對象在List集合中的索引,查找的List集合中的元素就必須是有序的 |
| static Object max(Collection col) | 根據元素的順序,返回給定集合中的最大的元素 |
| static Object min(Collection col) | 根據元素的順序,返回給定集合中的最小的元素 |
| static booleanreplaceAll(List list,Object oldVal,Object newVal) | 用一個新的newVal元素替換List集合中所有的舊值oldVal |
Arrays類
static void sort()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 排序
static int binarySearch(Object[] a,Object key)? ? ? 查找指定元素的索引值,只能對排序的數組進行查找
static int[] copyOfRange(int[] original,int from,int to)? ? 用于將包括開始的元素,不包括結束的元素復制到新的數組中
static void fill(Object[] a,Object val)? ? ? ? ? ? ? ? ?用一個元素替換所有元素
static String toString(int[] arr)? ? ? ? ? ? ? ? ? ? ? ? ? ?把數組轉換為字符串
?
?IO輸入輸出
字節流? ? ? ? 兩個抽象子類----(二進制)InputStream(字節輸入流)? ? OutPutStream(字節輸出流)
字符流? ? ? ? Reader(字符輸出流)? ? Write字符輸出流
| 方法聲明 | 功能描述 |
| InputStream | |
| int read() | 從輸入流讀取一個8位的字節,把它轉換為0~255之間的整數,并返回這一整數 |
| int read(byte[]) | 從輸入流讀取若干字節,把他們保存到參數b指定的字節數組中,并返回的整數表示讀取字節數 |
| int read(byte[],int off,int len) | 從輸入流讀取若干字節,把它們保存到參數b指定的字節數組中,off指定字節數組開始保存數據的下標,len表示讀取的字節 |
| void close() | 關閉此輸入流并釋放與該流關聯的所有系統資源 |
| OutputStream | |
| void write(int b) | 向輸出流寫入一個字節 |
| void write(byte[] b) | 把參數b指定的字節數組的所有字節寫到輸出流 |
| void write(byte[] b,int off,int len) | 將指定byte數組從偏移量off開始的len個字節寫入輸出流 |
| void flush() | 刷新此輸出流并強制寫出所有緩沖的輸出字節 |
| void close() | 關閉此輸出流并釋放與此流相關的所有系統資源 |
文件操作FileInputStream("文件名")/FileOutputStream("文件名",boolean)
字節緩沖流BufferedInputStream(InputStream in[,size])/BufferedOutputStream
字符讀取FileRead/FileWrite
字符緩沖流BufferedReader/BufferedWrite? 重要方法BufferedReader的重要方法readLine(),newLine()
LineNumberReader它是BufferedReader的子類.通過setLineNumber和getLineNumber設置行號
InputStreamReader OutputStreamWriter 字節輸入轉字符? 字符輸出轉字節
ObjectInputStream和ObjectOutputStream對象輸入或輸出流,需要實現Serializable接口 保存對象參數
DateInputStream和DataOutputStream保存基本類型的類,參數為BufferedOutputStream更方便
PrintStream對象,打印基本類型或者是對象類型等,調用其print方法即可輸出
ByteArrayInputStream和ByteArrayOutputStream字節huan'chi緩沖區
charArrayReader和charArrayWriter
SequenceInputStream和SequenceOutputStream
?
System類三個常量in.out.err標準輸入輸出流
void setIn(InputStream in) 對標準輸入流重定向
void setOut(PrintStream out) 對標準輸出流重定向
void setErr(PrintStream out) 對標準錯誤輸出流重定向
?
File類 文件操作類
| File(String pathname) | 通過指定的一個字符串類型的文件路徑來創建一個新的File對象 |
| File(String parent,String child) | 根據指定的一個字符串類型的父徑和一個字符串類型的子路徑(包括文件名稱)創建一個File對象 |
| File(File parent,String child) | 根據指定的File類的父路徑和字符串類型的子路徑(包括文件名稱)創建一個File對象 |
| 方法聲明 | 功能描述 |
| boolean exists() | 判斷File對象對應的文件或目錄是否存在,若存在則返回ture,否則返回false |
| boolean delete() | 刪除File對象對應的文件或目錄,若成功刪除則返回true,否則返回false |
| boolean createNewFile() | 當File對象對應的文件不存在時,該方法將新建一個此File對象所指定的新文件,若創建成功則返回true,否則返回false |
| String getName() | 返回File對象所表示的文件或文件夾的名稱 |
| String getPath() | 返回File對象對應的路徑 |
| String getAbsolutePath() | 返回File對象的絕對路徑(在UNIX/Linux等系統上,如果路徑是以正斜線/開始,則這個路徑是絕對路徑;在window等系統上,如果路徑是從盤符開始,則這個路徑是絕對路徑) |
| String getParent() | 返回File對象對應目錄的父目錄(則返回的目錄不包含最后一級子目錄 |
| boolean canRead() | 判斷File對象對應的文件或目錄是否可讀,若可讀則返回true,反之返回false |
| boolean canWrite() | 判斷File對象對應的文件或目錄是否可寫,若可寫則返回true,反之返回false |
| boolean isFile() | 判斷File對象對應的是否是文件(不是目錄),若是文件則返回true,反之返回false |
| boolean isDirectory() | 判斷File對象對應的是否是目錄(不是文件),若是文件則返回true,反之返回false |
| boolean isAbsolute() | 判斷File對象對應的文件或目錄是否是絕對路徑 |
| long lastModifield() | 返回1970年1月1日0時0分0秒到文件最后修改時間的毫秒值 |
| long length() | 返回文件內容的長度 |
| String 【】list() | 列出指定目錄的全部內容,只列出名稱 |
| FIle【】 listFiles() | 返回一個包含了File對象所有子文件和子目錄的FIle數組 |
字符編碼
| ASCII | 美國標準信息交換碼,使用7位二進制來表示所有的大小寫字母、數字0~9、標點符號以及在美式英語中使用的特殊控制字符 |
| ISO8859-1 | 拉丁碼表,兼容ASCII,還包括了西歐語言、希臘語、泰語、阿拉伯語等 |
| GB2312 | 中文碼表,兼容ASCII,每個英文占一個字節,中文占2個字節(2個字節都為負數,最高位都為1) |
| GBK、GB18030 | 兼容GB2312,包含更多中文,每個英文占一個字節,中文占兩個字節(第1個字節為負數,第2個字節可正可負) |
| Unicode | 國際標準碼,它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求,每個字符占2個字節。java中存儲的字符類型就是使用Unicode編碼 |
| UTF-8 | 是針對Unicode的可變長編碼,可以用來表示Unicode標準中的任何字符,其中,英文占1個字節,中文占3個字節,這是程序開發中最常用的字符碼表 |
?
GUI圖形用戶界面
- AWT
- ? ? ? ? Component非菜單類
- ? ? ? ? ? ? ? ? Container容器類
- ? ? ? ? ? ? ? ? ? ? ? ? ?Window? ??不依賴其他容器獨立存在的容器
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Frame? ? 具有標題欄的窗口
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Dialog? ? 對話框
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?FileDialog
- ? ? ? ? ? ? ? ? ? ? ? ? ?Panel? ? 不能獨立存在
- ? ? ? ? ? ? ? ? Button? ??
- ? ? ? ? ? ? ? ? label
- ? ? ? ? ? ? ? ? CheckBox
- ? ? ? ? ? ? ? ? TextComponent
- ? ? ? ? ? ? ? ? ? ? ? ? TextArea
- ? ? ? ? ? ? ? ? ? ? ? ? TextField
- ? ? ? ? MenuComponent
- ? ? ? ? ? ? ? ? MenuBar
- ? ? ? ? ? ? ? ? MenuItem
- ? ? ? ? ? ? ? ? ? ? ? ? Menu
事件監聽器
如:WindowListener接口? ? ?? ? 1.windowActivted(激活)? ? ? ? 2.windowClosed(關閉)? ? ? 3.windowDeactived(失活)? ? 4.windowDeiconified(取消圖標化)? ? ? ?5.windowIconified(圖標化)? ? 6.windoiwOpened(開啟)? ? 7.windowClosing(關閉)? ?
參數均為WindowEvent類型
事件適配器
windowAdapter類適配器,實現了接口的方法,但沒有具體代碼塊,因此調用時需要重寫特定的方法
事件分類
- WindowEvent???? MouseEvent???? KeyEvent???? ActionEvent
WindowEvnet 需要實現的方法????????????????? 1.windowActivted(激活)? ? ? ? 2.windowClosed(關閉)? ? ? 3.windowDeactived(失活)? ? 4.windowDeiconified(取消圖標化)? ? ? ?5.windowIconified(圖標化)? ? 6.windoiwOpened(開啟)? ? 7.windowClosing(關閉)? ?
?MouseEvent ?????????? 1.mousePressed(鼠標按下)? ? ? ? ?? 2.mouseReleased(鼠標松開事件)????? 3.mouseEnter(鼠標進入按鈕區域)
4.mouseClick(鼠標點擊)???????? 5.mouseExited(鼠標移出按鈕區域) MouseEvent類下的getButton獲得具體鼠標的操作, 常量BUTTON1? ? ? BUTTON2?????? BUTTON3代表值
Key ?????? 靜態方法static? getKeyText?? 返回值
?
布局管理器? FlowLayout(流式布局管理器)??? BorderLayoput(邊界布局管理器)??? GirdLayout(網格布局管理器)
GirdBagLayout(網格包布局管理器)??? CaedLayout(卡片管理器)
由左到右布局FlowLayout布局管理器的構造方法???
- FlowLayout()——組件默認居中對齊,水平、垂直間距默認為5個單位
- FlowLayout(int align)——指定組件相對于容器的對齊方式,水平、垂直間距默認為5個單位 FlowLayout.LETF(居左)? FlowLayout.CENTER(水平居中) ?? FlowLayout.RIGHT(居右對齊)
- FlowLayout(int align,int hgap,int vgap)——指定組件的對齊方式和水平、垂直間距
上下左右中五種布置方式BorderLayout邊界布局管理器
添加組件方法add(Componept comp,Object constraints)第一個位組件,第二位常量 EAST SOUTH WEST NORTH CENTER,每一個區域只能放置一個組件
格子的形式設置布局GridLayout網格布局管理器構造方法
- GridLayout()——默認只有一行,每個組件占一列
- GridLayout(int rows,int cols)——指定容器的行數和列數
- GridLayout(int rows,int cols,int hgap,int vgap)——指定容器的行數和列數以及組件之間的水平、垂直間距
最靈活的各個包大小不一樣的布局管理器GridBagLayout
- 創建容器與布局文件Component GirdBagLayoput,容器關聯布局setLayout
- 創建約束對象GridBagLayout,并設置
- 布局文件setConstraints關聯組件與約束對象
- 容器添加組件
通俗講就是設置容器,為容器添加網格包布局管理器,創建一個約束對象,設置約束對象的值,然后使用布局文件對象setConstraints方法將需要添加的組件綁上約束對象,從而設置其屬性,最后在容器中添加該組件
| 屬性 | 作用 |
| gridx和gridy | 設置組件的左上角所在網格的橫向和縱向索引。如果將gridx和gridy的值設置為GridBagConstraints.RELATIVE(默認值),表示當前組件緊跟在上一個組件后面 |
| gridwidth和gridheight | 設置組件橫向、縱向跨越幾個網格,兩個屬性的默認值都是1。如果把兩個屬性的值設為GridBagConstraints.REMAINER,表示當前組件在其行或其列上為最后一個組件,如果把這兩個屬性的值設為GridBagConstraints.RELATIVE,表示當前組件在其行或列上為倒數第二個組件 |
| fill | 如果當前組件的顯示區域大于組件需要的大小,設置是否以及如何改變組件大小,該屬性接受以下幾個屬性值:
|
| weightx和weighty | 設置組件占領容器中多余的水平方向和垂直方向空白的比例(也稱為權重)。假設容器的水平方向放置三個組件,其weightx分別為1、2、3,當容器寬度增加60個像素時,這三個容器分別增加10、20和30的像素。這兩個屬性的默認值是0,即不占領多余的空間 |
卡片布局CardLayout,同一窗口布置多個界面
| 方法聲明 | 功能描述 |
| void first(Container Parent) | 顯示parent容器的第一張卡片 |
| void last(Container parent) | 顯示parent容器的最后一張卡片 |
| void previous(Container parent) | 顯示parent容器的前一張卡片 |
| void next(Container parent) | 顯示parent容器的下一張卡片 |
| void show(Container parent,Stringname) | 顯示parent容器中名稱為name的組件,如果不存在,則不會發生任何操作 |
通過cardLayout對象的next或者previous等方法實現組件之間的切換
不使用布局管理器setLayout(nul)
必須調用setLocation方法(定位)/setSize方法(設置大小)方法/setBounds方法(位置x,y,大小x,y)。
?
AWT繪圖
| 方法聲明 | 方法描述 |
| void setColor(Color c) | 將此圖形上下文的當前顏色設置為指定顏色Color.RED |
| void setFont(Font f) | 將此圖形上下文的字體設置為指定字體(三個參數,分別是字體名稱,字體樣式Font.PLAINT/Font.ITALIC/FOnt.BOLD,字體大小 |
| void drawLine(int x1,int y1,int x2,int y2 | 以(x1,y1)和(x2,y2)為端點繪制一條線段 |
| void drawRect(int x,int y,int width,int height) | 繪制指定矩形的邊框。矩形的左邊緣和右邊緣分別位于x和x+width,上邊緣分別位于y+yheight |
| void drawOval(int x,int y,int width,int height) | 繪制橢圓的邊框,得到一個圓或橢圓,它剛好能放入由x,y、width和height參數指定的矩形中。橢圓覆蓋區域的寬度為width+1像素,高度為height+1像素 |
| void fillRect(int x,int y,int width,int height) | 用當前元顏色填充指定的矩形。該矩形左邊緣和右邊緣分別位于x和x+width-1,上邊緣和下邊緣分別位于y和y+height-1 |
| void fillOval(int x,int y,int weight,int height) | 用當前顏色填充外接指定矩形的橢圓 |
| void drawString(String str,int x,int y) | 使用此圖形上下文的當前字體和顏色繪制指定的文本str。最左側字符左下角位于(x,y)坐標 |
Swing
JFrame設置關閉的方法容器.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
JDialog設置 JDialog(Frame owner)——構造方法,用來創建一個非模態的對話框,owner為對話框所有者(頂級窗口JFrame)
JDiolog(Frame owner,String title)——構造方法,創建一個具有指定標題的非模態對話框
JDiolog(Frame owner,boolean modal)——創建一個指定模式的無標題對話框
模態即為用戶提供需要處理的對話框,處理完成后才能與其他窗口交互,非模態允許用戶在處理對話框的同時與其他窗口交互
?
JPanel:無邊框,不能移動、放大、縮小或者關閉的面板,默認布局為FlowLayout
JscrollPane:只能添加一個組件,帶有滾動條。
| 方法聲明 | 功能描述 |
| JScrollPane() | 創建一個空的JScrollPane |
| JScrollPane(Component view) | 創建一個顯示組件的JScrollPane面板,只要組件的內容超過視圖大小就會顯示水平和垂直滾動條 |
| JScrollPane(Component view,int vsbPolicy,int hsbPolicy) | 創建一個顯示指定容器、并具有指定滾動條策略的JScrollPene。參數vsbPolicy和hsbPolicy分別表示垂直滾動條策略和水平滾動條策略,應指定為ScrollPaneConstants的靜態常量。
|
| void setHorizontalBarPolicy(int policy) | 指定水平滾動條策略,即水平滾動條何時顯示在滾動面板上 |
| void setVerticalBarPolicy(int policy) | 指定垂直滾動條策略,即垂直滾動條何時顯示在滾動面板上 |
| void setViewportView(Component view) | 設置在滾動面板顯示的組件,添加組件 |
?
文本框JTextComponent抽象類,子類JTextField和JtextArea
密碼框屬于JTextField的子類,方法相似
| JTextComponent常用方法 | |
| 方法描述 | 功能說明 |
| String getText() | 返回文本組件中所有的文本內容 |
| void getSelectedText() | 返回文本組件中選定的文本內容 |
| void selectAll() | 在文本組件中選中所有內容 |
| void setEditable() | 設置文本組件為可編輯或者不可編輯狀態 |
| void replaceSelection(String content) | 用給定的內容替換當前選定的內容 |
| JTextField構造方法 | |
| JTextField() | 創建一個空的文本框,初始字符串為null |
| JTextField(int columns) | 創建一個具有指定列數的文本框,初始字符串為null |
| JTextField(String text) | 創建一個顯示指定初始字符串的文本框 |
| JTextField(String text,int column) | 創建一個具有指定列數、并顯示指定初始字符串的文本框 |
| JTextArea構造方法 | |
| JTextArea() | 創建一個空的文本域 |
| JTextArea(String text) | 創建一個顯示指定初始字符串的文本域 |
| JTextArea(int rows,int columns) | 創建具有指定行和列的空文本域 |
| JTextArea(String text,int rows,int columns) | 創建顯示指定初始文本并指定了行列的文本域 |
| JPasswordText | 密碼域 |
| void append() | 為文本框添加文本 |
?
按鈕組件
JButton、JCheckBox、JradioButton等屬于AbstractButton抽象類的子類或者間接子類
| 方法描述? | 功能說明 |
| Icon getIcon和void setIcon(Icon icon) | 設置或者獲取按鈕的圖標 |
| String getText()和void setText(String text) | 設置或者獲取按鈕的文本 |
| void setEnable(boolean b) | 啟用(當b為true)或禁用(當b為false)按鈕 |
| setSelected(boolean b) | 設置按鈕的狀態,當b為true時,按鈕時選中狀態,反之為未選中狀態 |
| boolean isSelect() | 返回按鈕的狀態(true為選中,反之為未選中) |
| JcheckBox構造方法(多選) | |
| JcheckBox() | 創建一個沒有文本信息,初始狀態未被選中的復選框 |
| JCheckBox(String text) | 創建一個帶有文本信息,初始狀態未被選定的復選框 |
| JCheckBox(String text,boolean selected) | 創建一個帶有文本信息,并指定初始狀態(選中/未選中)的復選框 |
| JradioButton構造方法(單選) | |
| JRadioButton() | 創建一個沒有文本信息、初始狀態未被選中的單選框 |
| JradioButton(String text) | 創建一個帶有文本信息、初始狀態未被選中的單選框 |
| JRadioButton(String text,boolean selected) | 創建一個帶有文本信息,并指定初始狀態(選中/未選中)的單選框 |
| JComBox構造方法(列表) | |
| JComboBox() | 創建一個沒有可選項的組合框 |
| JComboBOx(Object[] items) | 創建一個組合框,將Object數組中的元素作為組合框的下拉列表選項 |
| JComboBox(Vector items) | 創建一個組合框,將Vector集合中的元素作為組合框的下拉列表選項 |
| JComboBox常用方法 | |
| void addItem(Object anObject) | 為組合框添加選項 |
| void insertItemAt(Object anObject,int index) | 在指定的索引處插入選項 |
| Object getItemAt(int index) | 返回指定索引處選項,第一個選項的索引為0 |
| int getItemCount() | 返回組合框中選項的數目 |
| Object getSelectedItem() | 返回當前所選項 |
| void removeAllItems | 刪除組合框中所有的選項 |
| void removeItem(Object object) | 從組合框中刪除指定選項 |
| void removeItemAt(int index) | 移除指定索引處的選項 |
| void setEditable(boolean aFlag) | 設置組合框的選項是否可編輯,aFlag為true則可編輯,反之則不可編輯 |
ButtonGroup為單選框捆綁組件,邏輯上將單選組件捆綁在一起,并不是一個框架
?
菜單組件
下拉式菜單
JMenuBar(菜單欄)、JMenu(菜單)、JMenuItem(菜單項)? ? ? ? JMenuBar為水平菜單,在水平菜單中添加JMenu菜單,在JMenuItem添加單獨的菜單項。
| 方法聲明 | 功能描述 |
| void JMenuItem add(IMenuItem menuItem) | 將菜單項添加到菜單末尾,返回此菜單項 |
| void addSeparator() | 將分隔符添加到菜單的末尾 |
| JMenuItem getItem(int pos) | 返回指定索引處的菜單項,第一個菜單項的索引為0 |
| int getItemCount() | 返回菜單上的項數,菜單項和分隔符都計算在內 |
| void JMenuItem insert(JMenuItem menuItem,int pos) | 在指定索引處插入菜單項 |
| void insertSeparator(int pos) | 在指定索引處插入分隔符 |
| void remove(int pos) | 從菜單中移除指定索引處的菜單項 |
| void remove(JMenuItem menuItem) | 從菜單中移除指定的菜單項 |
| void removeAll() | 從菜單中移除所有的菜單項 |
容器通過setJMenuBar,而JMenuBar和JMenu通過add添加各自的組件
彈出式菜單
JPopupMenu菜單,相當于JMenu,添加JMenuItem組件生成彈出列表
?
網絡編程
TCP/IP協議中分為應用層、傳輸層、網絡層、鏈路層
- 鏈路層:用于定于物理傳輸通道,通常是對某些網絡連接設備的驅動協議,例如針對光纖、雙絞線提供的驅動
- 網絡層:網絡層是整個TCP/IP協議的核心,它主要用于將傳輸的數據進行分組,將分組數據發送到目標計算機或者網絡
- 傳輸層:主要使網絡程序進行通信,在進行網絡通信時,可以采用TCP協議,也可以采用UDP協議
- 應用層:主要負責應用程序的協議,如HTTP協議、FTP協議
IP4采用4個字節表示,IP6采用16個字節表示,訪問應用程序需要用到兩個字節的端口號,0~1023為知名的網絡服務和應用
InetAddress
| 方法聲明 | 功能描述 |
| InetAddress getByName(String host) | 參數host表示指定的主機,該方法用于在給定主機名的情況下確定主機的IP地址 |
| InetAddress getLocalhost() | 創建一個表示本機的InetAddress對象 |
| String getHostName() | 得到IP地址的主機名,如果是本機則是計算機名,不是本機則是主機名,如果沒有則是IP地址 |
| boolean isReachable(int timeout) | 判斷指定的時間內地址是否可以到達 |
| String getHostAddress | 得到字符串格式的原始IP地址 |
UDP協議和TCP協議
UDP協議是無連接通信協議,在數據傳輸時,數據的發送端和接受端不建立邏輯連接。簡單來說,當一臺計算機向另外一臺計算機發送數據時,發送端不會確認接受端是否存在,就會發出數據,同樣接受端在收到數據時,也不會向發送端反饋是否收到數據。一般用于音頻、視頻等,數據可能會丟失,但不會造成太大影響的應用,消耗資源小,通信效率高
TCP協議是面向連接的通信協議。首先客戶端發送連接請求,然后服務器響應請求,最后客戶端確認請求。
DategramPacket類,用于包裝發送或者是接受的數據,根據發送和接收的構造方法創建不同用戶端的對象。
DatagramSocket類,用于發送或者接收數據。
| 方法聲明 | 功能描述 |
| DatagramPacket(byte[] buf,int length) | 創建DatagramPacket對象時,指定了封裝數據的字節數組和數據大小,用于接受端 |
| DatagramPacket(byte[] buf,int length,InetAddress add,int port) | 創建DatagramPacket對象,指定了封裝數據的字節數組和數據大小,并指定ip地址和端口號 |
| DatagramPacket(byte[] buf,int offest,int length) | 與第一個方法類似,只是指定從offest開始接受 |
| DatagramPacket(byte[] buf,int offset,InetAddress addr,int port) | 與第二個方法類似,只是增加了從offset開始發送數據 |
| InetAddress? getAddress() | 該方法用于返回發送端或者接收端的IP地址,如果是發送端的DatagramPacket對象,則返回接收端的IP,反之,返回發送端的IP地址 |
| int? getPort() | 該方法用于返回發送端或者接收端的端口號,如果是發送端的DatagramPacket對象,就返回接收端的端口號,反之,就返回發送端的端口號 |
| byte[]? getData() | 該方法用于返回將要接收或者將要發送的數據,如果是發送端的DatagramPacket對象,就返回將要發送的數據,反之,就返回接收到的數據 |
| int getLength() | 該方法用于返回接收或者將要發送數據的長度,如果是發送端的DatagramPacket對象,就返回將要發送的數據長度,反之,就返回接受到數據的長度 |
| 方法聲明 | 功能描述 |
| DatagramSocket() | 該構造方法用于創建發送端的DatagramSocket對象,在創建DatagramSocket對象時,并沒有指定端口號,此時,系統會分配一個沒有被其他網絡程序所使用的端口號 |
| DatagramSocket(int port) | 該構造方法既可用于創建接收端的DatagramSocket對象,又可以創建發送端的DatagramSocket對象,在創建接收端的DatagramSocket對象時,必須要指定一個端口號,這樣就可以監聽指定的端口 |
| DatagramSocket(int port,InetAddress addr) | 使用該構造在創建DatagramSocket時,不僅指定了端口號,還指定了相關的IP地址,這種情況適用于計算機多塊網卡的情況,可以明確規定數據通過哪塊網卡向外發送和接收哪塊網卡的數據 |
| void receive(DatagramPacket P) | 該方法用于將接收到的數據填充到Datagram |
| void send(DatagramPacket P) | 該方法用于發送DatagramPacket數據包,發送的數據包中包含將要發送的數據,數據的長度,遠程主機的IP地址和端口號 |
| void close() | 關閉當前的Socket,通知驅動程序釋放為這個Socket保留的資源 |
注意:若端口號給占用時,命令窗口輸入netstat-anb命令查看當前計算機端口占用情況。
package UDP;import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.*; import javax.swing.*;public class UDPSend extends JFrame{private static final int DEFAULT_PORT=8899;//把主窗口分為NORTH、CENTER、SOUTH三個部分private JLabel stateLB; //顯示監聽狀態private JTextArea centerTextArea; //顯示聊天記錄private JPanel southPanel; //最下面的面板private JTextArea inputTextArea; //聊天輸入框private JPanel bottomPanel; //放置IP輸入框,按鈕等private JTextField ipTextField; //IP輸入框private JTextField remotePortTF; //端口號輸入框private JButton sendBT; //發送按鈕private JButton clearBT; //清除聊天記錄按鈕private DatagramSocket datagramSocket; //用于后面功能的實現private void setUpUI() { //初始化Swing窗口//窗口初始化setTitle("GUI聊天");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(400,400); //設置窗口大小setResizable(false); //窗口大小不可調整setLocationRelativeTo(null); //窗口居中//窗口的NORTH部分stateLB=new JLabel("當前還未啟動監聽"); stateLB.setHorizontalAlignment(JLabel.RIGHT);//窗口的CENTER部分centerTextArea=new JTextArea(); //聊天記錄顯示區域centerTextArea.setEditable(false);centerTextArea.setBackground(new Color(211,211,211));//窗口的SOUTH部分southPanel=new JPanel(new BorderLayout());inputTextArea=new JTextArea(5,20); //內容輸入區域bottomPanel=new JPanel(new FlowLayout(FlowLayout.CENTER,5,5));ipTextField=new JTextField("127.0.0.1",8);remotePortTF=new JTextField(String.valueOf(DEFAULT_PORT),3);sendBT=new JButton("發送");clearBT=new JButton("清屏");bottomPanel.add(ipTextField);bottomPanel.add(remotePortTF);bottomPanel.add(sendBT);bottomPanel.add(clearBT);southPanel.add(new JScrollPane(inputTextArea),BorderLayout.CENTER);southPanel.add(bottomPanel,BorderLayout.SOUTH);//添加窗口NORTH、CENTER、SOUTH部分組件add(stateLB,BorderLayout.NORTH);add(new JScrollPane(centerTextArea),BorderLayout.CENTER);add(southPanel,BorderLayout.SOUTH);setVisible(true);}private void setListener() {//為sendBT按鈕添加事件監聽器sendBT.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stub//獲取發送的目標IP地址和端口號final String ipAddress=ipTextField.getText();final String remotePort=remotePortTF.getText();if(ipAddress==null||ipAddress.trim().equals("")) {JOptionPane.showMessageDialog(UDPSend.this, "請輸入IP地址和端口號");return;}//判斷IP地址和端口號是否為空if(datagramSocket==null||datagramSocket.isClosed()) {JOptionPane.showMessageDialog(UDPSend.this,"監聽不成功");return;}//獲得需要發送的內容String sendContent=inputTextArea.getText();byte[] buf=sendContent.getBytes();try {//將發送的內容顯示在自己的聊天信息記錄中centerTextArea.append("我對"+ipAddress+":"+remotePort+"說\n"+inputTextArea.getText()+"\n\n");//添加內容后使滾動條自動滾動到最底端centerTextArea.setCaretPosition(centerTextArea.getText().length());//發送數據datagramSocket.send(new DatagramPacket(buf, buf.length,InetAddress.getByName(ipAddress),Integer.parseInt(remotePort)));inputTextArea.setText("");}catch (IOException el) {JOptionPane.showMessageDialog(UDPSend.this, "出錯了,發送不成功");el.printStackTrace();}}});//為clearBT按鈕添加事件監聽器clearBT.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubcenterTextArea.setText(""); //清空聊天記錄的內容}});}private void initSocket() {int port=DEFAULT_PORT;while(true) {try {if(datagramSocket!=null&&datagramSocket.isClosed()) {datagramSocket.close();}try { //判斷端口號是否在1~65535之間port=Integer.parseInt(JOptionPane.showInputDialog(this,"請輸入端口號","端口號",JOptionPane.QUESTION_MESSAGE));if(port<1||port>65535) {throw new RuntimeException("端口號超出范圍");}}catch(Exception e) {JOptionPane.showMessageDialog(null, "你輸入的端口號不正確,請輸入1~65535之間的數");continue; //端口不正確重新填寫}//啟動DatagramSocketdatagramSocket=new DatagramSocket(port);startListen(); //調用startListen方法//在stateLB中顯示程序監聽的端口號stateLB.setText("已在"+port+"端口監聽");break;}catch(SocketException e) {JOptionPane.showMessageDialog(this, "端口已被占用,請重新設置端口");stateLB.setText("當前還未啟動監聽");}}}private void startListen() {new Thread() {private DatagramPacket p;public void run() {byte[] buf=new byte[1024];p=new DatagramPacket(buf, buf.length);while(!datagramSocket.isClosed()) {try {datagramSocket.receive(p); //接收聊天信息//添加聊天記錄框centerTextArea.append(p.getAddress().getHostAddress()+":"+((InetSocketAddress)p.getSocketAddress()).getPort()+"對我說:\n"+new String(p.getData(),0,p.getLength())+"\n\n");//使滾動條自動滾動到最底端centerTextArea.setCaretPosition(centerTextArea.getText().length());}catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}}}.start();}//構造函數public UDPSend() {setUpUI();initSocket();setListener();}public static void main(String args[]) {// TODO Auto-generated method stubnew UDPSend();} }TCP嚴格區分客戶端和服務器端
ServerSocket類用于服務器,Socket用于客戶端
| 方法聲明 | 功能描述 |
| ServerSocket() | 使用該構造方法在創建Server Socket對象時并沒有綁定端口號,這樣的對象創建的服務器沒有監聽任何端口,不能直接使用,還需要繼續調用bind(SocketAddress endpoint)方法將其綁定到指定的端口號,才可以正常使用 |
| ServverSocket(int port) ? | 使用該構造方法在創建ServerSocket對象時,就可以將其綁定到一個指定的端口號上。端口號可以是0,此時系統就會分配一個還沒有被其他網絡程序所使用的端口號。 |
| ServerSocket(int port,int backlog) | 該構造方法就是在第二個構造方法的基礎上,增加了一個backlog參數。該參數用于指定在服務器忙時,可以與之保持連接請求的等待客戶數量,如果沒有指定這個參數,默認為50 |
| ServerSocket(int port,int backlog,InetAddress bindAddr) | 該構造方法就是在第三個構造方法的基礎上,還指定了相關的IP地址,這種情況適用與多塊網卡和多個IP的情況,我們可以明確規定SeverSocket在哪塊網卡或IP地址上等待客戶的連接請求。 |
| Socket ccept() | 該方法用于等待客戶端的連接,在客戶端連接之前一直處于阻塞狀態,如果有客戶端連接就會返回一個與之對應的Socket對象 |
| InetAddress getInetAddressI() | 該方法用于返回一個InetAddress對象,該對象中封裝了ServerSocket綁定的IP地址 |
| boolean isClosed() | 該方法用于判斷ServerSocket對象是否為關閉狀態,如果是關閉狀態則返回true,反之則返回false |
| void bind(SocketAddress endpoint) | 該方法用于將ServerSocket對象綁定到指定的IP地址和端口號,其中參數endpoint封裝了IP地址和端口號 |
Socket
| 方法聲明 | 功能描述 |
| Socket() | 使用該構造方法在創建Socket對象時,并沒有指定IP地址和端口號,也意味著只創建了客戶端對象,并沒有去連接任何服務器。通過該構造方法創建對象后還需要調用connect(SocketAddress endpoint)方法,才能完成與指定服務器的連接,其中參數endpoint用于封裝IP地址和端口號 |
| Socket(String host,int port) | 使用該構造方法在創建Socket對象時,會根據參數去連接在指定地址和端口號上運行的服務器程序。host接收的是一個字符串類型的IP地址 |
| Socket(Inet Address address,int port) | 該方法在使用上與第二個構造方法類似 |
| int getPort() | 該方法返回一個int類型對象,該對象是Socket對象與服務器端連接的端口號 |
| InetAddress getLocalAddress() | 該方法用于獲取Socket對象綁定的本地IP地址,并將IP地址封裝成InetAddress類型的對象返回 |
| void close() | 該方法用于關閉Socket連接,結束本次通信。在關閉Socket之前,應將與Socket相關的所有的輸入輸出流全部關閉,這是因為一個良好的程序應該在執行完畢時釋放所有的資源 |
| InputStream getInputStream() | 該方法返回一個InputStream類型的輸入流對象,如果該對象是由服務器端的Socket返回,就用于讀取客戶端發送的數據,反之,用于讀取服務器端發送的數據 |
| OutputStream getOutputStream() | 該方法返回一個OutputStream類型的輸出流對象,如果該對象是由服務器端的Socket返回,就用于向客戶端發送數據,反之,用于向服務器端發送數據 |
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的当年我们一起追过的Java,Java SE 个人笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何辨识兰花的好坏?
- 下一篇: JS动画-移入移出