分类: SCJP

  • Oracle收購Sun之後:有關Java未來的三個關鍵問題

    我們都已經聽說了有關為什麼Oracle收購Sun的一些猜測:
         Oracle一直都想和IBM站在同一水平線上。他們想要被看作是一個完整的供應商,提供應用程序,平台和數據庫。如果你想要,那就是一站式服務。

         Oracle已經佔據了應用程序和數據庫的大部分市場。為了保持在這一領域的主要地位,他們想要擴展並深入到硬件業務中。

        收購是一項長期的防禦舉動以回應微軟收購SAP的謠言。

        雖然收購的原因對很多人來說是很重要的,但是對於我來說最重要的是會在Sun這15年中所創建和服務的Java技術上發生什麼事情。我經常會寫到”Java is COBOL” ,因為今天幾乎所有的商業都有一些Java要做的事情。謠言在應用程序開發行業中漫天飛,但是我們早知道塵埃會落定,故事將會結束。這不意味著我們不能用歷史來引導我們預測未來。 Ruby能否成為第二個Java?

        從純粹的Java角度來看一看Oracle所得到的,這三個關鍵問題是:

         Java Community Process (JCP)會繼續存在嗎?

         Apache Software Foundation (ASF)和Sun之間的爭端會解決嗎?

         Oracle會通過為JDK扣交TCKs而取得Java IP嗎?

         JCP會繼續存在嗎?

         Oracle是JCP的高級成員,而且他們已經提交了80多個Java Specification Requests (JSRs)。儘管有這個長期的參與承諾,Oracle表示——和其他的供應商和參與者一起——JCP過程需要變得更開放,透明並且廠商中立。特別是在2007年12月12日的時候,Oracle提出了這個:Resolution 1 (由Oracle提議,第二個是由BEA提出) .

         “Executive Committee感覺到JCP變成一個開放獨立並且是廠商中立的標準組織,那裡所有的成員都參與公平競爭,具體有以下特點:

        成員基金開發和管理費用

        一個法人實體,有法律,理事會和董事成員等等。

        一個新的,簡單的IPR Policy(知識產權政策)允許更大範圍的執行。

        嚴格的兼容性要求

        致力於促進Java編程模式

        此外,EC將在對Java Community干預最小的情況下,盡快實施這個計劃以確保這樣的過渡盡快的實施。 “

        所以我們希望Oracle能繼續JCP,但是它可能變成一個完全不同的JCP.如果Oracle成功的實施了所期望的轉變,結果會是非常有趣的而且具有廣泛的影響。特別有趣的是看到Oracle如何實施這些變革。那將是第一個跡象表明Oracle將如何同Java工作。

         Apache Software Foundation (ASF)和Sun之間的爭端會解決嗎?客戶端Java的革命性飛躍圍繞Apache和Sun爭論的主要問題是多種多樣的,但是這裡有一個對這些事件的簡短總結:

         Apache Harmony Project目的是創建一個ASF授權的模塊化虛擬機(VM)和基於Java SE 5.0版本的JDK.

         Sun的JDK開源和OpenJDK項目。

        要成為一個認證的JDK,Harmony需要通過Sun的Technology Compatibility Kits(TCKs)。

         Sun說到Harmony是基於舊的JDK5.0而且不是在最新的JDK6.0上,所以認證過程停滯了,Harmony Project也懸而未決。

        到今天,OpenJDK管理委員會也沒有解決這個爭端。 Oracle如何處理這個情況是他們如何管理Java程序的第二個晴雨表。

         Oracle會通過為JDK扣交TCKs而取得Java IP嗎?

        在JDK認證中涉及了很多法律問題會成為Java的大量蠕蟲。例如,除非你為OpenJDK通過TCK,否則你不獲得Java Intellectual Property (IP)的權力——即你沒有認證的JDK.

        由於你沒有Java SE7的一套規範,而且Sun也沒有購買一個,所有沒有辦法擁有一個官方的OpenJDK 7.Oracle會採取同樣的辦法,而且不會發布一個規範或是TCKs,這樣將IP在內部保持。

        總結

        如你所見,這三個問題都有所關聯,每個答案本身有不同的水平和層次,例如:

         JCP肯能會繼續存在,但是它可能在指定技術方向上承擔不同的作用。

        管理上的這種差異為ASF問題提供一個簡單的解決方案,讓它們成為泛黃的記憶。

         Oracle可能會推出一個新的JDK規範連同TCKs一起,完全實現一個開放的JDK承諾。

        如何發揮這些因素將讓Java developmer community清楚的知道Oracle如何運行Java.

  • 淺談:Java代碼的優化策略

    1.如何使用Exception
    Exception降低性能。一個異常拋出首先需要創建一個新的對象。 Throwable接口中的構造器調用名為fillInStackTrace()的本地方法。這個方法負責巡檢棧的整個框架來收集跟踪信息。這樣無論何時有異常拋出,它要求虛擬機裝載調用棧,因為一個新的對像在中部被創建。

    異常應當僅用於有錯誤發生時,而不要控制流。

    2.不要兩次初始化變量

    Java通過調用獨特的類構造器默認地初始化變量為一個已知的值。所有的對像被設置成null,integers (byte, short, int, long)被設置成0,float和double設置成0.0,Boolean變量設置成false。這對那些擴展自其它類的類尤其重要,這跟使用一個新的關鍵詞創建一個對象時所有一連串的構造器被自動調用一樣。

    3.在任何可能的地方讓類為Final

    標記為final的類不能被擴展。在《核心Java API》中有大量這個技術的例子,諸如java.lang.String。將String類標記為final阻止了開發者創建他們自己實現的長度方法。

    更深入點說,如果類是final的,所有類的方法也是final的。 Java編譯器可能會內聯所有的方法(這依賴於編譯器的實現)。在我的測試裡,我已經看到性能平均增加了50%。

    4.在任何可能的地方使用局部變量

    屬於方法調用部分的自變量和聲明為此調用一部分的臨時變量存儲在棧中,這比較快。諸如static,實例(instance)變量和新的對象創建在堆中,這比較慢。局部變量的更深入優化依賴於你正在使用的編譯器或虛擬機。

    5.停止小聰明

    很多開發人員在腦子中編寫可複用和靈活的代碼,而有時候在他們的程序中就產生額外的開銷。曾經或者另外的時候他們編寫了類似這樣的代碼:

    public void doSomething(File file) {
    FileInputStream fileIn = new FileInputStream(file);
    // do something

    他夠靈活,但是同時他們也產生了更多的開銷。這個主意背後做的事情是操縱一個InputStream,而不是一個文件,因此它應該重寫如下:

    public void doSomething(InputStream inputStream){
    // do something

    6.乘法和除法

    我有太多的東東適用於摩爾法則——它聲明CPU功率每年成倍增長。 “摩爾法則”表明每年由開發者所寫的差勁的代碼數量三倍增加,劃去了摩爾法則的任何好處。

    考慮下面的代碼:

    for (val = 0; val < 100000; val +=5) { shiftX = val 8; myRaise = val 2; }

    如果我們狡猾的利用位移(bit),性能將會六倍增加。這是重寫的代碼:

    for (val = 0; val < 100000; val += 5) { shiftX = val << 3; myRaise = val << 1; }

    代替了乘以8,我們使用同等效果的左移3位。每一個移動相當於乘以2,變量myRaise對此做了證明。同樣向右移位相當於除以2,當然這會使執行速度加快,但可能會使你的東東以後難於理解;所以這只是個建議

    7.用代碼有效處理內存溢出

    OutOfMemoryError是由於內存不夠後普遍會遇到的問題,下面一段代碼能有效判斷內存溢出錯誤,並在內存溢出發生時有效回收內存

    通過該方法可以聯想到有效管理連接池溢出,道理等同。

    import Java.util.*;
    public class DataServer
    {
    private Hashtable data = new Hashtable();
    public Object get (String key)
    {
    Object obj = data.get (key);
    if (obj == null)
    {
    System.out.print (key + “ ”);
    try
    {
    // simulate getting lots of data
    obj = new Double[1000000];
    data.put (key, obj);
    }
    catch (OutOfMemoryError e)
    {
    System.out.print (“No Memory! ”);
    flushCache();
    obj = get (key);// try again
    }
    }
    return (obj);
    }
    public void flushCache()
    {
    System.out.println (“Clearing cache”);
    data.clear();
    }
    public static void main (String[] args)
    {
    DataServer ds = new DataServer();
    int count = 0;
    while (true) // infinite loop for test
    ds.get (“” count+);
    }
    }

    8. Lazy Loading (Lazy evaluation)在需要裝入的時候才裝入

    static public long
    factorial( int n ) throws IllegalArgumentException
    {
    IllegalArgumentException illegalArgumentException =
    new IllegalArgumentException( “must be >= 0” );
    if( n < 0 ) {
    throw illegalArgumentException ;
    } else if( ( n 0 ) || ( n 1 ) ) {
    return( 1 );
    } else (
    return( n * factorial( n – 1 ) ) ;
    }

    優化後代碼

    static public long
    factorial( int n ) throws IllegalArgumentException
    {
    if( n < 0 ) {
    throw new IllegalArgumentException( “must be >= 0” );
    } else if( ( n 0 ) || ( n 1 ) ) {
    return( 1 );
    } else (
    return( n * factorial( n – 1 ) ) ;
    }

    9.異常在需要拋出的地方拋出,try catch能整合就整合

    try {
    some.method1(); // Difficult for Javac
    } catch( method1Exception e ) { // and the JVM runtime
    // Handle exception 1 // to optimize this
    } // code
    try {
    some.method2();
    } catch( method2Exception e ) {
    // Handle exception 2
    }
    try {
    some.method3();
    } catch( method3Exception e ) {
    // Handle exception 3
    }

    已下代碼更容易被編譯器優化

    try {
    some.method1(); // Easier to optimize
    some.method2();
    some.method3();
    } catch( method1Exception e ) {
    // Handle exception 1
    } catch( method2Exception e ) {
    // Handle exception 2
    } catch( method3Exception e ) {
    // Handle exception 3
    }

    10. For循環的優化

    Replace…
    for( int i = 0; i < collection.size(); i++ ) {

    }
    with…
    for( int i = 0, n = collection.size(); i < n; i++ ) {

    }

    11.字符串操作優化

    在對字符串實行+操作時,最好用一條語句

    // Your source code looks like…
    String str = “profit = revenue( ” revenue
    “ – cost( ” cost ““;
    //編譯方法
    String str = new StringBuffer( ).append( “profit = revenue( “ ).
    append( revenue ).append( “ – cost( “ ).
    append( cost ).append( ““ ).toString( );
    在循環中對字符串操作時改用StringBuffer.append()方法
    String sentence = “”;
    for( int i = 0; i < wordArray.length; i++ ) {
    sentence += wordArray[ i ];
    }

    優化為

    StringBuffer buffer = new StringBuffer( 500 );
    for( int i = 0; i < wordArray.length; i++ ) {
    buffer.append( wordArray[ i ] );
    }
    String sentence = buffer.toString( );

    12.對象重用(特別對於大對象來說)

    public
    class Point
    {
    public int x;
    public int y;
    public Point( )
    {
    this( 0, 0 );
    }
    }

    優化為:

    public class Component
    {
    private int x;
    private int y;
    public Point getPosition( )
    {
    Point rv = new Point( ); // Create a new Point
    rv.x = x; // Update its state
    rv.y = y;
    return rv;
    }
    }
    // Process an array of Component positions…
    for( int i = 0; i < componentArray.length; i++ ) {
    Point position = componentArray[i].getPosition( );
    // Process position value…
    // Note: A Point object is created for each iteration
    // of the loop…
    }

    可再次優化,僅使用一個類對象:)

    public
    class Component
    {
    private int x;
    private int y;
    public Point getPosition( Point rv )
    {
    if( rv == null) rv = new Point( );
    rv.x = x; // Update its state
    rv.y = y;
    return rv;
    }
    // Create a single point object and reuse it…
    Point p = new Point( );
    for( int i = 0; i < componentArray.length; i++ ) {
    Point position = componentArray[i].getPosition( p );
    // Process position value…
    // Note: Only one Point object is ever created.
    }

    13. J2EE相關

    a)盡量不要將大對象放到HttpSession或其他須序列化的對像中,並註意及時清空Session

    b)使用預編譯語句prepareStatement代替createStatement

    c)盡可能使用連接池

    d)能使用Cache就使用Cache,具體實現可參考jive(CacheCacheableCacheObjectCacheSizesDefaultCacheLinkdListLinkdListNode)或ofbiz(org.ofbiz.core.util. UtilCache.Java)

  • Java基礎:關於Java編程語言中的內部類說明

    提起Java內部類(Inner Class)可能很多人不太熟悉,實際上類似的概念在C++裡也有,那就是嵌套類(Nested Class),關於這兩者的區別與聯繫,在下文中會有對比。內部類從表面上看,就是在類中又定義了一個類(下文會看到,內部類可以在很多地方定義),而實際上並沒有那麼簡單,乍看上去內部類似乎有些多餘,它的用處對於初學者來說可能並不是那麼顯著,但是隨著對它的深入了解,你會發現Java的設計者在內部類身上的確是用心良苦。學會使用內部類,是掌握Java高級編程的一部分,它可以讓你更優雅地設計你的程序結構。下面從以下幾個方面來介紹:

    第一次見面

    public interface Contents {

    int value();

    }

    public interface Destination {

    String readLabel();

    }

    public class Goods {

    private class Content implements Contents {

    private int i = 11;

    public int value() {

    return i;

    }

    }

    protected class GDestination implements Destination {

    private String label;

    private GDestination(String whereTo) {

    label = whereTo;

    }

    public String readLabel() {

    return label;

    }

    }

    public Destination dest(String s) {

    return new GDestination(s);

    }

    public Contents cont() {

    return new Content();

    }

    }

    class TestGoods {

    public static void main(String[] args) {

    Goods p = new Goods();

    Contents c = p.cont();

    Destination d = p.dest(“Beijing”);

    }

    }

    在這個例子裡類Content和GDestination被定義在了類Goods內部,並且分別有著protected和private修飾符來控制訪問級別。 Content代表著Goods的內容,而GDestination代表著Goods的目的地。它們分別實現了兩個接口Content和Destination。在後面的main方法裡,直接用Contents c和Destination d進行操作,你甚至連這兩個內部類的名字都沒有看見!這樣,內部類的第一個好處就體現出來了??隱藏你不想讓別人知道的操作,也即封裝性。

    同時,我們也發現了在外部類作用範圍之外得到內部類對象的第一個方法,那就是利用其外部類的方法創建並返回。上例中的cont()和dest()方法就是這麼做的。那麼還有沒有別的方法呢?當然有,其語法格式如下:

    outerObject=new outerClass(Constructor Parameters);

    outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters);

    注意在創建非靜態內部類對象時,一定要先創建起相應的外部類對象。至於原因,也就引出了我們下一個話題??非靜態內部類對像有著指向其外部類對象的引用,對剛才的例子稍作修改:

    public class Goods {

    private valueRate=2;

    private class Content implements Contents {

    private int i = 11*valueRate;

    public int value() {

    return i;

    }

    }

    protected class GDestination implements Destination {

    private String label;

    private GDestination(String whereTo) {

    label = whereTo;

    }

    public String readLabel() {

    return label;

    }

    }

    public Destination dest(String s) {

    return new GDestination(s);

    }

    public Contents cont() {

    return new Content();

    }

    }

    修改的部分用藍色顯示了。在這裡我們給Goods類增加了一個private成員變量valueRate,意義是貨物的價值係數,在內部類Content的方法value()計算價值時把它乘上。我們發現,value()可以訪問valueRate,這也是內部類的第二個好處??一個內部類對象可以訪問創建它的外部類對象的內容,甚至包括私有變量!這是一個非常有用的特性,為我們在設計時提供了更多的思路和捷徑。要想實現這個功能,內部類對象就必須有指向外部類對象的引用。 Java編譯器在創建內部類對象時,隱式的把其外部類對象的引用也傳了進去並一直保存著。這樣就使得內部類對象始終可以訪問其外部類對象,同時這也是為什麼在外部類作用範圍之外向要創建內部類對象必須先創建其外部類對象的原因。

    有人會問,如果內部類裡的一個成員變量與外部類的一個成員變量同名,也即外部類的同名成員變量被屏蔽了,怎麼辦?沒事,Java裡用如下格式表達外部類的引用:

    outerClass.this

    有了它,我們就不怕這種屏蔽的情況了。

    靜態內部類

    和普通的類一樣,內部類也可以有靜態的。不過和非靜態內部類相比,區別就在於靜態內部類沒有了指向外部的引用。這實際上和C++中的嵌套類很相像了,Java內部類與C++嵌套類最大的不同就在於是否有指向外部的引用這一點上,當然從設計的角度以及以它一些細節來講還有區別。

    除此之外,在任何非靜態內部類中,都不能有靜態數據,靜態方法或者又一個靜態內部類(內部類的嵌套可以不止一層)。不過靜態內部類中卻可以擁有這一切。這也算是兩者的第二個區別吧。

    局部內部類

    是的,Java內部類也可以是局部的,它可以定義在一個方法甚至一個代碼塊之內。

    public class Goods1 {

    public Destination dest(String s) {

    class GDestination implements Destination {

    private String label;

    private GDestination(String whereTo) {

    label = whereTo;

    }

    public String readLabel() { return label; }

    }

    return new GDestination(s);

    }

    public static void main(String[] args) {

    Goods1 g= new Goods1();

    Destination d = g.dest(“Beijing”);

    }

    }

    上面就是這樣一個例子。在方法dest中我們定義了一個內部類,最後由這個方法返回這個內部類的對象。如果我們在用一個內部類的時候僅需要創建它的一個對象並創給外部,就可以這樣做。當然,定義在方法中的內部類可以使設計多樣化,用途絕不僅僅在這一點。

    下面有一個更怪的例子:

    public class Goods2{

    private void internalTracking(boolean b) {

    if(b) {

    class TrackingSlip {

    private String id;

    TrackingSlip(String s) {

    id = s;

    }

    String getSlip() { return id; }

    }

    TrackingSlip ts = new TrackingSlip(“slip”);

    String s = ts.getSlip();

    }

    }

    public void track() { internalTracking(true); }

    public static void main(String[] args) {

    Goods2 g= new Goods2();

    g.track();

    }

    }

    你不能在if之外創建這個內部類的對象,因為這已經超出了它的作用域。不過在編譯的時候,內部類TrackingSlip和其他類一樣同時被編譯,只不過它由它自己的作用域,超出了這個範圍就無效,除此之外它和其他內部類並沒有區別。

    匿名內部類

    java的匿名內部類的語法規則看上去有些古怪,不過如同匿名數組一樣,當你只需要創建一個類的對象而且用不上它的名字時,使用內部類可以使代碼看上去簡潔清楚。它的語法規則是這樣的:

    new interfacename(){……};或new superclassname(){……};

    下面接著前面繼續舉例子:

    public class Goods3 {

    public Contents cont(){

    return new Contents(){

    private int i = 11;

    public int value() {

    return i;

    }

    };

    }

    }

    這裡方法cont()使用匿名內部類直接返回了一個實現了接口Contents的類的對象,看上去的確十分簡潔。

    在java的事件處理的匿名適配器中,匿名內部類被大量的使用。例如在想關閉窗口時加上這樣一句代碼:

    frame.addWindowListener(new WindowAdapter(){

    public void windowClosing(WindowEvent e){

    System.exit(0);

    }

    });

    有一點需要注意的是,匿名內部類由於沒有名字,所以它沒有構造函數(但是如果這個匿名內部類繼承了一個只含有帶參數構造函數的父類,創建它的時候必須帶上這些參數,並在實現的過程中使用super關鍵字調用相應的內容)。如果你想要初始化它的成員變量,有下面幾種方法:

    如果是在一個方法的匿名內部類,可以利用這個方法傳進你想要的參數,不過記住,這些參數必須被聲明為final。

    將匿名內部類改造成有名字的局部內部類,這樣它就可以擁有構造函數了。

    在這個匿名內部類中使用初始化代碼塊。

    為什麼需要內部類?

    java內部類有什麼好處?為什麼需要內部類?

    首先舉一個簡單的例子,如果你想實現一個接口,但是這個接口中的一個方法和你構想的這個類中的一個方法的名稱,參數相同,你應該怎麼辦?這時候,你可以建一個內部類實現這個接口。由於內部類對外部類的所有內容都是可訪問的,所以這樣做可以完成所有你直接實現這個接口的功能。

    不過你可能要質疑,更改一下方法的不就行了嗎?

    的確,以此作為設計內部類的理由,實在沒有說服力。

    真正的原因是這樣的,java中的內部類和接口加在一起,可以的解決常被C++程序員抱怨java中存在的一個問題??沒有多繼承。實際上,C++的多繼承設計起來很複雜,而java通過內部類加上接口,可以很好的實現多繼承的效果。

  • 新手入門:介紹Java學習的一些主線思路

    Java發展到現在,按應用來分主要分為三大塊:J2SE,J2ME和J2EE。

    這三塊相互補充,應用範圍不同。

    J2SE就是Java2的標準版,主要用於桌面應用軟件的編程;

    J2ME主要應用於嵌入是系統開發,如手機和PDA的編程;

    J2EE是Java2的企業版,主要用於分佈式的網絡程序的開發,如電子商務網站和ERP系統。

    先學習j2se

    要學習j2ee就要先學習j2se,剛開始學習j2se先建議不要使用IDE,然後漸漸的過渡到使用IDE開發,畢竟用它方便嘛。學習j2se推薦兩本書,《java2核心技術一二卷》,《java編程思想》,《java模式》。其中《java編程思想》要研讀,精讀。這一段時間是基本功學習,時間會很長,也可能很短,這要看學習者自身水平而定。

    不要被IDE糾纏

    在學習java和j2ee過程中,你會遇到五花八門的IDE,不要被他們迷惑,學JAVA的時候,要學語言本身的東西,不要太在意IDE的附加功能,JAVA編程在不同IDE之間的轉換是很容易的,過於的在意IDE的功能反而容易耽誤對語言本身的理解。目前流行的IDE有jbuilder,eclipse和eclipse的加強版WSAD。用好其中一個就可以了,推薦從eclipse入手j2ee。因為Jbuilder更適合於寫j2se程序。

    選擇和學習服務器使用配置

    當你有了j2se和IDE的經驗時,可以開始j2ee的學習了,web服務器:tomcat,勿庸置疑,tomcat為學習web服務首選。而應用服務器目前主要有三個:jboss、weblogic、websphere。有很多項目開始採用jboss,並且有大量的公司開始做websphere或weblogic向jboss應用服務器的移植(節省成本),這裡要說的是,學習tomcat和jboss我認為是首選,也是最容易上手的。學習服務器使用配置最好去詢問有經驗的人(有條件的話),因為他們或許一句話就能解決問題,你自己上網摸索可能要一兩天(我就乾過這種傻事),我們應該把主要時間放在學習原理和理論上,一項特定技術的使用永遠代替不了一個人的知識和學問。

    學習web知識

    如果你是在做電子商務網站等時,你可能要充當幾個角色,這是你還要學習:

    html,可能要用到dreamwave等IDE。

    Javascript,學會簡單的數據校驗,數據聯動顯示等等。

    J2eeAPI學習

    學習j2eeAPI和學習服務器應該是一個迭代的過程。

    先學習jsp和servlet編程,這方面的書很多,我建立看oreilly公司的兩本《jsp設計》和《java servlet編程》,oreilly出的書總是那本優秀,不得不佩服。

    學習jdbc數據庫編程,j2ee項目大多都是MIS系統,訪問數據庫是核心。這本應屬於j2se學習中,這裡拿出來強調一下。

    學習jndi api,它和學習ejb可以結合起來。

    學習ejb api,推薦書《精通ejb》

    經過上面的這些的學習,大概可以對付一般的應用了。

    有人說跟著sun公司的《j2ee tutorial》一路學下來,當然也可以。

    學習ejb設計模式和看代碼(最重要)

    設計模式是練內功,其重要性可以這麼說吧,如果你不會用設計模式的話,你將寫出一堆使用了ejb的垃圾,有慢又是一堆bug,其結果不如不用ejb實現( ejb不等於j2ee)

    無論學習什麼語言,都應該看大量代碼,你看的代碼量不到一定數量,是學不好j2ee的。

    目前有很多開源的工程可以作為教材:

    jive論壇

    petstore sun公司

    dune sun公司

    等等,研讀一個,並把它用到自己的工程中來。

    J2ee其他學習

    當你漸漸對j2ee了解到一定深度時,你要開始關注當前領域中的一些技術變化,J2ee是一塊百家爭鳴的領域,大家都在這裡提出自己的解決方案,例如structs,hiberate,ofbiz等等,學習這些東西要你的項目和目標而定,預先補充一下未嘗不可,但不用涉及太深,畢竟學習原理和理論是最最重要的事。

    目前常見j2eeAPI

    JavaServer Pages(JSP)技術1.2

    Java Servlet技術2.3

    JDBC API 2.0

    Java XML處理API(JAXP)1.1

    Enterprise JavaBeans技術2.0

    Java消息服務(JMS)1.0

    Java命名目錄接口(JNDI)1.2

    Java事務API(JTA) 1.0

    JavaMail API 1.2

    JavaBeans激活架構(JAF)1.0

    J2EE連接器體系結構(JCA)1.0

    Java認證和授權服務(JAAS)1.0

    學習上面的某些API要以你的項目而定,了解所有他們總之是有好處的。

    上面印證了大家說的一句話,java語言本身不難學,但是技術太多,所以學java很費勁。回想一下,基本上每個初學者,在剛學習java的時候可能都會問別人這麼一句話,你怎麼知道的哪個方法(api)在哪個包裡的?呵呵,無他,唯手熟爾。

    1基礎是王道。我們的基礎要紮實紮實再紮實。

    以上面的整個流程來看java的技術分支很多,要想完全掌握是絕對不可能的。我們只有從中精通1到2個部分。但是java也是有通性的,所謂萬變不離其宗。 java的所有編程思路都是“面向對象”的編程。所以大家在往更高境界發展以前一定要打好基礎,這樣不管以後是jree還是j3d都有應刃而解的感覺。在這裡強烈推薦“java編程思想”.

    2所謂打好基礎並不是說要熟悉所有的java代碼。我說的意思是要了解java的結構。 class,methode,object,各種套用import,extend讓自己在結構上對java有個立體而且整體的了解即刻。其實java的學習不用固執於對代碼的熟悉,1來java本身帶有很多demo,java2d的所有問題幾乎都有demo的樣例。 2來java是開放代碼,即使沒有demo網絡上也有很多高手把自己的代碼分享。所以不要怕沒有參考,參考是到處都有的。

    3最後還有1點經驗和大家分享,對sun的api一定要學會活用,不論是學習還是作為參考api都有很大的幫助,在完全了解java的結構的基礎上,不論什麼方法都是可以通過api來找到的.所以不要怕找不到方法,了解結構,了解api就能找到方法。

  • SUN認證:SCJP考試心得

    一、準備:
    開始沒有打算考SCJP,後來公司說要考,考過後報賬,所以才決定去試試。開始對SCJP根本不了解,所以在google上搜索了很多資料。其中在一個朋友博客找到分享的資料。裡面有很詳細的資料,包括各種電子書,模擬器,以及模擬題。不過都是針對310-055的。開始時,我不清楚SCJP還要分310-055和310-065.所以,根據055的考綱複習,看了很多I/O和awt的東西。去預約考試時才曉得,考試中心只考065.所以,準備考SCJP的兄弟一定要搞清楚這兩個的區別(好像現在都不考055?)。清楚考綱後,就是根據考綱複習。雖然那個SCJP.iso是針對055的,不過大部分內容是相同的。所以里面的資料都比較有用,只是複習的時候,遇到考綱不要求的,不看就是了。

    首先看書,我覺得《Java2認證學習指南》也就是《Complete Java 2 Certification Study Guide 》這個應該看。上面根據考綱,對每個知識點做了詳細講解,文字淺顯,容易理解。而且,它不是像其他書,僅僅羅列出考點,上面講了很多原理上的東西。這樣更易於理解。我想,即便是不考SCJP,如果想學Java,這本書也值得推薦。不過,我不知道是否有中文版的。我看的英文電子版。另外為了能成功地通過SCJP的考試,最好為自己準備一份最新的SCJP考古題,達到保險的效果。

    二、預約考試:
    帶上身份證到各考試中心預約。預約時,一定要確定考試種類,是310-035還是其他的,因為他們的考綱是不一樣的。我就是預約時,才曉得只考310-065.所以浪費了很多時間。幸好預約到了下一個週,而且那個周老板正好出差,所以有時間看310-065多出來的東西。

    三、總結:
    雖然以前做過也些Java項目,但是感覺做寫Java程序和考SCJP是兩碼事。能寫Java程序,不一定過得了SCJP.但是能過SCJP,卻能說明擁有寫Java程序的基礎。這次過SCJP,對我Java基礎又是一次鞏固,我覺得這是我收穫最大的。那個證反而意義不大。不過,對於非計算機專業的兄弟,如果想找個程序員的工作,相信SCJP是個很好的跳板。總之,只要有一定Java基礎,通過一段時間的複習,過肯定沒問題。 SCJP並難,一定要有信心。總算過了,也算對公司有了交待,不過不知道花在上面的時間值不值。 Anyway,現在終於可以看點自己想看的東西了!

  • 台北舉行“JAVA認證日”會場報名考試優惠了

    目前JAVA認證考試卷的價格是6600,會場當天購買優惠價是5300,詳細可參考一下活動網頁的訊息。

    時間:2009年7月31日

    地點:台北國際會議中心
    活動網址:http://weekly.ithome.com.tw/seminar/jcd2009/

    引用網址:http://itking-sunny.blogspot.com/2009/06/2009-java.html

    P.S. 上次一個朋友跟我說SCJP已經漲到300美金,我很納悶地去Prometric網站查,果然查到是300美金。不過當我看到JAVA認證日的活動訊息時我才想起,多數人考JAVA都是先去跟恆毅等SUN原廠授權中心買認證試卷而非在Prometric線上刷卡,而買認證試卷的金額目前訂價是台幣6600而非300美金,若在7/31的JAVA認證日購買就是優惠價3500。

    這個資訊給近期半年內有要考JAVA認證的朋友,若確定要參加考試先去買來放著可以便宜些。

  • SCJP認證信息

    Sun Java。考試內容涉及所有Java相關知識、編程概念及applet開發技巧。Sun 認證Java程序員考試旨在觀察您通過應用軟件分配進行復雜編程的能力。之後還要測試您完成編程所需的知識。
      
    認證要求:
    學員掌握如何使用標準Java Development kit,V1.2 (JDK)或V1.4(JDK)開發應用程序和applets。學會Java語言的語法;如何使用Java來創建圖形用戶接口(GUI),事件處理機制,例外處理,通過設計與開發各種Java程序來獲得實際的編程經驗;您也將學到文件輸入/輸出(I/O);多線程和網絡的知識。
      
    通過認證將證明您能夠:認證是業界唯一經Sun授權的Java認證

    1.使用Java編程語言創建Java應用程序和applets
    2.定義和描述垃圾搜集,安全性和Java虛擬機(JVM)
    3.描述和使用Java語言面向對象的特點
    4.開發圖形用戶接口(GUI)。利用Java支持的多種布局管理
    5.描述和使用Java 1.2的事件處理模式
    6.使用Java語言的鼠標輸入,文本,窗口和菜單窗口部件
    7.使用Java的例外處理來控制程序執行和定義用戶自己的例外事件
    8.使用Java語言的先進的面向對象特點,包括方法重載,方法覆蓋,抽象類,接口,final,static和訪問控制
    9.實現文件的輸入/輸出(I/O)
    10.使用Java語言內在的線程模式來控制多線程

  • SUN認證常識

    Sun在 UNIX領域一直是技術上和市場占有率的領先者;近年來推出的Java技術,更成為業界的標準。所以Sun公司所舉辦的認證考試,必然成為Java和UNIX在全球信息界公認的標準。Sun推出的專業認證包括下列三種:

    1.Java認證考試:

     對於Java程序設計員,Sun推出兩項認證:Sun Certified Java Programmer(SCJP)和Sun Certified Java Developer(SCJD)。310-027SCJP測驗Java程序設計概念及能力,內容偏重於Java語法及JDK的內容;SCJD則進一步測試用Java開發應用程序的能力,考試者必須先完成一個程序的設計方案,再回答與此方案相關的一些問題。

    2.Solaris系統管理認證考試:

     對Solaris/Sun OS系統管理員,Sun推出Certified Solaris Administrator(CSA)。CSA分別為兩個等級(Part I 和 Part II ),測試對Solaris 系統管理的了解程度。

    3.Solaris網絡管理認證考試:

     為了測試使用者對於Solaris網絡的管理能力,Sun還特別推出Certified NetworkAdministrator(CNA). 內容包括基本網絡概念、 Routing and Subnet、Security、Performance、DNS、NIS+等通過SUN任何一門專業認證後,將全收到Sun Microsystems 總公司寄發的資格證及徽章,並有權將通過Sun認證的標記印在個人名片上,作為個人技術能力的肯定。

    SUN認證JAVA程序員

    眾所周知,Java以其獨有的開放性,跨平臺性和面向網絡的交互性席卷全球,以其安全性、易用性和開發周期短的特點,迅速從最初的編程語言發展成為全球第二大軟件開發平臺。這些優點已引起國內外計算機界的極大關註;Java公用規範(PAS)已被國際標準化組織(ISO)認定,Java技術已列為當今世界信息技術三大要點之一。

     Sun Java認證是業界唯一經Sun授權的Java認證。考試內容涉及所有Java相關知識、編程概念及applet開發技巧。Sun 認證Java程序員考試旨在觀察您通過應用軟件分配進行復雜編程的能力。之後還要測試您完成編程所需的知識。每次考試都包括65道以上的選擇題,時間大約為90分鐘。

    課程:SL-275 JAVA語言編程
    本課程是使學員掌握如何使用標準Java Development Kit,V1.1 (JDK) 開發應用程序和applets。在本課程中您將學會Java語言的語法。如何使用Java 來創建圖形用戶接口GUI,事件處理機制, 例外處理,通過設計與開發各種Java 程序來獲得實際的編程經驗.您也將學到文件輸入/輸出(I/O)、 多線程和網絡的知識.。本課程適用於熟悉C或C++的編程人員,也適用於想參加Sun Java 認證考試的各位考生。