2015年10月5日 星期一

JAVA SL-275_10/04

JAVA SL-275_10/04
Date: 10/04

List
作用是收集物件,並以索引益式保留收集的物件順序。
ArrayList
在陣列中的排序使用可以得到較快的速度,
如果是需要調整索引順序時,則會有較差的表現。

LinkedList
在實作 List 介面時,採用了 (Link) 結構。
first > Object  > Object  > Object
next   next   next
Node   Node   Node
如果要指定索引隨機存取物件時,不建議用 LinkedList,其每次存取都會從頭 (first ) 開始,
但若只是調整索引順序,從還是可以使用 LinkedList。
//================================================================//
支援佇列操作的 Queue
繼承自 Collection,所以它也具有 Collection 的 add(), remove(), element() 等方法。
一操作失敗時,會拋出例外

Queue 定義了自己的 offer(), poll(), pee,() 等方法。
一操作失敗時會傳回特定值

offer() 用來在佇列後端加入物件
 成功→True, 失敗→false

poll() 取出佇列前端物件,若佇列為空則傳回 null.

peek() 取得(但不取出)佇列前端物件,若佇列為空則傳回 null.
//================================================================//
想對佇列的前端與尾端進行操作,在前端加入物件與取出物件,在尾端加入與取出物件, Queue 的子介面 Deque 就定義了這類行為。

addFirst(), removeFirst(), getFirst().
addLast(), removeLast(), getLast().
操作失敗時會傳回例外

offerFirst(), pollFirst(), peekFirst().
offerLast(), pollLast(), peekLast().
操作物敗時會傳回特定值
//================================================================//
排序收集的物件
java.util.Collection 提供有 sort() 方法,由於必須有索引才能進行排序,
因此 Collection 的 sort() 方法接受 List 實作的物件。

//================================================================//

//================================================================//
//MapDemo.java
import java.util.*;


public class MapDemo {
 public static void main(String args[]){
  HashMap t = new HashMap();
  t.put("A", "SCJP");
  t.put(new Integer(100),new Integer(200));
  t.put(new Object(),"SCBCD");
  t.put(null, null);
  System.out.println(t.toString());
  System.out.println("keyA:"+t.get("A"));
  System.out.println("keyB:"+t.get("B"));
 }
}
//================================================================//
//取間值
import java.util.*;
import java.util.Map.Entry;

public class MapkeyValue {
 public static void main(String args[]){
  Map<String,String> map = new TreeMap<>();
  map.put("one","一");
  map.put("two","二");
  map.put("three","三");
  foreach(map.entrySet());
  }
 private static void foreach(Iterable<Map.Entry<String,String>>iterable){
   for(Map.Entry<String, String> entry:iterable){
    System.out.printf("鑑%s 值%s %n", entry.getKey(), entry.getValue());
  }
 }
}
//================================================================//
//Message.java
import java.util.Map;
import java.util.Scanner;
import java.util.*;

public class Messages {
 public static void main(String args[]){
  Map<String,String> messages = new HashMap<>();
  messages.put("Justin","Hello Justin的訊息");
  messages.put("Monic","給Monic的禮物");
  messages.put("Irene","Irene的喵喵叫");
  Scanner scanner = new Scanner(System.in);
  System.out.print("取得誰的訊息");
  String str = messages.get(scanner.nextLine());
  System.out.println(str);
  System.out.println(messages);
 }
}
//================================================================//
//NewClass.java
import java.util.*;

public class NewClass {
 public static void main(String args[]){
  Queue q = new LinkedList();
  q.offer("First");
  q.offer("Second");
  q.offer("Third");
  Object o;
  System.out.println(q.toString());
  
/*  while((o = q.poll()) != null){
   String s = (String)o;
   System.out.print(s+" ");
  }*/
  while((o = q.peek()) != null){  //跑無窮迴圈
   String s = (String)o;
   System.out.print(s+" ");
   q.remove(); 
  }
  System.out.println(q.toString());
 }
}

//================================================================//
//QueueDemo.java
import java.util.*;

public class QueueDemo {
 public static void main(String args[]){
  Queue<String> q = new LinkedList<String>();
  q.offer("SCJP");
  q.offer("SCWCD");
  q.offer("SCBCD");
  System.out.println(q.toString()+" ");
  Iterator a = q.iterator();
  while(a.hasNext()){
   String s = (String)a.next();
   System.out.print(s+" ");
  }
 }

}
//================================================================//
//RequestQueue.java
import java.util.*;

interface Request{
 void execute();
}


public class RequestQueue {
 public static void main(String args[]){
  Queue requests = new LinkedList();
  //模擬請求加入佇列
  for(int i=1;i<6 execute="" i="" math.random="" n="" new="" null="" pre="" private="" process="" public="" request.execute="" request="(Request)requests.poll();" requests.offer="" requests.peek="" requests="" s="" static="" system.out.printf="" ueue="" void="" while="">
//================================================================//

練習:
Link.java、LinkDemo.java、SimpleLinkedList.java

//Link.java.java

class Link{
 private class Node{
  Object o;
  Node next;
  Node(Object o){
   this.o=o;
  }
 }
 
 private Node first;
 
 public void add(Object o){
  Node last;
  
  if(first==null){
   first=new Node(o);
  }
  else{
   last=first;
   while(last.next!=null){
    last=last.next;
   }
   last.next=new Node(o);
  }
 }
 
 public Object get(int index){
  int size=size();
  if(index>=size){
   throw new IndexOutOfBoundsException(String.format("Index:%d, size:%d",index,size));
  }
  int count=0;
  Node last=first;
  while(count<index){
   last=last.next;
   count++;
  }
  return last.o;
 }
 
 public int size(){
  if(first==null)
   return 0;
  
  Node last=first;
  int count=1;
  while(last.next!=null){
   last=last.next;
   count++;
  }
  return count;
 }
}
//LinkDemo.java
public class LinkDemo {
 public static void main(String args[]){
  Link l = new Link();
  String s0 = "hello-0";
  String s1 = "hello-1";
  String s2 = "hello-2";
  String s3 = "hello-3";
  l.add(s0);
  l.add(s1);
  l.add(s2);
  l.add(s3);
  System.out.println(l.size());
  System.out.println((String)l.get(3));
  System.out.println((String)l.get(0));
 }

}
//SimpleLinkedList.java
public class SimpleLinkedList {
 private class Node{
  //將收集的物件用/vode封裝
  Node(Object o){  
   this.o=o;
  }
  Object o;
  Node next;
 }
 private Node first; //第一個節點
 public void add(Object o){ //新增一個Node封裝物件,並由上一個o Node物件參考
  if(first == null){
   first=new Node(o);
  }
  else{
   Node last = first;
   while(last.next != null){
    last=last.next;
   }
   last.next=new Node(o);
  }
 }
 public int size(){ //走訪所有Node計數並取得長度
  int count=0;
  Node last=first;
  while(last.next != null){
   last=last.next;
   count++;
  }
  return count;
 }
  public Object get(int index){ //走訪所有Node計數並取得對應索引順序
   int size=size();
   if(index > size){
    throw new IndexOutOfBoundsException(
      String.format("Index: %d,Size: %d", index, size));
   }
 
  int count=0;
  Node last=first;
  while(count < index){
   last=last.next;
   count++;
  }
  return last.o;
 }
}
//================================================================//
import java.util.*;
class Account implements Comparable{
 private String name;
 private String number;
 private int balance;
 Account(String name,String number,int balance){
  this.name=name;
  this.number=number;
  this.balance=balance;
 }
 public String toString(){
  return String.format("Account(%s %s %d)",name,number,balance);
 }
 
 public int comparTo(Object o){
  Account other=(Account)o;
  return this.balance-other.balance;
 }
 @Override
 public int compareTo(Object o) {
  // TODO Auto-generated method stub
  return 0;
 }
}
public class Sort2 {
 public static void main(String arg[]){
  List accounts=Arrays.asList(
  new Account("Justin","x1234",1000),
  new Account("Monic","x5678",500),
  new Account("Irene","x2345",100)
  );
  Collections.sort(accounts);
  System.out.println(accounts);
 }
}
//================================================================//
//Stack.java
import java.util.*;

public class Stack {
 private Deque deque = new ArrayDeque();
 private int capacity;
 public Stack(int capacity){
  this.capacity=capacity;
 }

 public boolean push (Object o){
  if(deque.size()+1 > capacity){
   return false;
  } 
  return deque.offerLast(o);
 }
 public Object pop( ){
  return deque.pollLast();
 }
 public Object peek(){
  return deque.peekLast();
 }
 public int size(){
  return deque.size();
 }
 public static void main(String args[]){
  Stack stack = new Stack(4);
  stack.push("Justin");
  stack.push("Lisa");
  stack.push("John");
  System.out.println(stack.pop());
  System.out.println(stack.peek());
  System.out.println(stack.size());
 }
}
//================================================================//

2015年9月20日 星期日

JAVA SL-275_09/20

/*
join
如果 A 執行緒正在運行,流程中允許 B 執行緒加入,等到 B 執行緒執行完畢再繼續 A 執行緒流程就可以使用 join() 方法完成需求,當執行緒使用 join() 加入至另一執行緒時,另一執行緒會等待被加入的執行緒工作完畢然後再續繼它的動作。
*/

//*****************************************************************************
//joinDemo.java

public class joinDemo{

        public static void main(String args[]){

                System.out.println("Main thread 開始…");
                Thread threadB = new Thread(){
                        public void run(){
                                try{
                                        System.out.println("Thread B 開始…");
                                        for(int i=0;i<5 ain="" b="" catch="" e.printstacktrace="" e="" ex.printstacktrace="" ex="" hread="" i="" main="" nterruptedexception="" pre="" s="" system.out.println="" thread.sleep="" thread="" threadb.join="" threadb.start="" try="">
//*****************************************************************************

/*

Thread Group

每個執行緒都屬於某個執行緒群組,可以使用以下程式片段取得目前執行緒所屬的執行緒群組。

Thread.currentThread().getThreadGroup().getName();

可以自行指定執行緒群組,執行緒一旦加入,即無法更改群組。



java.lang.ThreadGroup 可以管理群組中的執行緒。

*/

//*****************************************************************************

//ThreadGroupDemo.java
public class ThreadGroupDemo {
        public static void main(String args[]){

                ThreadGroup tg1 = new ThreadGroup("tg1");
                Thread t1 = new Thread(tg1, new Runnable(){
                        public void run(){
                                throw new RuntimeException("t1 測試例外");
                        }
                },"tg1");

                t1.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
                        public void uncaughtException(Thread t, Throwable e) {
                                System.out.printf("%s ... %s%n", t.getName(), e.getMessage());
                        }
                });

                Thread t2 = new Thread(tg1, new Runnable(){                             
                        public void run(){
                                throw new RuntimeException("t2 測試例外");
                        }
                },"tg2");

                t1.start();
                t2.start();
        }
}
//***************************************************************************** // 兩執行緒同時間點別相同的方法,會出現競速狀態出現 Error // 下例的 Error: Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException // java.lang.OutOfMemoryError 先不管它,此處為了探討競速物件。
import java.util.Arrays;

public class ArrayList {
        private Object[] list;
        private int next;
        public ArrayList(int capacity){
                list = new Object[capacity];
        }
        public ArrayList(){
                this(16);
        }

        public void add(Object o){
                //System.out.println("add start...");
                if(next == list.length){
                        list = Arrays.copyOf(list, list.length * 2);
                }
                list[next++]=o;
        }
        public Object get(int index){
                return list[index];
        }
        public int size(){ 
                return next;
        }
        public static void main(String args[]){
                ArrayList list = new ArrayList();
                Thread t1 = new Thread(){
                        public void run(){
                                while(true){
                                        list.add(1);
                                }
                        }
                };
                Thread t2 = new Thread(){
                        public void run(){
                                while(true){
                                        list.add(2);
                                }
                        }
                };
                t1.start();
                t2.start();
        }
}
//----------------------------------------------------------------------------------------------- // 同上範例,加入 synchronized 除掉競速問題 // 同樣會有  java.lang.OutOfMemoryError 此處不管它 import java.util.Arrays; public class ArrayList {  private Object[] list;  private int next;  public ArrayList(int capacity){   list = new Object[capacity];  }  public ArrayList(){   this(16);  }  synchronized public void add(Object o){   if(next == list.length){    list = Arrays.copyOf(list, list.length * 2);   }   list[next++]=o;  }  public Object get(int index){   return list[index];  }  public int size(){   return next;  }  public static void main(String args[]){   ArrayList list = new ArrayList();     Thread t1 = new Thread(){    public void run(){     while(true){      synchronized(list){           list.add(1);       System.out.println(list.get(list.size()-1));      }     }    }   };   Thread t2 = new Thread(){    public void run(){     while(true){        synchronized(list){       System.out.println(list.get(list.size()-1));       list.add(2);      }     }    }   };    t1.start();    t2.start();    } } //***************************************************************************** /* synchronized 與 volatile 在 Java 中對資可見性的要求,可以使用 volatile 達到,在變數上宣告,表示變數是不穩定的是易變的,也就是可能在多執行緒下存取,可保證變數的可見性,也是是若執行緒變動了變數值,另一執行緒一可以看到變更。 不允許執行緒快取,變數的存取是在共享記憶體中進行。 */ //***************************************************************************** // 寫一個練習,分為四個檔案: // Producer.java package java_0920; public class Producer implements Runnable {  private Clerk clerk;  public Producer(Clerk clerk){   this.clerk = clerk;  }  public void run(){   System.out.println("生產者開始生產…");   for(int product=1;product<=10;product++){    try{     Thread.sleep((int)(Math.random()*3000));    }catch(InterruptedException ex){     throw new RuntimeException(ex);    }    clerk.setProduct(product);   }  } } //Consumer.java package java_0920; public class Consumer implements Runnable {  private Clerk clerk;  public Consumer(Clerk clerk){   this.clerk = clerk;  }  public void run(){   System.out.println("消費者開始消費…");   for(int i=1;i<=10;i++){    try{     Thread.sleep((int)(Math.random()*3000));    }catch(InterruptedException ex){     throw new RuntimeException(ex);    }    int product = clerk.getProduct();   }  } } //Clerk.java package java_0920; public class Clerk {  private int product = -1 ;    public synchronized int getProduct() {   while(this.product != -1){    try{     wait();    }catch(InterruptedException e){     throw new RuntimeException(e);    }   }   int p = this.product;   System.out.printf("消費者取得…(%d)%n",this.product);   this.product=-1;   notify();   return p;  }  public synchronized void setProduct(int product) {   while(this.product != -1){    try{     wait();    }catch(InterruptedException e){     throw new RuntimeException(e);    }   }   this.product = product;   System.out.printf("生產者設定…(%d)%n", this.product);   notify();  } } //ProducerConsumerDemo.java package java_0920; public class ProducerConsumerDemo {  public static void main(String args[]){   Clerk clerk = new Clerk();   new Thread(new Producer(clerk)).start();   new Thread(new Consumer(clerk)).start();  } } //***************************************************************************** /* Collection 集合架構介面關係圖 ※可動態產生集合元素 可置入不同型別的資料,依照各集合的特性有:排序性、順序性、不允許重複、是否有鍵值的使用。 <String, Integer> 泛型 public interface Set implements Collection 其特性是無順序性,並且元素與元素之間不得重複。 其利用 equal() 方法來判斷加入的物件是否重複,Set 是資料具唯一性但無順序性的集。 ※ 不是用 equals (用於比較字串) */ //***************************************************************************** //HashSet //沒有順序性 (擺放位置是根據 hashCode) 不允許重複 import java.util.*; public class HashSetDemo {  public static void main(String argsp[]){   HashSet<String> s = new HashSet<String>();   s.add("SCJP");   s.add("SCWCD");   s.add("SCBCD");     Iterator i = s.iterator();   while(i.hasNext()){    String str = (String)i.next();    System.out.println(str + " ");   }  } } //***************************************************************************** //練習:重複輸入的資料只顯示一個 import java.util.*; public class HashSetDemo2 {  public static void main(String args[]){   Set<String> words = new HashSet<String>();   Scanner scanner = new Scanner(System.in);   System.out.println("Input english word:");   String line = scanner.nextLine();   String tokens[] = line.split(" ");   for(String token:tokens){    words.add(token);   }     System.out.printf("不重複的單字有(%d)個 %s%n", words.size(), words);    } } //執行後自己手動輸入單字,以空白隔開,會自動過濾並顯示出不重複單字。 //***************************************************************************** import java.util.*; class Student {  private String name;  private String number;  Student(String name, String number){   this.name=name;   this.number=number;  }  public String toString(){   return String.format("(%s %s)", name, number);  } } public class StudentDemo{  public static void main(String args[]){   /*   Set<String> set = new HashSet<String>();   set.add(new Student("Justin", "B6789").toString());   set.add(new Student("Monica", "B8765").toString());   set.add(new Student("Joe", "B213678").toString());   */   Set set = new HashSet();   set.add(new Student("Monica", "B8765"));   set.add(new Student("Justin", "B6789"));   set.add(new Student("Joe", "B213678"));       System.out.println(set);  } }

2015年9月13日 星期日

JAVA SL-275_09/13

/*
‧使用 finally
無論 try 區塊中有無發生例外,若撰寫有 finally 區塊,則 finally 區塊一定會執行,如果程式撰寫的流程中先 return 了,而且也有寫 finally 區塊,那 finally 區塊會先執行完後,再將值傳回。

try{
 do something…
}catch{
 do something…
}finally{   // Always 會執行,且優先過 try-cache
 ….
}

可以允許的程式寫法:
try-cache
try-finally
try-cache-finally

錯誤的寫法:
catch finally
*/
/****************************************************************************** /
public class FinallyDemo{
        public static int test(boolean flag){
                try{
                        if(flag){
                                return 1;
                        }
                }finally{
                        System.out.println("finally...");
                }
                return 0;
        }
        public static void main(String args[]){
                System.out.println(test(true));
        }
}
/****************************************************************************** /*
/*
java.lang.AutoCloseable 介面
JDK 7 新增了自動關閉資源語法可用的套件,必須實作 java.lang.AutoCloseable 介面,其僅定義了 close() 方法。
package java.lang.*;

public interface AutoCloseable{
 void close() throws Exception;
}
*/

/*
執行序流程圖

---

執行序的執行狀態:
起始狀態
Thread t = new Thread();

可執行狀態
Thread t = new Thread();
t.start();  t.yield();

執行狀態
實作 Runnable 介面
繼承 Thread 類別
public void run(){
……
}

非可執行狀態
Thread t - new Thread();
sleep().wait().suspend();

結束狀態
stop()
正常結束

*/
/******************************************************************************/
public class ThreadDemo{
        public static void main(String args[]){
                System.out.println("Hello Java 測試");
                String str = Thread.currentThread().getName();
                System.out.println("Thread name: " + str);
                System.out.println(Thread.activeCount());
        }
}
/******************************************************************************/
// 練習 Thread 寫龜兔賽跑
public class TortoisHareDemo{
 public static void main(String args [])throws InterruptedException{
  boolean flags[]={true,false};
  int totalStep=10;
  int tortoiseStep=0;
  int hareStep=0;
  System.out.println("龜兔賽跑開始…");
  while(tortoiseStep < totalStep && hareStep <totalStep){
   Thread.sleep(1000);
   tortoiseStep++;
   System.out.printf("烏龜跑了 %d 步…%n", tortoiseStep);
   boolean isHareSleep=flags[((int)(Math.random()*10))%2];
   if(isHareSleep){
    System.out.println("兔子睡著了…zzz");
   }else{
    hareStep+=2;
    System.out.printf("兔子跑了 %d 步…%n", hareStep);
   }
  }
 }
}
//------------------------------------------------------------------------------------
// 練習 Thread 寫龜兔賽跑,拆開來寫成三個檔案:
// Hare.java
public class Hare implements Runnable{
 private boolean[] flags = {true,false};
 private int totalStep;
 private int step;
 public Hare(int totalStep){
  this.totalStep=totalStep;
 }
 public void run(){
  try{
   while(step<totalStep){
    Thread.sleep(1000);
    boolean isHareSleep = flags[((int)(Math.random()*10))%2];
    if(isHareSleep){
     System.out.println("兔子睡著了...");
    }
    else{
     step +=2;
     System.out.printf("兔子跑了 %d 步…%n", step);
    }
   }
  }catch(InterruptedException ex){
   throw new RuntimeException(ex);
  }
 }
}
//------------------------------------------------------------------------------------
//TortoiseHareRace.java

public class TortoiseHareRace{
        public static void main(String args[]){
                Tortoise t = new Tortoise(10);
                Hare h = new Hare(10);
                Thread tortoiseThread = new Thread(t);
                Thread hareThread = new Thread(h);
                tortoiseThread.start();
                hareThread.start();
        }
}
/******************************************************************************/
// 實作 Thread 類別
class HelloThread extends Thread{
 HelloThread(String str){
  super(str);
 }
 public void run(){
  for(int i=0;i<1000;i++){
   String s = Thread.currentThread().getName();
   System.out.println(s +" : " + i);
  }
 }
}
public class TestThread{
 public static void main(String args[]){
  HelloThread h =new HelloThread("Monic");
  h.start();
 }
}
/*
※ 實作 Runnable 介面,好處是有彈性,還有機會繼承其它類別 繼承 Thread 類別,通常是為了直接利用 Thread 類別中的一些方法才會直接繼承 Thread 類別
*/ /******************************************************************************/
/*
執行序有其優先權,可用 Thread 類別底下的 setPriority() 方法設定優先權,可設定值為 1~10,預設是 5 如果超出 1~10 以外的設定值會拋出 IllegalArgnmentException,數字越大優先權愈高,越優先排入;cpu 若相同,則輪流執行。
*/
// PersonDemo.java

class Person extends Thread{
        Person(String str){
                super(str);
        }
        public void run(){
                String name=Thread.currentThread().getName();
                int priority = Thread.currentThread().getPriority();
                Thread.State state = Thread.currentThread().getState();
                System.out.println( name + "優先序─ " + priority + ",狀態─ " + state);
                for(int i=1;i<=10;i++){
                        System.out.println(name + "跑完第" + i + "圈");
                        if(name.equals("Ken") && i%3==0 ){
                                System.out.println(name + "休息 1 秒…");
                        }
                        try{
                                Thread.sleep(1000);
                        }catch(InterruptedException ex){
                                ex.printStackTrace();
                        }
                }
        }
}

public class PersonDemo{

        public static void main(String args[]){

                Person p1 = new Person("Ron");
                Person p2 = new Person("Ken");
                p1.start();
                p2.start();
                System.out.println("正在執行的執行序:" + Thread.activeCount());
        }
}
/******************************************************************************/
 /*
 有幾種狀況會讓執行序進入 Blocked 狀態:
 呼叫 Thread.sleep() 方法 進入 synchronized 前競爭物件鎖定的阻斷 呼叫 wait() 的阻斷 等待 input/output 完成 一個進入 Blocked 狀態的執行序可由另一個執行序呼叫該執行序的 interrupt() 方法,讓它離開 Blocked 狀態。 
*/
 /******************************************************************************/
// 比較 synchronized  同步
// 無同步
class Company{
        static int sum=0;
        static void add(int n){
                int tmp=sum;
                tmp+=n;
                try{
                        Thread.sleep(1000);
                }catch(InterruptedException e){}
                sum=tmp;
                String name=Thread.currentThread().getName();
                System.out.println("執行緒:" + name + ",存款為:" + sum);
        }
}
class Ccompany extends Thread{
        Ccompany(String str){
                super(str);
        }
        public void run(){
                for(int i=1;i<=3;i++)
                Company.add(100);
        }
}

public class SynchronizedDemo1{
        public static void main(String args[]){
                Ccompany c1 = new Ccompany("Ron");
                Ccompany c2 = new Ccompany("Ken");
                c1.start();
                c2.start();
        }
}
/* 輸出結果:  */ //----------------------------------------------------------------------------
// 加入同步
class Company{
        static int sum=0;
        synchronized static void add(int n){
                int tmp=sum;
                tmp+=n;
                try{
                        Thread.sleep(1000);
                }catch(InterruptedException e){}
                sum=tmp;
                String name=Thread.currentThread().getName();
                System.out.println("執行緒:" + name + ",存款為:" + sum);
        }
}
class Ccompany extends Thread{
        Ccompany(String str){
                super(str);
        }
        public void run(){
                for(int i=1;i<=3;i++)
                Company.add(100);
        }
}

public class SynchronizedDemo{
        public static void main(String args[]){
                Ccompany c1 = new Ccompany("Ron");
                Ccompany c2 = new Ccompany("Ken");
                c1.start();
                c2.start();
        }
}
/* 輸出結果:  */ /******************************************************************************/
//wait
class Company{
        static int sale = 0;
        synchronized static void add(int n){
                String name = Thread.currentThread().getName();
                int sum = sale;
                sum = sum + n;
                System.out.println(name + "銷售量" + n + ",公司銷售量:" + sum);
                sale=sum;
        }
}

class Ccompany extends Company implements Runnable{
        private String id;
        public Ccompany(String id){
                this.id=id;
        }
        public void run(){
                for(int i=1;i<=10;i++){
                        Company.add(i);
                        if(sale > 5){
                                System.out.println("庫存量超過 5,停止生產…");
                                try{
                                        wait();
                                }catch(InterruptedException e){
                                        System.out.println("繼續生產...");
                                }
                        }
                }
        }

}

public class WaitDemo{

        public static void main(String args[]){
                Thread s1 = new Thread(new Ccompany("S 分店"),"C 分店");
                Thread s2 = new Thread(new Ccompany("S2 分店"),"C2 分店");
                s1.start();
                s2.start();
                //s2.interrupt();
        }
}

2015年9月6日 星期日

JAVA SL-275_09/06



/*
‧匿名內部類別:簡單的說就是沒有宣告名稱的類別,直接以 {....} 來實作的類別程式碼。
*/

// 利用匿名內部類別來實作 interface
// Anomouse.java

interface Pet{
        String attr="aute";
        void skill();
        void move();
}

public class Anomouse{
        public static void main(String args[]){
                Pet p = new Pet(){              //無 ;
                        public void skill(){
                                System.out.println("拎拖鞋");
                        }
                        public void move(){
                                System.out.println("移動");
                        }
                };
                p.skill();
                p.move();
        }


其中,編譯完後,會出現 Anomouse$1.class 匿名內部類別,其內容包含:
 Pet p = new Pet(){              //無 ;
                        public void skill(){
                                System.out.println("拎拖鞋");
                        }
                        public void move(){
                                System.out.println("移動");
                        }
                };
若有 n 個內部類別則會以 $流水號 來依序往後排。


/*
靜態內部類別:是在宣告時加上 static ,使其物件實體配置在記憶體 Global 區塊中。
*/

class MyOuter{
        static class MyStatic{
                public void fooA(){
                        System.out.println("Hello" + "no static");
                }
                public static void fooB(){
                        System.out.println("Hello" + " static method");
                }
        }
}

public class StaticInnerClass{
        public static void main(String args[]){
                MyOuter.MyStatic f = new MyOuter.MyStatic();
                f.fooB();
                f.fooA();
                MyOuter.MyStatic.fooB();  //配置為 static 才可以直接執行!
        }
}

/***************************************************************************************************/


‧try-catch ‧Bug 的分類: 程式語法上的錯誤。 執行時期的錯誤 ex:陣列元素索引值超出最大範圍 or 整數除以 0 邏輯的錯誤。 try{ // do something… }catch(Exception e){ // do something…(通常在這做堆疊追蹤) } Java 中用依處理錯誤的類別:Throwable, Error, Exception Error → 指的是系統本身發出的錯誤訊息,也有可能是程式所造成。 Exception → 是一個不正常的程式在執行時期所觸發的事件。 Throwable → 為 Error, Exception 的父類別,若其無法處理,則再往上丟給 JVM 處理。
JVM → Throwable → Error   Exception
try 撰寫時可將容易發生錯誤的程式碼 package 在 try 中。 catch 產生錯誤事件時,catch 進行攔截,並執行此區塊內程式碼。 */ /* ※Exception 大多放在 Input/Ouput 位置,若一開始不知道要放什麼類型的 exception, 則可以先讓程式去 run,看它出現什麼錯誤訊息。 以下為例:

public class Test{

       public static void main(String args[]){

               int arr[] = new int[5];

               arr[10] = 7;

               System.out.println("end of main method");

       }

}

故意讓它 run 出錯誤訊息,再加到 try-catch 中:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
       at Test.main(Test.java:4))
*/

public class Test{
        public static void main(String args[]){
                try{
                int arr[] = new int[5];
                arr[10] = 7;
                }catch(ArrayIndexOutOfBoundsException e){
                        System.out.println("catch to Exception");
                        System.out.println("Exception:" + e);
                        System.out.println("e.Message:" + e.getMessage());
                }
                System.out.println("end of main method");
        }
}

// Average.java
import java.util.*;

public class Average{
        public static void main(String args[]){
                Scanner scanner = new Scanner(System.in);
                double sum = 0 ;
                int count = 0;
                int number = 0 ;
                System.out.println("Key Integer Num. (exit:0):");
                while(true){
                        try{
                                number = scanner.nextInt();
                                if(number == 0 ){
                                        break;
                                }
                                sum += number ;
                                count++;
                        }catch(InputMismatchException e){
                                System.out.println("Error:Input is Integer.");
                                System.out.println("Exception Message:" + e);
                                break;
                        }
                }
                System.out.printf("平均:%.2f%n", sum/count);
        }
}


//例外繼承架構:

try{

do something…

}catch(IOException e ){ //直系子類別

e.printStackTrace();

}catch(InterruptedException e){

e.printStackTrace();
}catch(ClassCastException e){ //直系父類別
e.printStackTrace();
}

/*******************************************************************************************/

// Java 7.0 之後 → 多重捕捉 multi-catch

try{

do something…

}catch(IOException | InterruptedException | ClassCastExeption e){

e.printStackTrace(); //堆疊追蹤

}

※左邊的例外不得是右邊的父類別!

/*******************************************************************************************/

/*

‧利用 throw 丟出例外

throw 用來呼叫或傳遞一個例外,所以可以利用它在程式中觸發一個例外

*/
  1. throw 例外物件變數 →丟出一個例外物件變數
  2. throw new Exception(錯誤訊息字串) →丟出一個匿名的例外物件
/*******************************************************************************************/
// FileUtil.java
import java.io.*;
import java.util.*;

public class FileUtil{
        public static String readFile(String name)
        throws FileNotFoundException{
                StringBuilder builder = new StringBuilder();
                try{
                        Scanner scanner = new Scanner(new FileInputStream(name));
                        String text = null;
                        while(scanner.hasNext()){
                                builder.append(scanner.nextLine());
                                builder.append('\n');
                        }
                }catch(FileNotFoundException ex){
                        ex.printStackTrace();
                        throw ex;
                }
                return builder.toString();
        }
}
// Demo.java
import java.io.*;

public class Demo{
        public static void main(String args[])
        throws Exception{               // 宣告方法中拋出例外
                System.out.println(FileUtil.readFile("C:\\java\\0906\\Main.java"));
        }
        public static void doSome(String arg)
        throws FileNotFoundException, EOFException{
                try{
                        if("one".equals(arg)){
                                throw new FileNotFoundException();
                        }else{
                                throw new EOFException();
                        }
                }catch(IOException ex){
                        ex.printStackTrace();
                        throw ex;       // 執行時拋出例外
                }
        }
}

//---------------------------------------------------------------------

// 自訂路徑(要同 Demo.java 截取檔案路徑),

隨便編寫內容。 例: C:\java\0906\Main.java

Lccnet
/*******************************************************************************************/
/* 編譯出 .jar 執行檔 */ A. 以 eclipse 軟體 a. File > New > Java Project > TEST b. “TEST/src” 右鍵 > New > Class > Main3 (勾選 public static void….) import javax.swing.*; public class Main3 { public static void main(String[] args) { String s = JOptionPane.showInputDialog("Input number"); JOptionPane.showMessageDialog(null, s); } } c. 對 “TEST” 右鍵 > Export > Java > Runnable JAR file B. 以指令 jar a. 編寫檔案 Main3.java ,內容同上。 b. 編譯出 Class檔:javac Main3.java c. jar cfe myJRE.jre Main3 Main3.class

/*******************************************************************************************/
// 堆疊處理
// Main.java

public class Main {

 public static String a(){
  String text =null;
  return text.toUpperCase();
 }
 public static void b(){
  a();
 }
 public static void c(){
  try{
   b();
  }catch(NullPointerException e){
   e.printStackTrace();
   Throwable t = e.fillInStackTrace();
   throw(NullPointerException) t;
  }
 }
 public static void main(String[] args) {
  try{
   c();
  }catch(NullPointerException ex){
   ex.printStackTrace();
  }
 }
}

/*******************************************************************************************/

/*

‧ Assert 斷言

assert boolean_expression;

assert boolean_expression:detail_expression;
boolean_expression 若為 true 則什麼事都不會發生;
若為 false 則會發生 java.lang.AssertionError;
*/
//----------------------------------------------------------------------------
// AssertDemo.java

public class AssertDemo{
        final int ACTION_STOP=0;
        final int ACTION_RIGHT=1;
        final int ACTION_LEFT=2;
        final int ACTION_UP=3;

        public static void main(String args[]){
                new AssertDemo().play(0);
                new AssertDemo().play(1);
                new AssertDemo().play(2);
                new AssertDemo().play(3);
//              new AssertDemo().play(5);
                new AssertDemo().testScore(0);
                new AssertDemo().testScore(100);
                new AssertDemo().testScore(-1);
        }

        public void testScore(int score){
                assert(score >= 0 && score <= 100):"成績錯誤";
                System.out.println("score = " + score);
                assert(score >= 0 && score <= 100):"成績錯誤";
                System.out.println("score = " + score);
        }

        public void play(int action){
                switch(action){
                case ACTION_STOP:
                        System.out.println("停止撥放");
                        break;
                case ACTION_RIGHT:
                        System.out.println("向右撥放");
                        break;
                case ACTION_LEFT:
                        System.out.println("向左撥放");
                        break;
                case ACTION_UP:
                        System.out.println("向上撥放");
                        break;
                default:
                        assert false : "非定義的常數";
                }
        }
}
/* ※注意,編譯完執行要加 -ea 參數啟用Assertion
javac AssertDemo.java
java -ea AssertDemo
*/
/*******************************************************************************************/

2015年9月1日 星期二

Vim 大量註解

由於在改一些設定檔,或者在coding時,需要大量註解就很麻煩。


1. 在 vim 加上註解:

a. 將游標移到要開始註解那一列。
b. 然後按下 Esc ,在按下 Ctrl + V,及變成區塊模式(反白)。
c. 將由標下移至要註解的最後一列。
d. 按下大寫 "I" ,游標跑回步驟 (b) 的那一列了,這時就可以直接輸入要用的註解了,假設輸入'//'。
e. 按下 Esc,即可。(注意:記得按下 Esc )

2. 在 vim 取消註解:

a. 方法和加上多行註解一樣,先將游標移到開始註解的那一列。
b. 按下 Esc ,然後按下 Ctrl + V ,切換成區塊選取的模式。
c. 將游標向下移到要加上註解的最後一列,再按左、右的方向鍵,將要delete掉的註解都反白。
d. 按下 delete,即可。


References: http://www.study-area.org/tips/vim/