2015年12月23日 星期三

JAVA SE 認證 1Z0-808 考試心得分享


JAVA SE 認證 1Z0-808 考試心得分享:

本文章同時發表於 : 維克的煩惱

最近跑去考JAVA SE8的認證考了--- 1Z0-808 - Java SE 8 Programmer I

考試前有上網找了一些資訊,不過大部分都是SE6或SE7的

好像沒找到SE8的

再加上第一次考認證考,所以就來寫寫考試的心得吧!

據說SE6考古題400多題 ,命中率可以高達100%

我猜大家最關心的也是SE8認證考 1Z0-808 的考古題命中率吧

我就不賣關子直接說 命中率是...0%

沒瞎說

我的考古題來源是 kaplan

這網站是從oracle 的網站連結找的

(如果要從google 搜尋,用kaplan self test 關鍵字會比較好找到)

kaplan 有180題考古題

再加上猛虎出閘的803考古題126題

雖然不是1Z0-808不過我想考試範圍一樣 應該差不多的說

反正不管怎麼說 就是都都沒考..

雖然都沒考,不過真的不建議沒作考古題就直接上場

畢竟考古題還是可以釐清一些觀念的

我就覺得kaplan的幫助就不少,雖然也不便宜,花了我2000多台幣

考場方面我是在新竹巨匠考的

不能自己帶紙筆 字典

提供的紙有點像護貝的A4紙,大概是要重複使用吧

筆是簽字筆之類的(其實我不太會分),正常書寫速度會寫不出來,會斷水,要寫慢點才OK

我覺得我應該要試寫一下的..殘念

門不知道為啥 後半段的時候一直有震動的撞擊聲

考場是小房間,前面桌子3面靠牆

坐在桌前轉身就手就可以碰到後面的門

電腦還OK,據說在某些考場會遇到電腦當機的悲情事件

2個小時半的考試 我寫完大概只剩10幾分鐘了

畢竟沒考過的題目要仔細看,怕有陷阱唄

考完會有說明30分鐘就會寄mail知道成績

不過我是在2天後才收到mail的,大概mail通知也是周休2日吧..

不過成績其實可以上網查,這題外話不多說

心得分享到此為止

最後是...

我考過啦!!! 哈哈

雖然只是JAVA基礎

但考過還是爽的

向809邁進!!

2015年12月3日 星期四

switch 比對支援的型別

switch 比對支援的型別: chart , byte, short, int,
JAVA 5後開始支援: Character, Byte, Short, Integer,
JAVA 7後開始支援: String
還有 enum (列舉其實會被轉換成為int來比較)

Java 會自動import 的package

1. 沒有名字的套件(package with no name)
2.  java.lang
3. 目前所在套件(current package)

抽象類別注意事項:

1.  抽象類別可以實現(implements)介面
2.  抽象類別不能使用 new 建立物件實體(匿名類別不在此列)
3.  抽象類別可以繼承具體類別
4.  抽象類別可以繼承抽象類別
5.  抽象類別內可以沒有抽象方法
6.  子類別在使用父類別抽象方法時一定要覆寫(override)才能使用並實作
7.  抽象方法不可以有{}
8.  抽象方法一定要有abstract關鍵字
9.  抽象方法存取權限不能是private
10.沒有抽象屬性
11.沒有抽象建構子
12.抽象方法不能是static

有個陷阱是
在抽象類別中定義非抽象方法,卻又沒有{},這是不合法的。

2015年11月29日 星期日

字串比較 == 與 equals

在JAVA的字串比較中:
 ==      用來比對是否兩個字串指向同一個物件
equals 用來比對字串內容是否相同

String s1 = "JAVA";
String s2 = "JAVA";
String s3 = new String("JAVA");
String s4 = new String("JAVA");

其中:

s1 == s2  //true 由於物件池的存在 s1與s2的宣告方式 其實會指向同一個字串物件
s1.equals(s2) //true 內容相同
s3 == s1 //false 不同物件
s3.equals(s1) //true 內容相同
s3 == s4 //false 不同物件
s3.equals(s4) //true 內容相同


何謂字串池?

在Java1.4之後,為了提升字串的使用與效能,特別為字串在記憶體中(的Heap區 )建立了一個虛擬的物件池來存放字串。凡是直接指定字串的宣告,如s1與s2,其字串物件都會被放進字串池中。
字串池有個特點就是,相同的字串內容不會被重複建立字串物件,所以上面的s1與s2會是相同的物件,而s3與s4由於並沒有被存放在物件池中,所以實際上是兩個不同的物件。


注意:

由StringBuilder建立的物件是StringBuilder物件不是字串物件,所以不應該直接用equals與字串做比較,一般是使用toString()方法後再與字串比較。

StringBuilder s1 = new StringBuilder("Test");
String s2 = "Test";

其中:

s1 .toString().equals(s2); //true 內容相同

2015年11月18日 星期三

Java的覆寫與遮蔽

當子類別重新定義父類別的方法時稱之為覆寫
當子類別重新定義父類別的屬性時稱之為遮蔽

當子類別物件被轉型為父類別時
使用覆寫的方法時會呼叫子類別中定義的方法
使用遮蔽的屬性時會使用父類別中定義的屬性
但依舊可以在物件內部使用super來使用父類別定義的方法與屬性
 package learning.test;

public class overloadtest {
 public static void main(String[] args) {
  Banana mybanana = new Banana();
  System.out.println(mybanana.name);
  System.out.println(mybanana.getName());
  System.out.println(((Banana) mybanana).name);
  System.out.println(((Banana) mybanana).getName());
  System.out.println(((MyFruit) mybanana).name);
  System.out.println(((MyFruit) mybanana).getName());
 }
}

class MyFruit {
 String name = "Fruit";

 String getName() {
  return name;
 }
}

class Banana extends MyFruit {
 String name = "Banana";

 String getName() {
  return name;
 }
}
輸出:
在程式第10行中將物件轉型為MyFruit型態,其name屬性輸出為Fruit。
在程式第11行中將物件轉型為MyFruit型態,但其getName()方法輸出為Banana。
Banana
Banana
Banana
Banana
Fruit
Banana

2015年11月16日 星期一

JAVA的不定長度引數

1. 格式:function ( type... variableName)
    例: public int test(int... x)

2. 不定長度引數必然為參數列的最後一個參數
    例:  public int test(int x, int... y)  -- 可
    例:  public int test(int... x, int y)  -- 不可

3. 參數列中只能有一個不定長度引數
    例:  public int test(int x, int... y)  -- 可
    例:  public int test(int... x, int... y)  -- 不可

4. JAVA的不定長度引數其實只是編譯器蜜糖,本質是陣列展開。

2015年11月7日 星期六

Java的Stream.reduce()

Java SE8 技術手冊(好書一本) 12-35頁有段程式碼是這頁樣寫的
int sum = employees.stream()
          .filter(employee ->employee.getGender() == Gender2.MALE)
          .mapToInt(Employee2::getAge)
          .reduce((total,age) -> total + age)
          .getAsInt();
該書還有句話是這麼說的,若是reduce()沒有指定初值,就會試著使用該組數據中第一個元素作為第一次呼叫Lambda表示式時的第一個引數值
老實說我第一次看到就想說這樣第一的值不是被重複計算了嗎?
(第一個引數是上次運算結果,第二個引數是目前走訪的元素)
所以查了一下API文件發現,reduce()的作用大概同等於(但不限制為按順序執行。):
     boolean foundAny = false;
     T result = null;
     for (T element : this stream) {
         if (!foundAny) {
             foundAny = true;
             result = element;
         }
         else
             result = accumulator.apply(result, element);
     }
     return foundAny ? Optional.of(result) : Optional.empty();
所以大概可以想成 第一個引數直接指定成該組數據中的第一個元素吧! (如果有的話)
我寫了一個測試程式發現 迭代的第一次確實沒有進去執行reduce中的lambda表示式。
(或許應該說第一次執行時就將該組數據中第一個元素當成lambda表示式的第一個引數,第二個元素當成lambda表示式的第二個引數。)
package learning.test;

import java.util.Arrays;
import java.util.List;

public class StreamTest {
 public static void main(String[] args) {
  List&ltEmployee&gt employees = Arrays.asList(new Employee(10),
    new Employee(20), new Employee(30), new Employee(50));
  int sum = employees.stream().filter(employee -&gt employee.getAge() &gt 10)
    .mapToInt(Employee::getAge).reduce((total, age) -&gt {
     System.out.println("age=" + age);
     System.out.println("total=" + total);
     System.out.println("-----------");
     return total + age;
    }).getAsInt();
  System.out.println(sum);
 }
}

class Employee {
 int age;

 Employee(int a) {
  age = a;
 }

 public int getAge() {
  return age;
 }
}
輸出結果:
age=30
total=20
-----------
age=50
total=50
-----------
100

2015年11月5日 星期四

泛型中的<? super T> <? extends T> 是什麼意思

這裡不在多做解釋泛型了

? super T       代表T及其父類別
? extends T    代表T及其子類別

假設現在有一個Goblin類別繼承Monster類別
那麼你可以這樣實例化:


  List<Goblin> goblinList1= new ArrayList<Goblin>();
  List<Monster> goblinList2= new ArrayList<Monster>();

  List<? super Goblin> goblinList3 =  new ArrayList<Goblin>();
  List<? super Goblin> goblinLis4 =  new ArrayList<Monster>();
  List<? super Goblin> goblinList5 =  new ArrayList<Object>();

  List<? extends Monster> goblinList6 =  new ArrayList<Monster>();
  List<? extends Monster> goblinList7 =  new ArrayList<Goblin>();


......

看一下Java SE8 中 Iterable<T> 介面新增的預設方法,就是這樣宣告的..

forEach(Consumer<? super T> action)

2015年11月2日 星期一

自動產生Java API 文件檔

這超好用
就算不是在寫公用API
也可以寫給自己用
可以自動產生網頁版的API文件
這裡示範一個簡單的用法:

1. 使用 /** --*/ 為程式碼下注解
示範用類別:
package learning.test;

import java.util.ArrayList;

public class InventorySystem {
 /** 道具欄的總格數 */
 int totalGrid;
 /** 物品儲存List */
 ArrayList&ltObject&gt al;

 /** 建構函式 */
 public InventorySystem(int totalGrid) {
  super();
  this.totalGrid = totalGrid;
  al = new ArrayList&ltObject&gt(totalGrid);
 }

 /** 將物品放入道具欄 */
 public static boolean putItem(Object item) {
  return true;
 }

 /** 藉由物品id取得物品 */
 public static Object getItemObjectById(int id) {
  return new Object();
 }

 /** 藉由物品id取得物品數量 */
 public static int getItemNumberById(int id) {
  return 520;
 }
}

2.Eclipse 上選Project -> Generate Javadoc

2015年10月30日 星期五

自動產生hashCode與equals

hashCode與equals 重要嗎??
老實說有時候感覺是個累贅.
但有時候你重要到你不能忽視!~
當你在寫自己的物件時,若物件會被丟進HashMap、HashSet、HashTable中
那hashCode與equals是必然要的。
我知道有人會逃避...因為書上寫得很複雜..
但其實不用..
交給Eclipse 自動產生就好
自動產生hashCode與equals
Eclipse自動產生hashCode與equals


 選擇要加入的屬性按下OK

2015年10月28日 星期三

列舉與Switch

package learning.test;
public class myenum1 {
public enum week{Sundau,Monday,Tuesday}
public enum Month{Sundau,Monday,Tuesday}
public static void main(String[] args){
 week ww=week.Monday;
 switch (ww){ // 若switch 對象型態為 week
 case Monday: // 則case只能是week 中定義的值, 也不能寫成week.Monday
  System.out.println("Monday");
  break;
 case Tuesday:
  System.out.println("Tuesday");
  break;
 default:
  break;
 }
 if(week.Monday.toString()=="Monday"){
 
 }
}
}