2008年5月2日 星期五

使用ArrayList,LinkedList 及使用0 長度的Array


在SUN的網站中有一篇介紹如何使用使用ArrayList/LinkedList 及使用0 長度的Array的文章,

覺得這兩個物件平時佷常用,但是比較少去注意細節的部份.以下把自己看完的心得寫下來.

原文出處: <http://java.sun.com/javase/reference/techart.jsp>

ArrayList and LinkedList 是兩個collection物件.

其實ArrayList背後是用Object array,也因為這原因,它在隨機存取的效能上遠比LinkedList來得好.

然而,同樣使用get()來取 ArrayList 及 LinkedList的物件,在 LinkedList 方面必須由開始到結束的

節點走訪一遍,而使用 ArrayList則可隨意的指定某一個節點並取得其內容.

在存取方面, ArrayList 的確優於LinkedList,但在新增及刪除方面則相反..

以下有個binarySearch 的範例:

import java.util.*;

public class ListDemo1 {
static final int N = 10000;

static List values;

// make List of increasing Integer values

static {
Integer vals[] = new Integer[N];

Random rn = new Random();

for (int i = 0, currval = 0; i < N; i++) {
vals[i] = new Integer(currval);
currval += rn.nextInt(100) + 1;
}

values = Arrays.asList(vals);
}

// iterate across a list and look up every
// value in the list using binary search

static long timeList(List lst) {
long start = System.currentTimeMillis();

for (int i = 0; i < N; i++) {

// look up a value in the list
// using binary search

int indx = Collections.binarySearch(
lst, values.get(i));

// sanity check for result
// of binary search

if (indx != i) {
System.out.println(
"*** error ***\n");
}
}

return System.currentTimeMillis() - start;
}

public static void main(String args[]) {

// do lookups in an ArrayList

System.out.println("time for ArrayList = " +
timeList(new ArrayList(values)));

// do lookups in a LinkedList

System.out.println(
"time for LinkedList = " +
timeList(new LinkedList(values)));
}
}

執行結果:

time for ArrayList = 31

time for LinkedList = 4640

兩者間的效率差了相當多.

常用FTP 指令

ls 顯示 ascii 模式的檔案 ls
dir 顯示所有目錄清單 dir
cd 切換遠端伺服器目錄 cd download
lcd 切換本機目錄 lcd c:\
get 下載單一檔案 get abc.exe
mget 下載複數檔案 mget *.exe
put 上傳單一檔案 put abc.exe
mput 上傳複數檔案 mput *.exe
prompt 開╱關詢問模式 prompt
pwd 顯示目前所在目錄位置 pwd
bye 離開 FTP Server bye
? 顯示指令清單 ?
binary 切換到二進制下載模式 binary
ascii 切換到文字下載模式 ascii
open 連線到 FTP Server open cle.linux.org.tw
help 顯示\指令說明 help ls

2008年5月1日 星期四

Java SE6.0

買了這本書好一陣子了.最近終於有機會翻開來看看.
看一下JAVA 6.0有什麼新功能吧.

Java Metadata類別

 使用Metadata類別取得資料庫的基本資訊,其透過java.sql.
ResultSetMetadata儲存於ResultSet物件中
•查詢資料庫的資訊須使用ResultSetMetadata, ResultSet兩個
類別,配合getMetaData()方法以取得ResultSetMetadata的物
件索引
•可查詢的資料庫資訊包括
•多少欄位
•欄位名稱是否有大小寫的區分
•資料的型別
•那一記錄是屬於那一資料表
 
 

概述 BeanUtils

轉貼自城市胡同  一、概述 第一次看到BeanUtils包,是在Struts项目中,作为Struts一个工具来使用的, 估计功能越弄越强,就移到Common项目中了吧。  BeanUtils一共有四个package: org.apache.commons.beanutils org.apache.commons.beanutils.converters org.apache.commons.beanutils.locale org.apache.commons.beanutils.locale.converters 后三个包主要是用于数据的转换,围绕着一个Converter接口,该接口只有一个方法: java.lang.Object convert(java.lang.Class type, java.lang.Object value) , 用于将一个value转换成另一个类型为type的Object。在一些自动化的应用中应该会有用。 这里不作评论,以后有兴趣了,或者觉得有用了,再行研究。 这里只讲第一个包。  二、测试用的Bean 在开始所有的测试之前,我写了一个简单的Bean,以便于测试,代码如下: package test.jakarta.commons.beanutils;  /**  * @author SonyMusic  *  */ public class Month {  private int value;  private String name;  private int[] days={11,22,33,44,55};   public Month(int v, String n){    value=v;    name=n;  }   /**   * Returns the name.   * @return String   */  public String getName() {    return name;  }   /**   * Returns the value.   * @return int   */  public int getValue() {    return value;  }   /**   * Sets the name.   * @param name The name to set   */  public void setName(String name) {    this.name = name;  }   /**   * Sets the value.   * @param value The value to set   */  public void setValue(int value) {    this.value = value;  }   /**   * @see java.lang.Object#toString()   */  public String toString() {    return value+"("+name+")";  }   public int[] getDays() {    return days;  }   public void setDays(int[] is) {    days = is;  }  }  三、BeanUtils 这是一个主要应用于Bean的Util(呵呵,这个解释很绝吧),以下是其中几个方法的例子  //static java.util.Map describe(java.lang.Object bean) //这个方法返回一个Object中所有的可读属性,并将属性名/属性值放入一个Map中,另外还有 //一个名为class的属性,属性值是Object的类名,事实上class是java.lang.Object的一个属性  Month month=new Month(1, "Jan");   try {    Map map=BeanUtils.describe(month);    Set keySet=map.keySet();    for (Iterator iter = keySet.iterator(); iter.hasNext();) {      Object element = (Object) iter.next();      System.out.println("KeyClass:"+element.getClass().getName());      System.out.println("ValueClass:"+map.get(element).getClass().getName());      System.out.print(element+"\t");      System.out.print(map.get(element));      System.out.println();    }  } catch (IllegalAccessException e) {    e.printStackTrace();  } catch (InvocationTargetException e) {    e.printStackTrace();  } catch (NoSuchMethodException e) {    e.printStackTrace();  } 输出为: KeyClass:java.lang.String ValueClass:java.lang.String value  1 KeyClass:java.lang.String ValueClass:java.lang.String class  class test.jakarta.commons.beanutils.Month KeyClass:java.lang.String ValueClass:java.lang.String name  Jan 注意到所有Map中的key/value都是String,而不管object中实际的值是多少。 与此对应的还有static void populate(java.lang.Object bean, java.util.Map properties) 用于将刚才describe出的Map再装配成一个对象。   再看这样一段代码 曹晓钢也许还记得,为了取一个不确定对象的property,着实花了不少时间, 难度不大,但要做到100%的正确,仍然需要付出很大的精力。 //static java.lang.String getProperty(java.lang.Object bean, java.lang.String name)  Month month=new Month(1, "Jan");   try {    System.out.println(BeanUtils.getProperty(month,"value"));  } catch (Exception e) {    e.printStackTrace();  } //输出是:1  与getProperty类似的还有getIndexedProperty, getMappedProperty, 以getIndexedProperty为例:  Month month=new Month(1, "Jan");   try {    System.out.println(BeanUtils.getIndexedProperty(month,"days",1));    System.out.println(BeanUtils.getIndexedProperty(month,"days[1]"));  } catch (Exception e) {    e.printStackTrace();  } 这两个调用是相同的。   BeanUtils中还有一个方法: static void copyProperties(java.lang.Object dest, java.lang.Object orig) 它真是太有用,还记得struts中满天飞的都是copyProperties,我甚至怀疑整个BeanUtils最初 是不是因为这个方法的需求才写出来的。 它将对象orig中的属性复制到dest中去。   四、PropertyUtils 这个类和BeanUtils类很多的方法在参数上都是相同的,但返回值不同。 BeanUtils着重于"Bean",返回值通常是String,而PropertyUtils着重于属性, 它的返回值通常是Object。   五、ConstructorUtils 这个类中的方法主要分成两种,一种是得到构造方法,一种是创建对象。 事实上多数时候得到构造方法的目的就是创建对象,这里只介绍一下创建对象。 //static java.lang.Object ConstructorUtils.invokeConstructor //(java.lang.Class klass, java.lang.Object[] args) //根据一个java.lang.Class以及相应的构造方法的参数,创建一个对象。  Object obj=ConstructorUtils.invokeConstructor(Month.class, {new Integer(1), "Jan"});  Month month=(Month)obj;  try {    System.out.println(BeanUtils.getProperty(month,"value"));  } catch (Exception e) {    e.printStackTrace();  } 输出证明,构造方法的调用是成功的。 如果需要强制指定构造方法的参数类型,可以这样调用:    Object[] args={new Integer(1), "Jan"};    Class[] argsType={int.class, String.class};    Object obj;    obj = ConstructorUtils.invokeExactConstructor(Month.class, args, argsType);    Month month=(Month)obj;    System.out.println(BeanUtils.getProperty(month,"value")); argsType指定了参数的类型。

JavaScript--禁止使用者按Backspace鍵的小技巧

轉貼

如何在IE/Firefox中禁止使用者按下"Backspace"鍵回上一頁的問題,順便將結果分享給有需要的人。

作法:一般來說,在處理這樣的問題時,我們都會從"事件"(Event)這方面去著手。在瀏覽器(或一般視窗程式)中,移動/點擊滑鼠、按下鍵盤、網頁讀取完成等等動作都會造成事件被觸發,而要避免使用者進行這些行為,就要在事件被觸發的同時將其攔下,就會造成功能失效。

下面這段JavaScript可以攔截使用者按"Backspace"鍵:

<script language="JavaScript">
document.onkeydown = check;
function check(e) {
    var code;
    if (!e) var e = window.event;
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;
alert(code);
if (code == 8)
{
   code = 0;
   window.alert('test');
   return false;
{color:#0000ff}}
return true;
{color:#0000ff}}
</script>

上面這段程式在IE中可以正常運作,但是搬到了Firefox後卻會發現頁面已經換了,警告視窗才跳出來。

這是因為在Firefox的事件處理程序與IE不同所導致的情況,換頁事件會比keydown還早發生,所以在keydown攔下事件之前,換頁事件已經先發生了,也就是說...keydown欄太慢,無效!!

解決的方法就是將keydown事件改用keypress事件,這樣在Firefox就可以正常運作了........

不過很不幸的,在IE裡面這套又行不通了,所以程式碼要加上判斷的功能,依照不同的瀏覽器做不同的事件設定:

if(window.navigator.userAgent.indexOf("MSIE")>=1)
{
  document.onkeydown = check;
{color:#0000ff}}else if (window.navigator.userAgent.indexOf("Firefox")>=1){
  document.onkeypress = check;
{color:#0000ff}}
function check(e){
    var code;
    if (!e) var e = window.event;
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;

if (code == 8)
{
   code = 0;
   window.alert('請勿返回程式');
   return false;
{color:#0000ff}}
return true;
{color:#0000ff}}
 

剛才網友詢問如何在IE/Firefox中禁止使用者按下"Backspace"鍵回上一頁的問題,順便將結果分享給有需要的人。

作法:一般來說,在處理這樣的問題時,我們都會從"事件"(Event)這方面去著手。在瀏覽器(或一般視窗程式)中,移動/點擊滑鼠、按下鍵盤、網頁讀取完成等等動作都會造成事件被觸發,而要避免使用者進行這些行為,就要在事件被觸發的同時將其攔下,就會造成功能失效。

下面這段JavaScript可以攔截使用者按"Backspace"鍵:

(IE版)
程序代碼
[color=#0000ff]<script language="JavaScript">
document.onkeydown = check;
function check(e) {
    var code;
    if (!e) var e = window.event;
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;
alert(code);
if (code == 8)
{
   code = 0;
   window.alert('test');
   return false;
{color:#0000ff}}
return true;
{color:#0000ff}}
</script>[/color]

上面這段程式在IE中可以正常運作,但是搬到了Firefox後卻會發現頁面已經換了,警告視窗才跳出來。

這是因為在Firefox的事件處理程序與IE不同所導致的情況,換頁事件會比keydown還早發生,所以在keydown攔下事件之前,換頁事件已經先發生了,也就是說...keydown欄太慢,無效!!

解決的方法就是將keydown事件改用keypress事件,這樣在Firefox就可以正常運作了........

不過很不幸的,在IE裡面這套又行不通了,所以程式碼要加上判斷的功能,依照不同的瀏覽器做不同的事件設定:

程序代碼
if [color=#0000ff](window.navigator.userAgent.indexOf("MSIE")>=1)
{
  document.onkeydown = check;
{color:#0000ff}}else if (window.navigator.userAgent.indexOf("Firefox")>=1){
  document.onkeypress = check;
{color:#0000ff}}
function check(e){
    var code;
    if (!e) var e = window.event;
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;

if (code == 8)
{
   code = 0;
   window.alert('請勿返回程式');
   return false;
{color:#0000ff}}
return true;
{color:#0000ff}}

這樣,就打造出一個能夠在IE/Firefox上使用的攔截"Backspace"的小程式了

JavaScript--javascript menu

最近看到這個MENU.有免費的可以用.不錯喔