J2SE 1.5 in a Nutshell 中文版
發(fā)表時(shí)間:2024-05-19 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Java2平臺(tái)標(biāo)準(zhǔn)版(J2SE)1.5版本(代號(hào)"Tiger")是對(duì)Java平臺(tái)和語(yǔ)言的下一個(gè)重要修改;目前1.5版本的J2SE包含了15個(gè)JSR的請(qǐng)求,相應(yīng)的JCP導(dǎo)致了將近100個(gè)顯著的修改.看到這個(gè)版本帶來(lái)了這么多激動(dòng)人心的變動(dòng),你可能想知道你應(yīng)該從哪里開始.和以往的發(fā)布...
Java2平臺(tái)標(biāo)準(zhǔn)版(J2SE)1.5版本(代號(hào)"Tiger")是對(duì)Java平臺(tái)和語(yǔ)言的下一個(gè)重要修改;目前1.5版本的J2SE包含了15個(gè)JSR的請(qǐng)求,相應(yīng)的JCP導(dǎo)致了將近100個(gè)顯著的修改.
看到這個(gè)版本帶來(lái)了這么多激動(dòng)人心的變動(dòng),你可能想知道你應(yīng)該從哪里開始.和以往的發(fā)布一樣,所有的改動(dòng)都會(huì)有一個(gè)清晰的列表保存在"Release notes guide".這篇來(lái)自J2SE開發(fā)團(tuán)隊(duì)的文章將帶領(lǐng)你巡視主要的變動(dòng),使得你可以在深入API文檔之前快速的把握J(rèn)2SE 1.5能提供什么.
J2SE 1.5版本將關(guān)注在下面幾個(gè)關(guān)鍵的主題:
簡(jiǎn)易的開發(fā) Ease of Development
可擴(kuò)展性和性能 Scalability and Performance
監(jiān)視和管理能力 Monitoring and Manageability
桌面客戶端 Desktop Client
還有一些特性也很重要,但是和這些主題不相關(guān),所以他們被列在了文末:
其他的特性 Miscellaneous Features
簡(jiǎn)易開發(fā) Ease of Development
你可能已經(jīng)看到了一些能使得開發(fā)變得更加簡(jiǎn)易的Java語(yǔ)言上新特性的報(bào)告.這些特性包括了泛型類別,元數(shù)據(jù),自動(dòng)裝箱,一個(gè)增強(qiáng)的for循環(huán),枚舉類型,靜態(tài)引入,C語(yǔ)言風(fēng)格的輸入輸出,變量參數(shù),并行工具和一個(gè)簡(jiǎn)單化了的RMI接口生成.
JSR 201包含了上述語(yǔ)言特性中的4個(gè):增強(qiáng)的for循環(huán),枚舉類型,靜態(tài)導(dǎo)入和自動(dòng)裝箱;JSR 175 說(shuō)明了元數(shù)據(jù)機(jī)能;而JSR 14則詳細(xì)說(shuō)明了泛型類別.
在javac編譯器中使用的默認(rèn)的語(yǔ)言是J2SE1.4.這就意味著如果你想使用任何的這些新語(yǔ)言特性必須在編譯的時(shí)候在javac的命令行上添加一個(gè)參數(shù) -source 1.5.(譯者按:這也是目前很多的開發(fā)人員下載了這個(gè)版本以后發(fā)現(xiàn)無(wú)法使用這些新特性的原因.)
元數(shù)據(jù) Metadata
J2SE 1.5 中的元數(shù)據(jù)特性提供了一個(gè)連接附加數(shù)據(jù)到Java Class,Interface,Method和Field中的能力.這些附加的數(shù)據(jù)或者注解能被javac編譯器或者其他的工具識(shí)別,并且可以根據(jù)配置保存在class文件中,并且能在運(yùn)行時(shí)通過(guò)Java的reflection API來(lái)發(fā)現(xiàn).
給Java平臺(tái)添加元數(shù)據(jù)的一個(gè)主要原因是似的開發(fā)和運(yùn)行工具能得到一個(gè)基礎(chǔ)框架,使得可以減少在編碼和發(fā)布的時(shí)候需要的額外的努力.一個(gè)工具能使用這些元數(shù)據(jù)信息來(lái)產(chǎn)生一些額外的代碼或者在調(diào)試的時(shí)候提供額外的信息.
代替元數(shù)據(jù)工具,下面的范例代碼創(chuàng)建了一個(gè)智能調(diào)試的元數(shù)據(jù)注解.這個(gè)注解將在隨后的調(diào)試中簡(jiǎn)單的顯示出來(lái).我們可以看到大部分的元數(shù)據(jù)標(biāo)簽組成了一個(gè)標(biāo)準(zhǔn)的,固定的集合.
import java.lang.annotation.*;
import java.lang.reflect.*;
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @interface debug {
boolean devbuild() default false;
int counter();
}
public class MetaTest {
final boolean production=true;
@debug(devbuild=production,counter=1) public void testMethod() {
}
public static void main(String[] args) {
MetaTest mt = new MetaTest();
try {
Annotation[] a = mt.getClass().getMethod("testMethod").getAnnotations();
for (int i=0; i<a.length ; i++) {
System.out.println("a["+i+"]="+a[i]+" ");
}
} catch(NoSuchMethodException e) {
System.out.println(e);
}
}
}
有了元數(shù)據(jù)處理工具,很多重復(fù)的編碼步驟可以減少到一個(gè)簡(jiǎn)潔的元數(shù)據(jù)標(biāo)簽中.比如訪問(wèn)JAX-RPC的時(shí)候需要的遠(yuǎn)程接口服務(wù)實(shí)現(xiàn)可以按照下面這樣實(shí)現(xiàn):
以前 Before
public interface PingIF extends Remote {
public void ping() throws RemoteException;
}
public class Ping implements PingIF {
public void ping() {
}
}
用了元數(shù)據(jù)后 After
public class Ping {
public @remote void ping() {
}
}
泛型類型 Generic Types
泛型類別在Java社區(qū)中已經(jīng)期待已久,現(xiàn)在泛型成了J2SE 1.5 的一部分.第一顯著的能看到泛型類別的地方是集合的API中.集合的API提供了一些通用功能例如:LinkedLists,ArrayLists和HashMaps等等這些能用于多種類型的集合類型.下面的例子使用J2SE 1.4.2的類庫(kù),并且使用默認(rèn)的javac編譯模式.
ArrayList list = new ArrayList();
list.add(0, new Integer(42));
int total = ((Integer)list.get(0)).intValue();
上面例子中最后一行一個(gè)強(qiáng)制轉(zhuǎn)型到Integer類型是泛型類別想解決的強(qiáng)制轉(zhuǎn)型問(wèn)題.這個(gè)問(wèn)題就是J2SE 1.4.2的集合API是用Object來(lái)存儲(chǔ)集合對(duì)象的,這就意味這集合不能在編譯的時(shí)候偵測(cè)到類型不符這樣的問(wèn)題.一個(gè)典型的問(wèn)題就是會(huì)在運(yùn)行時(shí)拋出ClassCastException.
下面是運(yùn)用了泛型類別后改寫的上面的范例:
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42));
int total = list.get(0).intValue();
這些泛型化的集合API強(qiáng)制在編譯的時(shí)候用<>來(lái)指定集合中存儲(chǔ)的數(shù)據(jù)類型.用了泛型以后就不再有轉(zhuǎn)型的需要了,而且在這個(gè)例子中如果試圖添加一個(gè)String類型的變量到這個(gè)聲明為Integer的集合中去將會(huì)導(dǎo)致一個(gè)編譯錯(cuò)誤.
泛型類別使得API的設(shè)計(jì)者能提供通用的機(jī)能,并且能運(yùn)用于多種數(shù)據(jù)類型,并且能在編譯的時(shí)候就檢查類型的安全性.
泛型的API要稍微復(fù)雜一些.建議可以從java.util.Collection包的源代碼和API的使用指南開始看起.
基本類型的自動(dòng)裝箱和自動(dòng)拆箱 Autoboxing and Auto-unboxing of Primitive Types
在基本類型和對(duì)應(yīng)的對(duì)象副本之間的轉(zhuǎn)化,例如從基本型int,boolean到他們相對(duì)應(yīng)的對(duì)象副本Integer和Boolean的轉(zhuǎn)化會(huì)需要一些根本不必要的代碼,特別是一些只在在集合API中會(huì)出現(xiàn)的轉(zhuǎn)化操作.
對(duì)Java基本類型的自動(dòng)裝箱和自動(dòng)拆箱使得代碼能更加簡(jiǎn)潔易懂.下面的這個(gè)例子示范了將一個(gè)int類型的數(shù)據(jù)存儲(chǔ)到一個(gè)ArrayList中,并且再取出來(lái).J2SE 1.5使得在int和Integer對(duì)象之間的轉(zhuǎn)化能自動(dòng)進(jìn)行.
以前 Before
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42));
int total = (list.get(0)).intValue();
使用自動(dòng)裝箱和自動(dòng)拆箱后 After
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, 42);
int total = list.get(0);
增強(qiáng)的for循環(huán) Enhanced for loop
在集合的API中,Iterator類別是使用率非常高的一個(gè)class.他提供了一種順序訪問(wèn)集合元素的能力.新增強(qiáng)的for循環(huán)能在簡(jiǎn)單的順序訪問(wèn)集合元素的時(shí)候代替Iterator.編譯器會(huì)自動(dòng)產(chǎn)生必要的帶類型安全,并且不需要轉(zhuǎn)型操作的循環(huán)代碼.
以前 Before
ArrayList<Integer> list = new ArrayList<Integer>();
for (Iterator i = list.iterator(); i.hasNext();) {
Integer value=(Integer)i.next();
}
使用增強(qiáng)for循環(huán)以后 After
ArrayList<Integer> list = new ArrayList<Integer>();
for (Integer i : list) { ... }
枚舉化的類型 Enumerated types
這種類型和使用static final的常量相比提供了枚舉化的類型.如果你曾經(jīng)在你的代碼中用enum這樣的變量名,當(dāng)你用javac -source 1.5進(jìn)行編譯的時(shí)候?qū)⑿枰{(diào)整一下你的代碼,因?yàn)镴2SE 1.5 引入了一個(gè)新的關(guān)鍵字enum.
public enum StopLight { red, amber, green };
靜態(tài)引入 Static Import
靜態(tài)引入的特性是用"import static"這樣的語(yǔ)句使得你能不輸入類名就可以直接使用一個(gè)類中的靜態(tài)常量.比如我們經(jīng)常在添加一個(gè)控件的時(shí)候用的BorderLayout.CENTER,使用了靜態(tài)引入后,你只需要簡(jiǎn)單的調(diào)用CENTER就可以了.
import static java.awt.BorderLayout.*;
getContentPane().add(new JPanel(), CENTER);
格式化的輸出 Formatted Output
開發(fā)人員現(xiàn)在可以使用類似C語(yǔ)言中的printf這樣的功能來(lái)產(chǎn)生格式化的輸出.現(xiàn)在可以象C語(yǔ)言中一樣使用printf,而且語(yǔ)言上基本沒(méi)有變化,一般可以不變,有些格式可能需要稍微的變化一下.
大部分的通用C printf格式都可以使用,同時(shí)一些Java的類例如Date和BigInteger也擁有了格式化規(guī)則.可以在java.util.Formatter類中找到更多的信息.
System.out.printf("name count\n");
System.out.printf("%s %5d\n", user,total);
格式化的輸入 Formatted Input
這個(gè)Scanner API提供了基本的讀入數(shù)據(jù)的功能,例如從控制臺(tái)上或者其他任何的數(shù)據(jù)流中讀入數(shù)據(jù)的功能.下面的范例從標(biāo)準(zhǔn)輸入中讀入了一個(gè)字符串并且希望字符串隨后是一個(gè)int值.
Scanner中的方法例如next和nextInt會(huì)在沒(méi)有數(shù)據(jù)的時(shí)候自動(dòng)失效.如果你需要處理一個(gè)非常復(fù)雜的輸入,那么還可以使用java.util.Formatter類中的模式匹配算法.
Scanner s=Scanner.create(System.in);
String param= s.next();
int value=s.nextInt();
s.close();
不定參數(shù) Varargs
不定參數(shù)(varargs)機(jī)能允許在一個(gè)方法中傳入多個(gè)不定數(shù)量的參數(shù).而這只是簡(jiǎn)單需要用...來(lái)表示某個(gè)方法接受不定參數(shù).而這正是在printf方法中接受任意數(shù)量個(gè)參數(shù)的基礎(chǔ).
void argtest(Object ... args) {
for (int i=0;i <args.length; i++) {
}
}
argtest("test", "data");
并行工具 Concurrency Utilities
并行工具包是由Doug Lea在帶領(lǐng)的JSR-166中提出要添加到J2SE 1.5中去的,這是一個(gè)非常流行的并行工具包.他提供了功能強(qiáng)大的,高層次的線程構(gòu)造器,包含了執(zhí)行器,例如一個(gè)線程任務(wù)框架,線程安全的隊(duì)列,計(jì)時(shí)器,鎖(包含了原子級(jí)別的鎖)和其他一些同步的基本類型.
其中的鎖是一個(gè)眾所周知的信號(hào).一個(gè)信號(hào)能在現(xiàn)在使用wait的地方使用,他通常用來(lái)限制對(duì)某一代碼塊的訪問(wèn).信號(hào)量將更加靈活并且能允許多個(gè)并行的線程來(lái)訪問(wèn),也允許你在得到一個(gè)鎖之前可以測(cè)試這個(gè)鎖.下面的代碼示范了使用一個(gè)信號(hào)量,也被稱為是二分信號(hào).更多的信息請(qǐng)參看java.util.concurrent包.
final private Semaphore s= new Semaphore(1, true);
s.acquireUninterruptibly(); //for non-blocking version use s.acquire()
balance=balance+10; //protected value
s.release(); //return semaphore token
rmi編譯器--rmic rmic -- the rmi Compiler
你可能再也不需要使用rmic來(lái)產(chǎn)生那些遠(yuǎn)程的接口樁.動(dòng)態(tài)代理的方法說(shuō)明了通常由樁提供的信息可以在在運(yùn)行時(shí)被發(fā)現(xiàn).更多的信息請(qǐng)參看RMI release notes.
可擴(kuò)展性和性能 Scalability and Performance
J2SE 1.5版本的發(fā)布保證改進(jìn)可擴(kuò)展性和性能,尤其是在啟動(dòng)時(shí)和內(nèi)存印記的時(shí)候,使得能更加簡(jiǎn)單的發(fā)布一個(gè)應(yīng)用程序并且運(yùn)行的非?.
一個(gè)非常顯著的更新是介紹類數(shù)據(jù)在Hotspot JVM中的分享.這個(gè)技術(shù)不僅在多個(gè)運(yùn)行的JVM之間分享只讀數(shù)據(jù),并且改進(jìn)了啟動(dòng)時(shí)間,使得看起來(lái)這些類都象JVM的核心的類一樣是預(yù)先裝載的.
性能的人體工程學(xué)是J2SE 1.5中的一個(gè)新特性,這意味這如果你在過(guò)去的J2SE版本中使用過(guò)特殊的JVM運(yùn)行時(shí)選項(xiàng)來(lái)提升性能,這將值得你在J2SE的JVM中沒(méi)有JVM運(yùn)行時(shí)沒(méi)有參數(shù)或者少量參數(shù)的情況下重新驗(yàn)證你的性能,因?yàn)镴2SE的性能已經(jīng)提升了很多了.
監(jiān)視和管理 Monitoring and Manageability
監(jiān)視和管理是Java平臺(tái)上RAS(Reliability, Availability, Serviceability)的一個(gè)關(guān)鍵組件.
JVM的監(jiān)視和管理API(JSR-174)詳細(xì)說(shuō)明了一套非常容易理解的JVM內(nèi)部機(jī)制,這些內(nèi)部機(jī)制在一個(gè)運(yùn)行的JVM上被監(jiān)視到.這個(gè)信息是通過(guò)JMX(JSR-003)消息Bean來(lái)訪問(wèn)的,并且能通過(guò)JMX的遠(yuǎn)程接口(JSR-160)來(lái)遠(yuǎn)程的訪問(wèn)或者通過(guò)業(yè)界標(biāo)準(zhǔn)的SNMP工具來(lái)訪問(wèn).
最重要的特性之一是一個(gè)底層的內(nèi)存探測(cè)器 .當(dāng)入口(threshold)交叉的時(shí)候,JMX MBeans能通知那些被注冊(cè)過(guò)的監(jiān)聽器,詳細(xì)內(nèi)容請(qǐng)參看javax.management 和 java.lang.management
為了能直觀的看到使用這些 API是多么的簡(jiǎn)單,下面就有一個(gè)報(bào)告在Hotspot JVM中內(nèi)存堆棧詳細(xì)使用情況的范例.
import java.lang.management.*;
import java.util.*;
import javax.management.*;
public class MemTest {
public static void main(String args[]) {
List pools =ManagementFactory.getMemoryPoolMBeans();
for(ListIterator i = pools.listIterator(); i.hasNext();) {
MemoryPoolMBean p = (MemoryPoolMBean) i.next();
System.out.println("Memory type="+p.getType()+" Memory usage="+p.getUsage());
}
}
}
新的JVM 整形API(JSR-163) New JVM profiling API (JSR-163)
這次的發(fā)布還包含了一個(gè)非常強(qiáng)勁的本地整形API叫做JVMTI.這套API在JSR163中已經(jīng)詳細(xì)說(shuō)明過(guò),并且是針對(duì)改進(jìn)整形接口的需求而來(lái)的.不管怎么樣,JVMTI想關(guān)注所有本地進(jìn)程內(nèi)的工具訪問(wèn).除了整形以外,還包括了監(jiān)視,調(diào)試和一個(gè)可能將會(huì)支持多種代碼分析的工具.
這些API的實(shí)現(xiàn)包括了一套bytecode測(cè)試設(shè)備的機(jī)制,JPLIS(Java Programming Language Instrumentation Services -Java編程語(yǔ)言測(cè)試設(shè)備服務(wù)).這將允許分析工具在必要的時(shí)候來(lái)添加額外的整形.這個(gè)技術(shù)的優(yōu)點(diǎn)是他允許更多的焦點(diǎn)分析并且限制JVM中跑的不同的整形工具之間的沖突.這套測(cè)試設(shè)備甚至能在運(yùn)行時(shí)自動(dòng)的生成,就如同class的裝載時(shí)候和預(yù)處理的class文件一樣.
下面的范例建立了一套能從磁盤上裝載一個(gè)修改過(guò) class文件的測(cè)試設(shè)備勾子.要運(yùn)行下面的測(cè)試,在啟動(dòng)JRE的時(shí)候,用java -javaagent:myBCI BCITest的方式.
//File myBCI.java
import java.lang.instrument.Instrumentation;
public class myBCI {
private static Instrumentation instCopy;
public static void premain(String options, Instrumentation inst) {
instCopy = inst;
}
public static Instrumentation getInstrumentation() {
return instCopy;
}
}
//File BCITest.java
import java.nio.*;
import java.io.*;
import java.nio.channels.*;
import java.lang.instrument.*;
public class BCITest {
public static void main (String[] args) {
try {
OriginalClass mc = new OriginalClass();
mc.message();
FileChannel fc=new FileInputStream(new File("modified"+File.separator+"OriginalClass.class")).getChannel();
ByteBuffer buf = fc.map(FileChannel.MapMode.READ_ONLY, 0, (int)fc.size());
byte[] classBuffer = new byte[buf.capacity()];
buf.get(classBuffer, 0, classBuffer.length);
myBCI.getInstrumentation().redefineClasses(new ClassDefinition[] {new ClassDefinition(mc.getClass(), classBuffer)});
mc.message();
}catch (Exception e){}
}
}
//OriginalClass.java
//Compile in current directory
//Copy source to modified directory,change message and recompile
public class OriginalClass {
public void message() {
System.out.println("OriginalClass");
}
}
改進(jìn)的診斷能力 Improved Diagnostic Ability
在沒(méi)有控制臺(tái)窗口的時(shí)候生成堆棧跟蹤是無(wú)用的.現(xiàn)在有兩個(gè)新的API,getStackTrace和Thread.getAllStackTraces提供了使得這些信息可編程的能力.
StackTraceElement e[]=Thread.currentThread().getStackTrace();
for (int i=0; i <e.length; i++) {
System.out.println(e[i]);
}
System.out.println("\n"+Thread.getAllStackTraces());
Hotspot JVM包括了一個(gè)致命錯(cuò)誤的處理機(jī)制,使得在JVM放棄的時(shí)候運(yùn)行一個(gè)用戶支持的腳本或者一段程序.一個(gè)調(diào)試工具也能用Hotspot JVM的可服務(wù)代理連接器連接到這個(gè)已經(jīng)掛起的JVM或者那些核心文件.
-XX:OnError="command"
-XX:OnError="pmap %p"
-XX:OnError="gdb %p"
optional %p used as process id
桌面客戶端 Desktop Client
Java的桌面客戶端仍然是作為Java平臺(tái)的一個(gè)關(guān)鍵組件,同時(shí)這個(gè)組件在J2SE 1.5中也有了很大的改進(jìn).
在這次的Beta發(fā)布中包含了一些早先對(duì)啟動(dòng)時(shí)間和內(nèi)存印記的改進(jìn).不僅變的快速了,而且Swing的工具中還帶了一個(gè)嶄新的界面風(fēng)格叫做Ocean.
在J2SE 1.4.2的基礎(chǔ)上,對(duì)GTK可更換的Look and Feel以及Window XP的Look and Feel有了進(jìn)一步的改進(jìn).
Windows XP
Click to Enlarge
Linux/Redhat
Click to Enlarge
Linux和Solaris的用戶只要有最新的OpenGL驅(qū)動(dòng)和顯卡,就能讓Java2D得到本地的硬件加速,可以非常顯著的改善顯示效果,只需要在啟動(dòng)的時(shí)候添加下面這樣的參數(shù)就可以了:
java -Dsun.java2d.opengl=true -jar Java2D.
同時(shí)在Linux的發(fā)布版本中還包含了一個(gè)快速的X11工具包,叫做XAWT,默認(rèn)就是使用這個(gè)工具包的.如果你需要使用過(guò)去的motif的工具包,你需要在啟動(dòng)的時(shí)候添加如下的系統(tǒng)參數(shù):
java -Dawt.toolkit=sun.awt.motif.MToolkit -jar Notepad.jar
(X11的工具包叫做sun.awt.X11.XToolkit)
同時(shí)X11的工具包還使用了xDnD的協(xié)議,所以你可以在Java和其他應(yīng)用程序之間,比如StarOffice或者M(jìn)ozilla,拖拽簡(jiǎn)單的組件.
其他的一些新特性 Miscellaneous Features
核心支持XML Core XML Support
J2SE 1.5 介紹了一些對(duì)核心XML平臺(tái)的修改,包括了XML 1.1,Namespace,XML Schema.還有SAX 2.0.1,XSLT和快速的XLSTC編譯器,還有對(duì)DOM level 3的支持.
除了對(duì)核心XML的支持特性以外,JWSDP(Java Web Services Developer Pack)將會(huì)發(fā)布最新的Web services標(biāo)準(zhǔn):JAX-RPC & SAAJ(WSDL/SOAP),JAXB,XML加密以及數(shù)字簽名和注冊(cè)用的JAXR.
補(bǔ)充的字符支持 Supplementary Character Support
32位的補(bǔ)充字符支持是被非常小心的添加到了J2SE 1.5中來(lái)的,他是作為過(guò)渡到Unicode 4.0支持的一個(gè)部分.補(bǔ)充的字符被編碼成特殊的一對(duì)對(duì)UTF16的值來(lái)生成一個(gè)個(gè)不同的字符,或者從代碼的角度來(lái)看,被代替的一對(duì)值是由一個(gè)高位的UTF16值緊隨一個(gè)低位的UTF16值,而這個(gè)高位和低位的值都是從一個(gè)特殊的UTF16值范圍內(nèi)取出來(lái)的.
通俗點(diǎn)說(shuō),當(dāng)使用一個(gè)String或者字符序列的時(shí)候,核心的API庫(kù)會(huì)透明的為你處理這些補(bǔ)充的字符.但是java的char類型數(shù)據(jù)仍然是16位的,少數(shù)使用char作為參數(shù)的方法現(xiàn)在有了相應(yīng)的能接受一個(gè)int值的方法,這些方法能表現(xiàn)新的這些大值.特別是Character類,添加了一些象下面代碼中的方法來(lái)找回當(dāng)前的字符和隨后的字符來(lái)支持這些補(bǔ)充的字符:
String u="\uD840\uDC08";
System.out.println(u+"+ "+u.length());
System.out.println(Character.isHighSurrogate(u.charAt(0)));
System.out.println((int)u.charAt(1));
System.out.println((int)u.codePointAt(0));
詳細(xì)信息請(qǐng)參考Character類中的Unicode部分.
JDBC的行集 JDBC RowSets
對(duì)JDBC 行集的支持上有兩個(gè)更新.一個(gè)是CachedRowSet,包含了保存在內(nèi)存中從數(shù)據(jù)庫(kù)中取回來(lái)的行集合.并且他們是未連接的,這就意味著對(duì)這些行集的更新可以在過(guò)一段時(shí)間后同步到數(shù)據(jù)庫(kù)中.
另外一個(gè)是WebRowSet,是一種用XML的方式來(lái)傳遞數(shù)據(jù)庫(kù)中的行數(shù)據(jù)信息.