2011年6月30日 星期四

《SCJP 6.0 認證教戰手冊》筆記

一.條件迴圈控制

1.continue與break作用範圍僅限於所在的迴圈。當使用巢狀迴圈時,則無法作用到更外層的迴圈。因此可以使用標籤將迴圈命名。必須以「:」結尾,且只能作用在迴圈上。不可在標籤與迴圈之間插入任何程式碼
labA:
for...
   if...
     for...
        if...
 xxx;
 break labA;
.
     .
  .
}



二.陣列的應用

1.陣列的排序:
Arrays.sort(a)
//陣列a的元素由大到小排列


2.陣列的搜尋
Arrays.binarySearch(a, 100)
//搜索陣列a內是否有100這個值,如果有則回傳該值的索引;如果沒有,則回傳該值在這陣列內排序位置的負索引減1
﹡搜尋前必須先排序


3.陣列的複製
int[] b = Arrays.copyOf(a, a.length)
//將a陣列內容依照指定長度複製到目的的陣列。若指定的長度大於a的長度,則超過部份的元素會存放0



三.物件導向基本觀念

1.任何類別的建構元內都必須存在呼叫父類別建構元的呼叫式,如果沒有,則編譯器會自動加上super();



四.物件導向進階觀念

1.protected與private不可用於修飾類別


2.系統分析師是利用介面去要求程式設計師將方法內容實作出來。如果系統分析師認為這個介面內的某些方法可以自行撰寫內容,則應將介面改為抽象類別


3.1個類別只能繼承1個介面


4.1個類別可以實作多個介面


5.任何類別都只能實作介面,而不可繼承介面


6.1個介面可以繼承多個介面


7.任何介面都不能繼承類別,因為會將一般方法繼承過來,而介面只能有抽象方法


8.任何介面都不能實作介面,因為實作就必建立一般方法,而介面只能有抽象方法


五.生命期的探討與列舉類型

類別變數:依附在類別上,所以生命期最長,應用程式執行期間都可以存取它
1.必須在類別區塊內宣告。不可宣告在其他區塊內


2.有預設初始值


3.透過類別名稱存取
Book.count


實體變數:依附在物件實體上,所以必須透過物件名稱來存取
1.必須在類別區塊內宣告,但不可加上static


2.有預設初始值


3.透過物件名稱存取


方法變數:依附在方法上,當方法結束時,方法變數生命期也結束
1.宣告在方法的小括號或大括號內


2.沒有預設初始值,必須自行指定


3.僅限在方法區塊內存取


區塊變數:依附在區塊上,當區塊結束時,區塊變數生命期也結束
1.宣告在區塊的小括號或大括號內


2.沒有預設值,必須自行指定


3.僅現在區塊內存取


﹡只有類別和實體變數可以加上存取修飾詞。而方法和區塊變數只提供區塊內存取,外部無法存取,因此不可加上存取修飾詞

﹡類別方法內不可置入實體變數,以及代表物件的this、super關鍵字

﹡類別方法應避免透過物件呼叫,因容易與實體方法混淆


尋找變數宣告式:
1.透過類別名稱存取,此變數一定是類別變數


2.透過this存取,此變數可以是類別變數或實體變數


列舉類型是為了解決使用整數處理列舉資料上的缺點,其宣告規則為:
1.列舉類型的開頭一定要加上enum關鍵字
enum BookType{COMIC, BUSINESS}


2.列舉類型的屬性會自動加上public final static


3.列舉類型不可使用new關鍵字來實體化


列舉類型的特色:
1.可搭配switch-case


2.會自動繼承java.lang.Enum類別


3.列舉類型呼叫values()方法後即可轉成相同類型的陣列
BookType[] types = BookType.values();


資源回收的方法:
1.System.gc();


2.finalize()
void finalize(){...}



六.例外事件的產生與處理

1.throw自行產生例外事件
throw new ArithmeticException("xxx");


2.自訂例外類別時,須繼承Java類別庫內任一例外類別
class a extends Exception


3.若要將方法內產生的例外事件拋回給原呼叫式,必須使用關鍵字throws
public void setPrice(double price) throws BookException{
  if(price < 0)
    throw new BookException("xx");}}

﹡throws只能用在方法上



七.資料的輸入與輸出

1.Console類別可以用來定義輸入輸出的方法
Console a = System.console()
﹡Console的建構元是private,所以不能使用new Console()方式建立Console物件

String Name = a.readLine("xxx"); //讀取一行文字

char[] password = a.readPassword("xxx"); //讀取密碼

a.printf("xxx"); //輸出文字


2.File類別專門提供檔案、目錄管理的功能

File a = new File("txt"); //依照傳入的路徑建立a物件

File b = new File(a, "xx.txt"); //結合兩個參數的路徑建立b物件

a.exists() //檢查a所代表的路徑是否存在

a.getName() //取得目錄名稱

a.mkdirs() //依照a代表的路徑建立目錄

b.createNewFile() //依照b代表的路徑建立檔案

b.deleteOnExit() //將b所代表的檔案設定成暫存檔

b.getParent() //取得父路徑

b.renameTo(c) //將b名稱改成c

c.delete() //刪除c檔案


3.FileOutputStream與FileInputStream類別
以byte為單位來存取檔案內容,適用於非文字檔

FileOutputStream:

FileOutputStream a = new FileOutputStream(b); //開啟與b檔案之間的連結以準備輸出

a.write(c.getBytes()); //因FileOutputStream的write()方法是以byte陣列方式寫入,所以必須將c字串轉成陣列才能寫入

a.cloes(); //關閉檔案輸出的連結,並釋放所佔用的記憶體資源


FileInputStream:

FileInputStream d = new FileInputStream(b); //開啟與b檔案之間的連結以準備輸入

d.read(); //每呼叫一次read方法就會從檔案讀取1個byte後回傳,如果到了檔尾就會回傳-1

d.close(); //關閉檔案輸出的連結,並釋放所佔用的記憶體資源


4.FileWriter與FileReader類別
以字元形式來存取檔案內容,適用於文字檔

FileWriter:

FileWriter a = new FileWriter(b);

a.write(c); //FileWriter的write()方法可以直接將字串寫入檔案內

a.close(); //關閉檔案輸出的連結,並釋放所佔用的記憶體資源


FileReader:

FileReader d = new FileReader(b);

d.read(); //每呼叫一次read()方法就會從檔案讀取1個字元後回傳,如果到了檔尾就會回傳-1

d.close(); //關閉檔案輸入的連結,並釋放所佔用的記憶體資源


5.BufferedWriter與BufferedReader類別
這兩個類別會在記憶體中製造緩衝區,把要存取的資料內容先暫存到緩衝區內,等到緩衝區滿了再一次處理

BufferedWriter:

BufferedWriter a = new BufferedWriter(b); //建立BufferedWriter物件並串接到d物件

a.flush(); //不等資料填滿緩衝區,即強制將其內現有的資料直接寫入,以刷新緩衝區的資料

a.close(); //會先呼叫flush()方法,之後才會關閉輸出的串流連結,以釋放記憶體資源

a.newLine(); //寫入一個換行字元

a.write(); //將字串資料寫入


BufferedReader:

BufferedReader c = newBufferedReader(d); //建立BufferedReader物件並串接到b物件

c.readLine() //每呼叫一次readLine()方法就會從輸入的資料串流中讀取1行文字後回傳,讀到null就代表已讀完

c.close(); //關閉資料輸入的連結,並釋放所佔用的記憶體資源


6.ObjectOutputStream與ObjectInputStream類別
可透過物件形式來存取資料

﹡要使用ObjectOutputStream類別將物件寫入,則該物件必須是可序列化的物件(物件以及物件內屬性的所屬類別都要實作Serializable介面)
class Book implements Serializalbe

﹡ObjectOutputStream類別會使用序列化將物件寫入;ObjectInputStream類別會使用反序列化將物件讀出

﹡序列化是將物件內所有的屬性及相關資料依照一定的順序轉場byte型式後寫入

ObjectOutputStream:

ObjectOutputStream a = new ObjectOutputStream(b); //建立ObjectOutputStream物件並串接到b物件

a.writeObject(c); //將c物件依序列化方式寫入,而寫入的物件都會自動轉型成Object

a.close(); //關閉資料輸出的連結,並釋放所佔用的記憶體資源


ObjectInputStream:

ObjectInputStream d = newObjectInputStream(e); //建立ObjectInputStream物件並串接到e物件

d.readObject(f); //讀出的物件皆為Object類型,若需使用Book類別內的方法則需轉型(Book)d.readObject.show()

d.close(); ////關閉資料輸入的連結,並釋放所佔用的記憶體資源



八.常用資料類型與其格式化

1.Math類別

Math.E //2.7

Math.PI //3.14

Math.abs(a) //a的絕對值

Math.max(a, b) //a與b比較後回傳較大者

Math.min(a, b) //比較後回傳較小者

Math.pow(a, b) //a的b次方

Math.random() //回傳介於0.0≦x<1.0之間的亂數

Math.sqrt(a) //a的正平方根

Math.cbrt(a) //a的立方根


2.Wrapper類別

Integer類別:

Integer a = new Integer(1); //建立Integer物件

Integer.parseInt("2"); //將指定的字串解析為int類型

a.compareTo(b); //比較兩個Integer物件的值。若a>b回傳1;若a=b回傳0;若a<b回傳-1

a.intValue(); //將Integer物件轉成int類型

a.doubleValue(); //將Integer物件轉成double類型

a.equals(b); //比較兩個Integer物件的值是否相同


Double類別:

Double b = new Double(1); //建立Double物件

Double.parseDouble("2"); //將指定的字串解析為double類型

Double.isInfinite(a); //檢查指定的double值是否為無限大

Double.isNaN(a); //檢查指定的double值是否為NaN(Not-a-Number)

a.compareTo(b); //比較兩個Double物件的值。若a>b回傳1;若a=b回傳0;若a<b回傳-1

a.doubleValue(); //將Integer物件轉成int類型

a.equals(b); //比較兩個Double物件的值是否相同


Boolean類別:

Boolean.valueOf("true"); //回傳指定字串所代表的Boolean值。只有當參數為"true"時才會回傳true,否則皆回傳false


3.文字類型

String:
String物件不會因為呼叫方法而改變其內的值

String a = "A dog ";

a.charAt(3); //o。將指定索引的字元回傳

a.concat("!"); //A dog !。將指定字串附加在原字串後回傳

a.endsWith("dog "); //ture。比對原字串字尾是否與指定字串相同

a.equalsIgnoreCase("A DOG "); //true。忽略字母大小寫的情況下比較兩字串

a.indexOf("dog "); //2。使用指定字串與原字串比對,只要比對成功就回傳該字串第1個字元的索引

a.length(); //6。回傳該字串的字元總數

a.replace("dog", "cat"); //A cat 。將字串內特定文字以指定文字取代

a.substring(2, 5); //dog。擷取指定的起始索引至「終止索引-1」間的局部字串

a.startsWith("A"); //true。比對原字串字首是否與指定字串相同

a.toLowerCase(); //a dog 。轉成小寫

a.toUpperCase(); //A DOG 。轉成大寫

a.trim(); //A dog。去除字串前後的空白字元,但字串內部的空白字元不會被去除


StringBuilder:
StringBuffer與StringBulider物件內的值可以直接被修改

﹡StringBuffer類別的方法都有執行緒安全性(因為方法都冠上了synchronized修飾詞),但執行效能較差;而StringBuilder類別的方法都沒有執行緒安全性,所以執行效能較佳

StringBuilder a = new StringBuilder("A dog"); //建立StringBuilder物件

a.charAt(3); //o。將指定索引的字元回傳

a.append("!"); //A dog!。將指定字串附加在原字串後回傳

a.delete(2,4); //A。刪除起始索引至「終止索引-1」間的文字

a.indexOf("dog"); //2。使用指定字串與原文字比對,只要比對成功就回傳該字串第1個字元的索引

a.insert(2, "barking"); //A barking dog。將指定文字插入在指定的索引上,該索引以及之後的文字會自動向後移動

a.length(); //5。回傳StringBuilder物件的字元總數

a.substring(2, 5); //dog。擷取指定的起始索引至「終止索引-1」間的局部字串

a.replace(2, 5, "cat"); //A cat。將起始索引至「終止索引-1」間的文字以指定字串來取代

a.reserve(); //god A。將StringBuilder物件內的字元順序反轉後回傳


4.日期/時間類型

Date a = new Date(); //依照現在的日期/時間建立Date物件

a.getTime(); //回傳該Date物件自1970/1/1 00:00:00以來的毫秒數


5.Scanner類別
將掃描進來的文字做分割

Scanner a = new Scanner(b); //將b的資料掃描到a

a.close(); //關閉此掃描機

a.hasNext(); //檢查資料是否還有下一個字符

a.hasNextBoolean(); //檢查資料是否還有下一個boolean字符

a.hasNextInt(); //檢查資料是否還有下一個int字符

a.next(); //回傳下一個字符

a.nextBoolean(); //回傳下一個boolean字符

a.nextInt(); //回傳下一個int字符

a.useDelimiter(","); //使用指定的規則運算式當作Scanner的分割依據



九.集合與泛型

1.集合與陣列的比較

空間大小:
集合建立時不必指定大小,會動態調整空間以符合需求
陣列建立時必須指定大小,且之後無法改變

資料類型:
集合可先存放任何物件,但若存放基本類型,會先AutoBoxing成對應的物件後再存放。放入的物件還會自動轉型成Object類型
陣列可存放物件或基本類型,但必須符合陣列所宣告的資料類型

資料存取:
集合可使用1.for-each 2.lterator物件功能
陣列可使用1.for-each 2.for迴圈並搭配索引


2.Collection介面

Collection a = new ArrayList();

a.add(1); //將指定物件新增至集合內

a.clear(); //將集合內的所有元素清空

a.isEmpty(); //檢查是否為空集合

Iterator b = a.iterator(); //取得Iterator物件後,可透過物件走訪所有集合的元素

a.remove(1); //將指定元素從集合內移除

a.size(); //回傳集合內的元素總數

a.toArray(); //將集合內的元素轉存到陣列內


3.Collections類別

List a = new ArrayList();

list.add("BB");

list.add("bb");

list.add("Bb");

list.add("b");

Collections.sort(a); //排序a集合。大寫排在小寫前面,如BB排在bb之前。字數少排在字數多的前面,如b排在bb前面

Collections.binarySearch(a, "bb"); //3。搜索a集合內指定值的索引,若沒有,則回傳該值在這個陣列內排序位置的負索引減1。搜尋前必須先將陣列排序

Collections.reserve(a); //將a集合內的元素順序反轉



十.多執行緒程式設計

1.Thread類別
建立新的執行緒只需建立1個自訂類別繼承Thread類別

Thread.activeCount(); //回傳正在執行的執行緒總個數

Thread.currentThread(); //回傳當前執行緒物件

Thread.getName(); //回傳該執行緒名稱

Thread.getPriority(); //回傳該執行緒優先序

Thread.getState(); //回傳該執行緒狀態

Thread.join(); //等待此執行緒執行完畢後,其他執行緒才能執行

Thread.run(); //次執行緒會執行run()方法內容,所以Thread子類別必須改寫此方法

Thread.setName("b"); //設定該執行緒的名稱

Thread.setPriority(10); //設定該執行緒的優先順序。優先序最高為10,最低為1,預設為5

Thread.sleep(1000); //讓當前執行緒暫時停止1秒。單位為千分之1秒

Thread.start(); //啟動執行緒,並呼叫已改寫的run()方法

Thread.yield(); //讓該執行緒暫停,先給其他執行緒執行


2.Runnable介面
建立新的執行緒可透過繼承Thread類別或實作Runnable介面

﹡實作Runnable介面只需實作run()方法,但建立新執行緒需要start()方法,所以要利用Thread類別的建構元,才能依據Runnable物件來建立Thread物件,也才能夠呼叫start()方法


3.執行緒的同步性與安全性
執行緒在同一時間只允許1條執行緒存取物件資料。若同時有兩條以上執行緒欲存取同一個物件內的資料,則讓先進入到該物件的執行緒有存取的權利

﹡執行緒的安全性是鎖定在記憶體中的物件


4.synchronized方法

藉由在方法的前面加上synchronized修飾詞來鎖定方法,已達到執行續的安全性


5.synchronized區塊

synchronized(a.class){...}

﹡synchronized亦可鎖定static變數


6.執行緒的互動處理

Object類別:

notify(); //喚醒正在等待此物件存取權的執行緒。如果有多條執行緒在等待,則會隨意喚醒其中一個

notifyAll(); //喚醒正在等待此物件存取權的所有執行續

wait(); //讓該執行緒進入等待狀態。必須等待擁有此物件執行權的執行緒呼叫notify()或notifyAll()方法才能將其喚醒

沒有留言:

張貼留言