天天看點

JDK1.5/1.6/1.7之新特性總結

發過程中接觸到了從jdk1.5---jdk1.7的使用,在不同的階段,都使用過了jdk的一些新特性,操作起來更加方面啦!特此總結了下,與喜歡it 的朋友共勉!呵呵

以下是測試代碼:

JDK1.5新特性:

1.自動裝箱與拆箱:

Integer iObj = 3;

System.out.println(iObj + 12);

   Integer i1 = 137(-128--127範圍時,為true);

   Integer i2 = 137(-128--127範圍時,為true);

   System.out.println(i1 == i2); //false,但是括号中時卻傳回ture,原因是Integer采用的是享元模式

   Integer i3 = Integer.valueOf(213);

   Integer i4 = Integer.valueOf(213);

   System.out.println(i3==i4);//同上,另一種包裝形式

2.枚舉(常用來設計單例模式)

public class EnumTest {

public static void main(String[] args) {

   WeekDay1 weekDay = WeekDay1.MON;

   System.out.println(weekDay.nextDay());

   WeekDay weekDay2 = WeekDay.FRI;

   System.out.println(weekDay2);

   System.out.println(weekDay2.name());

   System.out.println(weekDay2.ordinal()); 

   System.out.println(WeekDay.valueOf("SUN").toString());

   System.out.println(WeekDay.values().length);

   new Date(300){};

}

public enum WeekDay{

   SUN(1),MON(),TUE,WED,THI,FRI,SAT;

   private WeekDay(){System.out.println("first");}

   private WeekDay(int day){System.out.println("second");}

}

public enum TrafficLamp{

   RED(30){

    public TrafficLamp nextLamp(){

     return GREEN;

    }

   },

   GREEN(45){

    public TrafficLamp nextLamp(){

     return YELLOW;

    }   

   },

   YELLOW(5){

    public TrafficLamp nextLamp(){

     return RED;

    }   

   };

   public abstract TrafficLamp nextLamp();

   private int time;

   private TrafficLamp(int time){this.time = time;}

}

}

3.靜态導入

import static java.lang.Math.*;

public class StaticImport {

public static void main(String[] args){

   int x = 1;

   try {

    x++;

   } finally {

    System.out.println("template");

   }

   System.out.println(x);

   System.out.println(max(3, 6));

   System.out.println(abs(3 - 6));

}

}

4.可變參數

public class VarableParameter {

public static void main(String[] args) {

   System.out.println(add(2,3));

   System.out.println(add(2,3,5));  

}

public static int add(int x,int... args){

   int sum = x;

   for(int arg : args){

    sum += arg;

   }

   return sum;

}

}

5.内省

ReflectPoint pt1 = new ReflectPoint(3,5);

BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());

   PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

   Object retVal = null;

   for(PropertyDescriptor pd : pds){

     Method methodGetX = pd.getReadMethod();

     retVal = methodGetX.invoke(pt1);

   }

   jdk1.6新特性:

1.Web服務中繼資料

Java 裡的Web服務中繼資料跟微軟的方案基本沒有語義上的差別,自從JDK5添加了中繼資料功能(Annotation)之後,SUN幾乎重構了整個J2EE體 系, 由于變化很大,幹脆将名字也重構為Java EE, Java EE(目前版本為5.0)将中繼資料納入很多規範當中,這其中就包括Web Services的相關規範, 加入中繼資料之後的Web Services伺服器端程式設計模型就跟上面看到的C#片斷差不多了, 這顯然比以前的JAX-RPC程式設計模型簡單(當然, Axis的程式設計模型也很簡單).這裡要談的Web服務中繼資料(JSR 181)隻是Java Web 服務規範中的一個,它跟Common Annotations, JAXB2, StAX, SAAJ和JAX-WS等共同構成Java EE 5的Web Services技術堆棧.

package WebServices;

import java.io.File;

import java.io.IOException;

import javax.jws.Oneway;

import javax.jws.WebMethod;

import javax.jws.WebParam;

import javax.jws.WebResult;

import javax.jws.WebService;

import javax.xml.ws.Endpoint;

@WebService(targetNamespace="http://blog.csdn.net/chinajash",serviceName="HelloService")

public class WSProvider {

     @WebResult(name="Greetings")//自定義該方法傳回值在WSDL中相關的描述    

     @WebMethod

     public String sayHi(@WebParam(name="MyName") String name){

         return "Hi,"+name; //@WebParam是自定義參數name在WSDL中相關的描述

     }    

     @Oneway //表明該服務方法是單向的,既沒有傳回值,也不應該聲明檢查異常

     @WebMethod(action="printSystemTime",operationName="printSystemTime")//自定義該方法在WSDL中相關的描述

     public void printTime(){

         System.out.println(System.currentTimeMillis());

     }

     public static void main(String[] args) {

         Thread wsPublisher = new Thread(new WSPublisher());

         wsPublisher.start();

     }    

     private static class WSPublisher implements Runnable{

         public void run() {

             //釋出WSProvider到http://localhost:8888/chinajash/WSProvider這個位址,之前必須調用wsgen指令

             //生成服務類WSProvider的支援類,指令如下:

             //wsgen -cp . WebServices.WSProvider

             Endpoint.publish("http://localhost:8888/chinajash/WSProvider",new WSProvider());

         }        

     }

}

如果想看到Web Services Engine生成的WSDL檔案是否遵守上面的中繼資料, 我們沒有必要将上面的WSProvider部署到支援JSR-181的應用伺服器或Servlet形式的Web Services Engine,現在JDK6已經提供了一個很簡單的機制可以用來測試和釋出Web Services,下面講講如何在JDK6環境下釋出Web Services和檢視生成的WSDL

1.将<JDK_HOME>/bin加入path環境變量

2.在指令行下切換目前目錄到WSProvider的class檔案所在的目錄,運作下面指令

wsgen -cp . WebServices.WSProvider

在這個例子中會生成以下3個類的源代碼檔案及class檔案

SayHi

SayHiResponse

PrintTime

3.執行如下代碼釋出WSProvider到http://localhost:8888/chinajash/WSProvider,在這裡可以執行WSProvider類的main方法就可以

Endpoint.publish("http://localhost:8888/chinajash/WSProvider",new WSProvider());

4.在浏覽器輸入http://localhost:8888/chinajash/WSProvider?wsdl就可以看到生成的WSDL檔案,為了節省篇幅,這裡就不把生成的WSDL檔案貼上了,大家可以自己動手試試.

2.腳本語言支援

JDK6增加了對腳本語言的支援(JSR 223),原理上是将腳本語言編譯成bytecode,這樣腳本語言也能享用Java平台的諸多優勢,包括可移植性,安全等,另外,由于現在是編譯成bytecode後再執行,是以比原來邊解釋邊執行效率要高很多。加入對腳本語言的支援後,對Java語言也提供了以下好處。

1、許多腳本語言都有動态特性,比如,你不需要用一個變量之前先聲明它,你可以用一個變量存放完全不同類型的對象,你不需要做強制類型轉換,因為轉換都是自動的。現在Java語言也可以通過對腳本語言的支援間接獲得這種靈活性。

2、 可以用腳本語言快速開發産品原型,因為現在可以Edit-Run,而無需Edit-Compile-Run,當然,因為Java有非常好的IDE支援,我 們完全可以在IDE裡面編輯源檔案,然後點選運作(隐含編譯),以此達到快速開發原型的目的,是以這點好處基本上可以忽略。

3、通過引入腳本語言可以輕松實作Java應用程式的擴充和自定義,我們可以把原來分布在在Java應用程式中的配置邏輯,數學表達式和業務規則提取出來,轉用JavaScript來處理。

Sun的JDK6實作包含了一個基于Mozilla Rhino的 腳本語言引擎,支援JavaScript,這并不是說明JDK6隻支援JavaScript,任何第三方都可以自己實作一個JSR-223相容的腳本引擎 使得JDK6支援别的腳本語言,比如,你想讓JDK6支援Ruby,那你可以自己按照JSR 223的規範實作一個Ruby的腳本引擎類,具體一點,你需要實作javax.script.ScriptEngine(簡單起見,可以繼承javax.script.AbstractScriptEngine)和javax.script.ScriptEngineFactory兩個接口。當然,在你實作自己的腳本語言引擎之前,先到scripting.dev.java.net project 這裡看看是不是有人已經幫你做了工作,這樣你就可以直接拿來用就行。

Scripting API

--------------------------------------------------------------------------------

Scripting API是用于在Java裡面編寫腳本語言程式的API, 在Javax.script中可以找到Scripting API,我們就是用這個API來編寫JavaScript程式,這個包裡面有一個ScriptEngineManager類,它是使用Scripting API的入口,ScriptEngineManager可以通過jar服務發現(service discovery)機制尋找合适的腳本引擎類(ScriptEngine),使用Scripting API的最簡單方式隻需下面三步

1、建立一個ScriptEngineManager對象

2、通過ScriptEngineManager獲得ScriptEngine對象

3、用ScriptEngine的eval方法執行腳本

下面是一個Hello World程式

public class HelloScript {public static void main(String[] args) throws Exception {         ScriptEngineManager factory = new ScriptEngineManager();//step 1         ScriptEngine engine = factory.getEngineByName("JavaScript");//Step 2             engine.eval("print('Hello, Scripting')");//Step 3     }     }運作上面程式,控制台會輸出Hello, Scripting上面這個簡單的Scripting程式示範了如何在Java裡面運作腳本語言,除此之外,我們還可以利用Scripting API實作以下功能1、暴露Java對象為腳本語言的全局變量2、在Java中調用腳本語言的方法3、腳本語言可以實作Java的接口4、腳本語言可以像Java一樣使用JDK平台下的類下面的類示範了以上4種功能package Scripting;import java.io.File;import javax.script.Invocable;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;import javax.script.ScriptException;public class ScriptingAPITester {     public static void main(String[] args) throws Exception {         ScriptEngineManager manager = new ScriptEngineManager();         ScriptEngine engine = manager.getEngineByName("JavaScript");         testScriptVariables(engine);//示範如何暴露Java對象為腳本語言的全局變量          testInvokeScriptMethod(engine);//示範如何在Java中調用腳本語言的方法          testScriptInterface(engine);//示範腳本語言如何實作Java的接口          testUsingJDKClasses(engine);//示範腳本語言如何使用JDK平台下的類     }         public static void testScriptVariables(ScriptEngine engine) throws ScriptException{         File file = new File("test.txt");         engine.put("f", file);         engine.eval("println('Total Space:'+f.getTotalSpace())");             }         public static void testInvokeScriptMethod(ScriptEngine engine) throws Exception{         String script = "function hello(name) { return 'Hello,' + name;}";         engine.eval(script);         Invocable inv = (Invocable) engine;         String res = (String)inv.invokeFunction("hello", "Scripting" );         System.out.println("res:"+res);     }         public static void testScriptInterface(ScriptEngine engine) throws ScriptException{         String script = "var obj = new Object(); obj.run = function() { println('run method called'); }";         engine.eval(script);         Object obj = engine.get("obj");         Invocable inv = (Invocable) engine;         Runnable r = inv.getInterface(obj,Runnable.class);         Thread th = new Thread(r);         th.start();     }         public static void testUsingJDKClasses(ScriptEngine engine) throws Exception{         //Packages是腳本語言裡的一個全局變量,專用于通路JDK的package         String js = "function doSwing(t){var f=new Packages.javax.swing.JFrame(t);f.setSize(400,300);f.setVisible(true);}";         engine.eval(js);         Invocable inv = (Invocable) engine;         inv.invokeFunction("doSwing", "Scripting Swing" );     }}Scripting Tool

--------------------------------------------------------------------------------

SUN提供的JDK6中有一個指令行工具??jrunscript,你可以在<JDK6_Home>/bin下面找到這個工具,jrunscript是一個腳本語言的解釋程式,它獨立于腳本語言,但預設是用JavaScript,我們可以用jrunscript來測試自己寫的腳本語言是否正确,下面是一個在指令行運作jrunscript的簡單例子

jrunscript

js>println("Hello,JrunScript");

Hello,JrunScript

js>9*8

72.0

js>

3.JTable的排序和過濾

原來的JTable基本上是隻能顯示資料,在JDK6新增了對JTable的排序和過濾功能,下面代碼示範了這兩個功能

public class JTableTester {

     static String data[][] = {

         {"China","Beijing","Chinese"},

         {"America","Washington","English"},

         {"Korea","Seoul","Korean"},

         {"Japan","Tokyo","Japanese"},

         {"France","Paris","French"},

         {"England","London","English"},

         {"Germany","Berlin","German"},

     };

     static String titles[] = {"Country","Capital","Language"};

     public static void main(String[] args) {        

         DefaultTableModel m = new DefaultTableModel(data,titles);

         JTable t = new JTable(m);

         final TableRowSorter sorter = new TableRowSorter(m); 

         t.setRowSorter(sorter); //為JTable設定排序器

         JScrollPane sPane = new JScrollPane();

         sPane.setViewportView(t);

         JPanel p = new JPanel();

         p.setLayout(new BoxLayout(p,BoxLayout.X_AXIS));

         JLabel l = new JLabel("Criteria:");

         final JTextField tf = new JTextField();

         JButton b = new JButton("Do Filter");

         p.add(l);

         p.add(tf);

         p.add(b);

         b.addActionListener(new ActionListener() {

             public void actionPerformed(ActionEvent e) {

                 if(tf.getText().length()==0){

                     sorter.setRowFilter(null);

                 }else{

                     sorter.setRowFilter(RowFilter.regexFilter(tf.getText()));//為JTable設定基于正規表達式的過濾條件

                 }

             }

         });

         JFrame f = new JFrame("JTable Sorting and Filtering");

         f.getContentPane().add(sPane,BorderLayout.CENTER);        

         f.getContentPane().add(p,BorderLayout.SOUTH);

         f.setSize(400,300);

         f.setVisible(true);

     }

運作上面程式,單擊JTable的某一個title,這個title對應的列就會按照升序/降序重新排列;在下面的Criteria文本框中輸入"ese",點選"Do Filter"按鈕,JTable将隻顯示帶有"ese"字元串的行,也就是China和Japan兩行,如果文本框裡面什麼都沒有,點選"Do Filter"按鈕,這時JTable會顯示所有的行。

4.更簡單,更強大的JAX-WS

JAX-WS2.0的來曆

--------------------------------------------------------------------------------

JAX-WS(JSR-224) 是Java Architecture for XML Web Services的縮寫,簡單說就是一種用Java和XML開發Web Services應用程式的架構, 目前版本是2.0, 它是JAX-RPC 1.1的後續版本, J2EE 1.4帶的就是JAX-RPC1.1, 而Java EE 5裡面包括了JAX-WS 2.0,但為了向後相容,仍然支援JAX-RPC. 現在,SUN又把JAX-WS直接放到了Java SE 6裡面,由于JAX-WS會用到Common Annotation(JSR 250),Java Web Services Metadata(JSR 181), JAXB2(JSR 222), StAX(JSR 173), 是以SUN也必須把後幾個原屬于Java EE範疇的Components下放到Java SE, 現在我們可以清楚地了解了為什麼Sun要把這些看似跟Java SE沒有關系的Components放進來,終極目的就是要在Java SE裡面支援Web Services.

JAX-WS2.0的架構

--------------------------------------------------------------------------------

JAX-WS不是一個孤立的架構,它依賴于衆多其他的規範,本質上它由以下幾部分組成

1.用來開發Web Services的Java API

2.用來處理Marshal/Unmarshal的XML Binding機制,JAX-WS2.0用JAXB2來處理Java Object與XML之間的映射,Marshalling就是把Java Object映射到XML,Unmarshalling則是把XML映射到Java Object.之是以要做Java Object與XML的映射,是因為最終作為方法參數和傳回值的Java Object要通過網絡傳輸協定(一般是SOAP)傳送,這就要求必須對Java Object做類似序列化和反序列化的工作,在SOAP中就是要用XML來表示Java object的内部狀态

3.衆多中繼資料(Annotations)會被JAX-WS用來描述Web Services的相關類,包括Common Annotations, Web Services Metadata, JAXB2的中繼資料和JAX-WS2.0規範自己的中繼資料.

4.Annotation Processing Tool(APT)是JAX-WS重要的組成部分,由于JAX-WS2.0規範用到很多中繼資料,是以需要APT來處理衆多的Annotations.在<JDK_HOME>/bin下有兩個指令wsgen和wsimport,就是用到APT和Compiler API來處理碰到的Annotations,wsgen可以為Web Services Provider産生并編譯必要的幫助類和相關支援檔案,wsimport以WSDL作為輸入為Web Service Consumer産生并編譯必要的幫助類和相關支援檔案.

5.JAX-WS還包括JAX-WS Runtime與應用伺服器和工具之間的契約關系

JAX-WS2.0的程式設計模型

--------------------------------------------------------------------------------

現在用JAX-WS2.0來編寫Web Services非常簡單,不像JAX-RPC,JAX-WS可以把任意POJO暴露為Web Services,服務類不需要實作接口,服務方法也沒有必要抛出RMI異常.下面介紹在JDK6環境下用JAX-WS2.0開發和測試Web Services的步驟

1.編寫服務類,并用Web Services Metadata(JSR-181)标注這個服務類,我用我的另一篇BlogJDK6的新特性之十:Web服務中繼資料中的WSProvider類作為服務類的例子,在此我重複貼一下WSProvider類的源代碼:

@WebService(targetNamespace="http://blog.csdn.net/chinajash",serviceName="HelloService")

public class WSProvider {

     @WebResult(name="Greetings")//自定義該方法傳回值在WSDL中相關的描述    

     @WebMethod

     public String sayHi(@WebParam(name="MyName") String name){

         return "Hi,"+name; //@WebParam是自定義參數name在WSDL中相關的描述

     }    

     @Oneway //表明該服務方法是單向的,既沒有傳回值,也不應該聲明檢查異常

     @WebMethod(action="printSystemTime",operationName="printSystemTime")//自定義該方法在WSDL中相關的描述

     public void printTime(){

         System.out.println(System.currentTimeMillis());

     }

     public static void main(String[] args) {

         Thread wsPublisher = new Thread(new WSPublisher());

         wsPublisher.start();

     }    

     private static class WSPublisher implements Runnable{

         public void run() {

             //釋出WSProvider到http://localhost:8888/chinajash/WSProvider這個位址,之前必須調用wsgen指令

             //生成服務類WSProvider的支援類,指令如下:

             //wsgen -cp . WebServices.WSProvider

             Endpoint.publish("http://localhost:8888/chinajash/WSProvider",new WSProvider());

         }        

     }

}

2.用wsgen生成上面服務類的必要的幫助類,然後調用用EndPoint類的靜态方法publish釋出服務類(步驟請參考我的另一篇Blog JDK6的新特性之十:Web服務中繼資料),我在這裡是将服務類釋出到http://localhost:8888/chinajash/WSProvider

3.用wsimport為服務消費者(也就是服務的用戶端)生成必要的幫助類,指令如下:

wsimport http://localhost:8888/chinajash/WSProvider?wsdl

這會在<目前目錄>\net\csdn\blog\chinajash下生成用戶端的幫助類,在這個例子中會生成7個類

HelloService.class

ObjectFactory.class

package-info.class

PrintSystemTime.class

SayHi.class

SayHiResponse.class

WSProvider.class

4.在用戶端用下面代碼即可調用步驟1定義的Web Service

HelloService hs = new HelloService();

WSProvider ws = hs.getWSProviderPort();

System.out.println(ws.sayHi("chinajash"));

ws.printSystemTime();

調用上述代碼後用戶端控制台輸出

hi,chinajash

服務端控制台輸出伺服器目前系統時間

5.輕量級Http Server

JDK6的新特性之五:輕量級Http Server

JDK6提供了一個簡單的Http Server API,據此我們可以建構自己的嵌入式Http Server,它支援Http和Https協定,提供了HTTP1.1的部分實作,沒有被實作的那部分可以通過擴充已有的Http Server API來實作,程式員必須自己實作HttpHandler接口,HttpServer會調用HttpHandler實作類的回調方法來處理用戶端請求,在這裡,我們把一個Http請求和它的響應稱為一個交換,包裝成HttpExchange類,HttpServer負責将HttpExchange傳給HttpHandler實作類的回調方法.下面代碼示範了怎樣建立自己的Http Server

public class HTTPServerAPITester {

     public static void main(String[] args) {

         try {

             HttpServer hs = HttpServer.create(new InetSocketAddress(8888),0);//設定HttpServer的端口為8888

             hs.createContext("/chinajash", new MyHandler());//用MyHandler類内處理到/chinajash的請求

             hs.setExecutor(null); // creates a default executor

             hs.start();

         } catch (IOException e) {

             e.printStackTrace();

         }

     }

}

class MyHandler implements HttpHandler {

    public void handle(HttpExchange t) throws IOException {

        InputStream is = t.getRequestBody();

        String response = "<h3>Happy New Year 2007!--Chinajash</h3>";

        t.sendResponseHeaders(200, response.length());

        OutputStream os = t.getResponseBody();

        os.write(response.getBytes());

        os.close();

    }

}

運作程式後,在浏覽器内輸入http://localhost:8888/xx,浏覽器輸出

6.嵌入式資料庫 Derby

Derby是IBM送給開源社群的又一個禮物,是一個pure java的資料庫,現在已經被列入到java1.6中。

不知道對于大資料量的性能如何,但傳說中啟動derby隻會給JVM添加2M的記憶體,對那些小資料庫應用,比如像用access那種應該是挺有誘惑力的。

另外,麻雀雖小,五髒俱全,功能要比access多得多咯,包括事務處理,并發,觸發器都有,管理又簡單,是以自己用來做點工具正好合适。

廢話少說,介紹一下我折騰了半天的經驗吧。

我的Derby配置過程:

1,下載下傳db-derby-10.1.3.1-bin.tar.gz,derby_core_plugin_10.1.3.zip和derby_ui_plugin_1.1.0.zip,把兩個插件安裝到eclipse上

2,打開ecllipse,建立一個project

3,右鍵這個project,選擇Apache Derby,再選擇add apache derby native,發現隻是給我的project添加了幾個derby的jar,還不是在我看着順眼的lib目錄裡,索性幹掉,換上db-derby- 10.1.3.1-bin.tar.gz解壓出來以後lib目錄下的jar檔案,在Build Path裡設定一下;

4,右鍵Project,在apache derby裡選擇start apache derby network server,控制台可以看到derby啟動後打出的“伺服器準備在端口 1527 上接受連接配接。”

5,右鍵Project,在apache derby裡選擇ij(Interactive SQL),啟動SQL控制台;

6,輸入connect jdbc:derby:testdb;create=true; 注意要有單引号,可以在工程跟目錄下建立testdb資料庫,可以看到一個建立的目錄testdb,那裡的檔案就是資料庫咯;

7,用标準的SQL語句來建一個資料庫試試:

create table test (a varchar(4) not null, b char(2) primary key);

居然可以用,太神奇了,呵呵

8,再插入一條語句試試呢,insert into test(a,b) values(a,11);,嗯,不錯,可以用select 查出來的哦。

9,再插一下:insert into test(a,b) values(a,11);,哦哦,報錯了,“錯誤 23505:語句異常終止,因為它導緻“TEST”上所定義的“SQL060710092132480”辨別的唯一或主鍵限制或唯一索引中出現重複鍵值。” 呵呵。

10,好了,現在可以像你控制的其他資料庫一樣來控制Derby了。

如果上述方法不行,或者你習慣了在eclipse之外使用和管理資料庫,那麼可以很友善的把Derby“裝”在系統裡。下面我說一下步驟:

1,把db-derby-10.1.3.1-bin.tar.gz解壓到c:\derby,使lib和framework兩個目錄在c:\derby下邊即可

2,設定環境變量

設定一個c:\derby\framework\embeded\bin或c:\derby\framework\NetworkServe\bin到Path中,這樣我們就可以直接執行上邊介紹的connect這樣的指令而不用每次鑽到那個目錄下去執行了 

設定c:\derby\lib\derby.jar;c:\derby\lib\derbytoos.jar到CLASSPATH中,以便讓這些java編成的指令能夠正确執行;

3,打開cmd

4,敲入startNetworkServer,可以看到像在eclisp中提示的那樣啟動了server

5,再打開一個cmd,敲入sysinfo,可以看到derby的環境資訊了,注意在java user dir這一項,也許是java使用者目錄上和上邊看到的會有所不同哦,這樣在connect jdbc:derby:testdb;create=true;的建的資料庫目錄就不一樣咯。

6,敲入ij,好了,進入到上邊的互動界面,可以建一個資料庫看看了。

7,最後在另外一個cmd中敲入stopNetworkServer就可以關閉資料庫了。

如果你兩種方法都試過了,那麼需要注意的,還是上邊步驟5的問題,這個問題是你可能随時會啟動一個資料庫或建立一個資料庫,但如果你剛剛使用derby,你可能還沒有察覺。

derby實際上有兩種啟動方式,一種是嵌入式的,一種是網絡伺服器的啟動。

1,我們在eclipse中右鍵start apache derby network server那個,就是網絡伺服器的啟動方式,在這種方式下可以用另外一台計算機在ij中以:

connect jdbc:derby://192.168.0.28:1527/testdb 

的方式進行連結。

2,第二種啟動方式是在ij裡邊就直接

connect jdbc:derby:testdb

這實際是在連目前配置環境下java user dir下那個目錄的資料庫。

看到這裡可能有點糊塗了,這麼就會出問題了那?

實際上derby的通路更像是一種使用derby driver對本地檔案系統的通路,不管啟動不啟動網絡伺服器,都可以用driver通路本地的資料庫。這樣,在ij裡邊像第二種方式那樣建立連接配接是完全可以的。啟動了網絡伺服器,隻不過是能夠讓其他主機通路罷了。

另外一個問題是,在eclipse中和在系統中連接配接伺服器,在connect的時候這個目前配置環境是不一樣的,eclipse預設工程所在路徑是資料庫的所在路徑,而在系統中“裝”derby則會認為 c:\document and settings下邊那個使用者目錄是資料庫的所在路徑。

jdk1.7新特性:

1,switch中可以使用字串了

String s = "test";   

switch (s) {   

case "test" :   

     System.out.println("test"); 

case "test1" :   

    System.out.println("test1"); 

    break ;   

default :   

    System.out.println("break"); 

    break ;   

}

2.運用List<String> tempList = new ArrayList<>(); 即泛型執行個體化類型自動推斷

3.文法上支援集合,而不一定是數組

final List<Integer> piDigits = [ 1,2,3,4,5,8 ];   

4.新增一些取環境資訊的工具方法

File System.getJavaIoTempDir() // IO臨時檔案夾

File System.getJavaHomeDir() // JRE的安裝目錄

File System.getUserHomeDir() // 目前使用者目錄

File System.getUserDir() // 啟動java程序時所在的目錄5

5.Boolean類型反轉,空指針安全,參與位運算

Boolean Booleans.negate(Boolean booleanObj)

True => False , False => True, Null => Null

boolean Booleans.and(boolean[] array)

boolean Booleans.or(boolean[] array)

boolean Booleans.xor(boolean[] array)

boolean Booleans.and(Boolean[] array)

boolean Booleans.or(Boolean[] array)

boolean Booleans.xor(Boolean[] array)

6.兩個char間的equals 

boolean Character.equalsIgnoreCase(char ch1, char ch2)

7.安全的加減乘除 

int Math.safeToInt(long value)

int Math.safeNegate(int value)

long Math.safeSubtract(long value1, int value2)

long Math.safeSubtract(long value1, long value2)

int Math.safeMultiply(int value1, int value2)

long Math.safeMultiply(long value1, int value2)

long Math.safeMultiply(long value1, long value2)

long Math.safeNegate(long value)

int Math.safeAdd(int value1, int value2)

long Math.safeAdd(long value1, int value2)

long Math.safeAdd(long value1, long value2)

int Math.safeSubtract(int value1, int value2)

8.map集合支援并發請求,且可以寫成 Map map = {name:"xxx",age:18};