Date: 12/20
/================================================/
DAO(Data Access Object)資料存取物件
主要的功能是資料操作,屬於資料層的操作
client → JSP/Servlet → BO → DAO → Database
客戶層 顯示層 業務層 資料層 資源層
client → B/S開發架構,大都以Browser進行存取
顯示層 → 以JSP/Servlet進行頁面效果的顯示
Business Object→ 將多個最小的DAO進行組合變成一個業務邏輯--> BO
DAO→ 提拱多個最小性的DAO操作,例如新增刪除、修改
/================================================/
DAO → 由以下幾個部分組成:
Database Connection → 負責資料庫的開啟與關閉 (xxx.dbc.DatabaseConnection)
VO → 主要是屬性,setter、getter方法組成,與欄位相對應,每一個VO的組成都對應到一條記錄 (like JavaBean)
DAO → 定義操作的介面,新增、刪除、修改、按ID查詢等 (xxx.dao.ImplDAO)
Impl → DAO介面的真實實歸類別,完成實際的資料庫操作不負責開啟和關閉(xxx.dao.xxxImplDAO)
Proxy → 代理實現類別,完成資料庫的開啟和關閉 (xxx.dao.xxxDAOProxy)
Factory → 工廠類別,透過他取得一個DAO產生的實體物件 (xxx.factor.DAOFactory)
/================================================/
組成: 註冊系統 --> 將資料存到架設好的mySQL建表
1. index.jsp、emp_list.jsp、insert_success.jsp
2. com.demo => DatabaseConnection.java、Emp.java、IEmpDAO.java、IEmpDAOImpl.java、EmpDAOProxy.java、DAOFactory.java
3. com.dome.dbc => DatabaseConnection.java、MySQLDatabaseConnection.java
lifelong learning and ongoing creation
2015年12月21日 星期一
2015年12月17日 星期四
JAVA SL-314_12/13
JAVA SL-314_12/13
Date: 12/13
/======================================================/
<jsp:useBean>
與 import 功能相同
<jsp:useBean id=”產生的實體物件” scope="儲存範圍" class=”套件.class name” />
※ scope => 表示這個物件的儲存範圍,一共有四個屬性: page, request, session, application
/======================================================/
<jsp: setProerty>
可以透過 * 的形式完成屬性的自動設定
一其有4種方法
自動比對: <jsp: setProperty name=”實體的名稱(id)” property=”*” />
指定屬性: <jsp: setProperty name=”實體的名稱(id)” property=”屬性明稱” />
指定參數: <jsp: setProperty name=”實體的名稱(id)” property=”屬性明稱” param=”參數名稱” />
指定內容: <jsp: setProperty name=”實體的名稱(id)” property=”屬性明稱” value=”內容” />
/======================================================/
Date: 12/13
/======================================================/
<jsp:useBean>
與 import 功能相同
<jsp:useBean id=”產生的實體物件” scope="儲存範圍" class=”套件.class name” />
※ scope => 表示這個物件的儲存範圍,一共有四個屬性: page, request, session, application
/======================================================/
<jsp: setProerty>
可以透過 * 的形式完成屬性的自動設定
一其有4種方法
自動比對: <jsp: setProperty name=”實體的名稱(id)” property=”*” />
指定屬性: <jsp: setProperty name=”實體的名稱(id)” property=”屬性明稱” />
指定參數: <jsp: setProperty name=”實體的名稱(id)” property=”屬性明稱” param=”參數名稱” />
指定內容: <jsp: setProperty name=”實體的名稱(id)” property=”屬性明稱” value=”內容” />
/======================================================/
2015年12月6日 星期日
JAVA SL-314_12/06
Date: 12/06
/========================================================/
session物件
session的用處就是完成使用者的login logout
等常見功能,每一個session都表示不同的存取
使用者,其為javax.servlet.http.HttpSesion介面
所產生的實體物件
HttpSession介面中存在以下4種屬性操作方法:
1. 設定屬性 public void patValue(String name, Object value)
2. 取得屬性 public Object getValue(String name)
3. 刪除屬性 public void removeValue(String name)
4. 取得全部性屬性名稱 public String[ ] getValueNames()
/========================================================/
※ 作業系統伺服器+web伺服器(mysql+tomcat)
web伺服器是用來解譯web程式語言
※ JSP是一個很嚴謹的程式語言,因此相對的比較不容易被駭客入侵。
/========================================================/
/========================================================/
session物件
session的用處就是完成使用者的login logout
等常見功能,每一個session都表示不同的存取
使用者,其為javax.servlet.http.HttpSesion介面
所產生的實體物件
HttpSession介面中存在以下4種屬性操作方法:
1. 設定屬性 public void patValue(String name, Object value)
2. 取得屬性 public Object getValue(String name)
3. 刪除屬性 public void removeValue(String name)
4. 取得全部性屬性名稱 public String[ ] getValueNames()
/========================================================/
※ 作業系統伺服器+web伺服器(mysql+tomcat)
web伺服器是用來解譯web程式語言
※ JSP是一個很嚴謹的程式語言,因此相對的比較不容易被駭客入侵。
/========================================================/
2015年11月29日 星期日
JAVA SL-314_11/29
Date: 11/29
在JSP中為了簡化使用者開發JSP內建
9種物件供開發者使用
pageContext 頁面內容容器
request 請求者資訊
response 用戶端回應資料
session 儲存使用者資訊
application 使用者共同資訊
config 初始化參數伺服器設定
out 輸出
page
exception
page → 跳躍無效,一個頁面
request → 一次請求,跳躍然有效
session → 一次階段範圍中儲存 新開browser無效
application →整個 伺服器上儲存 all user使用
/===============================================/
在JSP中為了簡化使用者開發JSP內建
9種物件供開發者使用
pageContext 頁面內容容器
request 請求者資訊
response 用戶端回應資料
session 儲存使用者資訊
application 使用者共同資訊
config 初始化參數伺服器設定
out 輸出
page
exception
page → 跳躍無效,一個頁面
request → 一次請求,跳躍然有效
session → 一次階段範圍中儲存 新開browser無效
application →整個 伺服器上儲存 all user使用
/===============================================/
2015年11月23日 星期一
JAVA SL-314_11/22
JAVA SL-314
Date: 11/22
/*
<%!
public static final String INFO="www.google.com";
int x=0;
%>
<%
out.println("<h2>x="+x+++"</h2>"); //敘述
%>
<%!
public int add(int x, int y){
return x+y;
}
%>
<%!
class Person {
private String name;
private int age;
Person(String name, int age){
this.name=name;
this.age=age;
}
public String toString(){
return "name="+this.name+"; age="+this.age;
}
}
%>
<%!
out.println("<h3>INFO"+INFO+"</h3>");
out.println("<h3>3+5="+add(3,5)+"</h3>");
out.println("<h3>"+new Person("name",18)+"</h3>");
%>
*/
/====================================================/
想要在自己的 NB 上架 Drupal 及 Wordpress 等 Open Source 免費架站軟體的開發測試
環境,以前都是從 Apache 、PHP 、 MySQL 、phpMyAdmin 一個一個的安裝設定,
還蠻麻煩的,而且也容易出問題,現在直接用 AppServ 四合一包還蠻方便,安裝快速
又容易,很快就可以準備好自己的開發測試環境了 !
1. 先下載appserv-win32-2.5.10.exe:
https://drive.google.com/file/d/0B8Dfp4n5Q35CVjY0SjV3QmljTDQ/view?usp=sharing
2. 執行安裝 ---> 以系統管理員執行
appserv-win32-2.5.10.exe
3. 點按next
4. 點按I agree
5. 依照下列指示安裝下一步
6. 安裝完成後,可以查看工作管理員--->服務--->Apache2.2、mysql
7. 服務都起來後,執行google輸入localhost,就會看見以下畫面,再點選指示
8. 輸入root,及密碼
9. AppServ 2.5.10 安裝測試成功
/====================================================/
Page指令
1. contemt Type ---> 定義JSP字元的編號和頁面MIME的回應型態。
2. import ---> 要載入那些套件。
3. pageEncoding ---> JSP頁面的字元編碼。
3. info ---> 資訊。
4. language ---> 指令碼語言。
5. is ErrorPage ---> 此頁面是否為出錯的處裡頁true處理,false則無法處理。
/====================================================/
include指令 => @
可分為動態包含及靜態包含:
1. 靜態包含---> 就是包含一個文字或JSP檔案,過程是靜態的,
例如: JSP檔案、html檔案、文字檔。
2. 動態包含---> 是使用<jsp: include>可以將靜態及動態頁面一
起包含進來,分別處裡,先處理靜態頁面結果。
ex:
<h3>靜態包含操作</h3>
<%@ include file = "info.html"% >
<%@ include file = "info.inc"%>
※page,include => %後都要加@
/====================================================/
receive_param.jsp
/*
<html>
<head>
</head>
<body>
<h1>參數一:
<%= request.getParameter("name") %></h1>
<h2>參數二:
<%= request.getParameter("info") %></h2>
</body>
</html>
Date: 11/22
/*
<%!
public static final String INFO="www.google.com";
int x=0;
%>
<%
out.println("<h2>x="+x+++"</h2>"); //敘述
%>
<%!
public int add(int x, int y){
return x+y;
}
%>
<%!
class Person {
private String name;
private int age;
Person(String name, int age){
this.name=name;
this.age=age;
}
public String toString(){
return "name="+this.name+"; age="+this.age;
}
}
%>
<%!
out.println("<h3>INFO"+INFO+"</h3>");
out.println("<h3>3+5="+add(3,5)+"</h3>");
out.println("<h3>"+new Person("name",18)+"</h3>");
%>
*/
/====================================================/
想要在自己的 NB 上架 Drupal 及 Wordpress 等 Open Source 免費架站軟體的開發測試
環境,以前都是從 Apache 、PHP 、 MySQL 、phpMyAdmin 一個一個的安裝設定,
還蠻麻煩的,而且也容易出問題,現在直接用 AppServ 四合一包還蠻方便,安裝快速
又容易,很快就可以準備好自己的開發測試環境了 !
1. 先下載appserv-win32-2.5.10.exe:
https://drive.google.com/file/d/0B8Dfp4n5Q35CVjY0SjV3QmljTDQ/view?usp=sharing
2. 執行安裝 ---> 以系統管理員執行
appserv-win32-2.5.10.exe
3. 點按next
6. 安裝完成後,可以查看工作管理員--->服務--->Apache2.2、mysql
7. 服務都起來後,執行google輸入localhost,就會看見以下畫面,再點選指示
/====================================================/
Page指令
1. contemt Type ---> 定義JSP字元的編號和頁面MIME的回應型態。
2. import ---> 要載入那些套件。
3. pageEncoding ---> JSP頁面的字元編碼。
3. info ---> 資訊。
4. language ---> 指令碼語言。
5. is ErrorPage ---> 此頁面是否為出錯的處裡頁true處理,false則無法處理。
/====================================================/
include指令 => @
可分為動態包含及靜態包含:
1. 靜態包含---> 就是包含一個文字或JSP檔案,過程是靜態的,
例如: JSP檔案、html檔案、文字檔。
2. 動態包含---> 是使用<jsp: include>可以將靜態及動態頁面一
起包含進來,分別處裡,先處理靜態頁面結果。
ex:
<h3>靜態包含操作</h3>
<%@ include file = "info.html"% >
<%@ include file = "info.inc"%>
※page,include => %後都要加@
/====================================================/
//include.jsp<br />
<%@ page language="java" import="java.util.*" pageEncoding="BIG5"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
int x=10;
%>
<h1>include.jsp--x<%=x%></h1>
</body>
</html>
/====================================================/receive_param.jsp
/*
<html>
<head>
</head>
<body>
<h1>參數一:
<%= request.getParameter("name") %></h1>
<h2>參數二:
<%= request.getParameter("info") %></h2>
</body>
</html>
*/
/====================================================/
App2.jsp (動態)
/*
<html>
<head>
</head>
<body>
<h1>動態包含操作</h1>
<%
String name="Google";
%>
<jsp:include page="receive_param.jsp">
<jsp:param name="name" value="<%= name %>"/>
<jsp:param name="info" value="www.google.com"/>
</jsp:include>
<%
int x=100;//變數
%>
<h1>App2.jsp...x<%=x %></h1>
<jsp:include.page="include.jsp"/>
</body>
</html>
*/
/====================================================/
App2.jsp (靜態)
/*
<html>
<head>
</head>
<body>
<h1>靜態包含操作</h1>
<%
int x=100;//變數
%>
<h1>include.jsp...x</h1>
<include.page="include.jsp"/>
</body>
</html>
*/
/====================================================/
靜態 ---> 全部包含再處理。
動態 ---> 先處理,再把結果包含進去。
/====================================================/
跳轉指令語法
不傳遞參數
<jsp:forward page="要跳轉的檔案or運算式"/>
要傳遞參數
<jsp: forward page="要跳轉的檔案or運算式"/>
<jsp: param name="參數名稱" value="參數名稱" value="參數內容"/>
</jsp: forword>
/====================================================/
2015年11月15日 星期日
JAVA SL-314_11/15
JAVA SL-314
Date: 11/15
※ HTTP/FTP/HTTPS
基於請求/回應模型
沒有狀態的通訊協定
| HTTP| 請求URL| 請求的資源 | HTTP版本
http:// /download.do?file… /HTTP 1.1
---> 向伺服器取得指定的資源
1. 可以請求的參數有限 (依brower的版本而有不同)
2. 不適合大量的資料
※ POST
請求發佈(POST)資訊給伺服器
1. 大量的資料發送都會使用POST
2. 請求資訊移到主體,網址列不會出現請求參數
3. 一般即使請求資料不多也大都會採用POST
※GET(等冪) or POST(非等冪)
1. 過長的請求參數 ---> POST
2. 較敏感的參數資料 ---> POST
3. 希望可以讓使用者設定書籤,以便日後瀏覽 ---> GET
4. 考慮Browser會cache資料問題 ---> GET
※採用MVC架構來設計軟體系統會比較好維護,擴充及除錯。
web---> 實體server → http伺服器 → web容器 ---> servlert
Java → JVM
Servlert / JSP --->web容器 ----> my eclipse
php容器---> apahe
ASP.NET容器 ---> IIS
/========================================================/
註解
1. // 單行
2. /*...*/ 多行
3. <!--xoo-->
/========================================================/
Script
<% %>
定義區域變數,敘述
2. <%!%>
定義全域變數,方法,類別
3. <%=%>
定異常數或運算式
/========================================================/
/========================================================/
使用MyEclipse
版本: MyEclipse 8.5
接下來讓我來lab吧!
首先開啟MyEclipse,接著在WebRoot建立新的html
/========================================================/
再到google輸入 ---> http://aaronhuang:8080/DEMO/MyHtml.html
再輸入123
Date: 11/15
※ HTTP/FTP/HTTPS
基於請求/回應模型
沒有狀態的通訊協定
| HTTP| 請求URL| 請求的資源 | HTTP版本
http:// /download.do?file… /HTTP 1.1
---> 向伺服器取得指定的資源
1. 可以請求的參數有限 (依brower的版本而有不同)
2. 不適合大量的資料
※ POST
請求發佈(POST)資訊給伺服器
1. 大量的資料發送都會使用POST
2. 請求資訊移到主體,網址列不會出現請求參數
3. 一般即使請求資料不多也大都會採用POST
※GET(等冪) or POST(非等冪)
1. 過長的請求參數 ---> POST
2. 較敏感的參數資料 ---> POST
3. 希望可以讓使用者設定書籤,以便日後瀏覽 ---> GET
4. 考慮Browser會cache資料問題 ---> GET
※採用MVC架構來設計軟體系統會比較好維護,擴充及除錯。
web---> 實體server → http伺服器 → web容器 ---> servlert
Java → JVM
Servlert / JSP --->web容器 ----> my eclipse
php容器---> apahe
ASP.NET容器 ---> IIS
/========================================================/
註解
1. // 單行
2. /*...*/ 多行
3. <!--xoo-->
/========================================================/
Script
<% %>
定義區域變數,敘述
2. <%!%>
定義全域變數,方法,類別
3. <%=%>
定異常數或運算式
/========================================================/
使用MyEclipse
版本: MyEclipse 8.5
接下來讓我來lab吧!
首先開啟MyEclipse,接著在WebRoot建立新的html
//MyHtml.html
<html>
<head>
<title>HTML_Javascript</title>
<script language="javascript"><!--Javasript-->
function show(){ //定義函數
var show = document.myform.name.value; //取得輸入內容
alert("輸入的內容是:"+show);
}
</script>
</head>
<body>
<form action="" method="post" name="myform">
請輸入內容:<input name="name" type="text" />
<input onclick="show()" type="button" value="顯示" />
</form>
</body>
</html>
/========================================================/
再到google輸入 ---> http://aaronhuang:8080/DEMO/MyHtml.html
再輸入123
2015年10月19日 星期一
JAVA SL-275_10/18
JAVA SL-275_10/18
Date: 10/18
//============================================================//
常用的 Java 圖形 Lib (java 7.0 版以後,兩種可以混用):
AWT
Swing
一般功能表是由三種類別所建立:
MenuBar
Menu
MenuItem
java.lang.Object
java.awt.MenuComponent → java.awt.MenuBar
java.awt.MenuComponent → java.awt.MenuItem ─ java.awt.Menu
設計的參數及概念:
監聽事件 (event listener) 架構圖:
//============================================================//
Date: 10/18
//============================================================//
常用的 Java 圖形 Lib (java 7.0 版以後,兩種可以混用):
AWT
Swing
一般功能表是由三種類別所建立:
MenuBar
Menu
MenuItem
java.lang.Object
java.awt.MenuComponent → java.awt.MenuBar
java.awt.MenuComponent → java.awt.MenuItem ─ java.awt.Menu
設計的參數及概念:
監聽事件 (event listener) 架構圖:
//============================================================//
//app_1.java
import java.awt.*;
import java.awt.event.*;
public class app_1 extends Frame implements ActionListener{
static app_1 frm=new app_1();
static Button btn1=new Button("Yellow");
static Button btn2=new Button("Green");
static Button btn3=new Button("Exit");
public static void main(String args[]){
btn1.addActionListener(frm);
btn2.addActionListener(frm);
btn3.addActionListener(frm);
frm.setTitle("ActionEvent");
frm.setLayout(new FlowLayout(FlowLayout.CENTER));
frm.setSize(300,200);
frm.add(btn1);
frm.add(btn2);
frm.add(btn3);
frm.setVisible(true); //一定要show出,不然無法顯示。
frm.addWindowListener(new WindowAdapter(){ //視窗右上角x功能
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent e){
Button btn=(Button)e.getSource();//取得事件來源物件。
if(btn==btn1)
frm.setBackground(Color.YELLOW);
if(btn==btn2)
frm.setBackground(Color.GREEN);
if(btn==btn3)
System.exit(0);
}
}
//============================================================////app_2.java
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.*;
import java.awt.event.*;
public class app_2 extends Frame implements ItemListener{
static app_2 frm=new app_2();
static Checkbox ckb1=new Checkbox("Java");
static Checkbox ckb2=new Checkbox("PHP");
static Label lab=new Label("Select one");
public static void main(String args[]){
CheckboxGroup grp=new CheckboxGroup();
frm.setSize(300,200);
frm.setTitle("app_2 Programmer");
frm.setLayout(new FlowLayout(FlowLayout.CENTER));
ckb1.setCheckboxGroup(grp);
ckb2.setCheckboxGroup(grp);
lab.setBackground(Color.orange);
ckb1.addItemListener((ItemListener) frm);
ckb2.addItemListener((ItemListener) frm);
frm.add(ckb1);
frm.add(ckb2);
frm.add(lab);
frm.setVisible(true);
frm.addWindowListener(new WindowAdapter(){ //視窗右上角x功能
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
@Override
public void itemStateChanged(ItemEvent e) {
if(ckb1.getState()==true)
lab.setText("Java");
else if(ckb2.getState()==true)
lab.setText("PHP");
}
}
//============================================================////app3.java
import java.awt.*;
import java.awt.event.*;
public class app3 extends Frame implements ActionListener{
static app3 frm=new app3();
static Label lab=new Label("Hellow JAVA",Label.CENTER);
static MenuBar mb=new MenuBar();
static Menu menu1=new Menu("Style");
static Menu menu2=new Menu("Exit");
static MenuItem mi1=new MenuItem("plane");
static MenuItem mi2=new MenuItem("bold");
static MenuItem mi3=new MenuItem("italic");
static MenuItem mi4=new MenuItem("close window");
//Dialog --> 要呼叫 show() method 才可以顯示
static Button close_btn=new Button("Close");
static Button cancel_btn=new Button("Cancel");
static Dialog dlg=new Dialog(frm);
static WinLis wlis=new WinLis();
public static void main(String args[]){
mb.add(menu1);
mb.add(menu2);
menu1.add(mi1);
menu1.add(mi2);
menu1.add(mi3);
menu2.add(mi4);
mi1.addActionListener(frm);
mi2.addActionListener(frm);
mi3.addActionListener(frm);
mi4.addActionListener(frm);
lab.setFont(new Font("Dialog",Font.PLAIN,24));
frm.add(lab);
frm.setSize(280,150);
frm.setTitle("app_3 Programmer");
frm.setMenuBar(mb);
frm.setVisible(true);
dlg.setTitle("Are you sure?");
dlg.setSize(140,100);
dlg.setLayout(new FlowLayout(FlowLayout.CENTER,5,30));
dlg.add(close_btn);
dlg.add(cancel_btn);
close_btn.addActionListener(frm);
cancel_btn.addActionListener(frm);
frm.addWindowListener(wlis);
/*frm.addWindowListener(new WindowAdapter(){ //視窗右上角x功能
public void windowClosing(WindowEvent e){
System.exit(0);
}
});*/
}
static class WinLis extends WindowAdapter{
public void windowClosing(WindowEvent e){
dlg.setLocation(80, 30);
dlg.show();
}
}
@Override
public void actionPerformed(ActionEvent e) {
//MenuItem mi=(MenuItem)e.getSource();
if(e.getSource()==mi1)
lab.setFont(new Font("Dialog",Font.PLAIN,30));
else if(e.getSource()==mi2)
lab.setFont(new Font("Dialog",Font.BOLD,30));
else if(e.getSource()==mi3)
lab.setFont(new Font("Dialog",Font.ITALIC,30));
else if(e.getSource()==mi4)
frm.dispose();//關閉式窗
//Button btn=(Button)e.getSource();
else if(e.getSource()==close_btn){
dlg.dispose();
frm.dispose();
}
else if(e.getSource()==cancel_btn){
dlg.hide(); //隱藏
}
}
}
//============================================================//
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 實作的物件。
//================================================================//
//================================================================//
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());
}
}
//================================================================//6>
2015年10月4日 星期日
程式語言那麼多,為什麼 Google 偏愛 JS?
程式語言那麼多,為什麼 Google 偏愛 JS?
轉貼自:http://buzzorange.com/techorange/2015/09/29/google-javascript/
2015年10月3日 星期六
2015年9月20日 星期日
JAVA SL-275_09/20
/*
join
如果 A 執行緒正在運行,流程中允許 B 執行緒加入,等到 B 執行緒執行完畢再繼續 A 執行緒流程就可以使用 join() 方法完成需求,當執行緒使用 join() 加入至另一執行緒時,另一執行緒會等待被加入的執行緒工作完畢然後再續繼它的動作。
*/
//*****************************************************************************
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);
}
}5>
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
*/
/****************************************************************************** /
/*
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()
正常結束
*/
/******************************************************************************/
// 練習 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);
}
}
}
//------------------------------------------------------------------------------------
※ 實作 Runnable 介面,好處是有彈性,還有機會繼承其它類別 繼承 Thread 類別,通常是為了直接利用 Thread 類別中的一些方法才會直接繼承 Thread 類別
*/ /******************************************************************************/
/*
執行序有其優先權,可用 Thread 類別底下的 setPriority() 方法設定優先權,可設定值為 1~10,預設是 5 如果超出 1~10 以外的設定值會拋出 IllegalArgnmentException,數字越大優先權愈高,越優先排入;cpu 若相同,則輪流執行。
*/
/*
有幾種狀況會讓執行序進入 Blocked 狀態:
呼叫 Thread.sleep() 方法 進入 synchronized 前競爭物件鎖定的阻斷 呼叫 wait() 的阻斷 等待 input/output 完成 一個進入 Blocked 狀態的執行序可由另一個執行序呼叫該執行序的 interrupt() 方法,讓它離開 Blocked 狀態。
*/
/******************************************************************************/
‧使用 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,看它出現什麼錯誤訊息。 以下為例:
*/
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 用來呼叫或傳遞一個例外,所以可以利用它在程式中觸發一個例外。
*/
- throw 例外物件變數 →丟出一個例外物件變數
- 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 參數啟用Assertionjavac AssertDemo.java
java -ea AssertDemo
*/
/*******************************************************************************************/
訂閱:
意見 (Atom)







