教學(xué)內(nèi)容
第七講 Java常用類庫介紹
7.1 Java類庫的結(jié)構(gòu)
類庫就是Java API(Application Programming Interface,應(yīng)用程序接口),是系統(tǒng)提供的已實(shí)現(xiàn)的標(biāo)準(zhǔn)類的集合。在程序設(shè)計(jì)中,合理和充分利用類庫提供的類和接口,不僅可以完成字符串處理、繪圖、網(wǎng)絡(luò)應(yīng)用、數(shù)學(xué)計(jì)算等多方面的工作,而且可以大大提高編程效率,使程序簡(jiǎn)練、易懂。
Java類庫中的類和接口大多封裝在特定的包里,每個(gè)包具有自己的功能。表7.1列出了Java中一些常用的包及其簡(jiǎn)要的功能。其中,包名后面帶“. *”的表示其中包括一些相關(guān)的包。有關(guān)類的介紹和使用方法,Java中提供了極其完善的技術(shù)文檔。我們只需了解技術(shù)文檔的格式就能方便地查閱文檔。
表7.1Java提供的部分常用包
包名 |
主要功能 |
java.applet |
提供了創(chuàng)建applet需要的所有類 |
java.awt.* |
提供了創(chuàng)建用戶界面以及繪制和管理圖形、圖像的類 |
java.beans.* |
提供了開發(fā)Java Beans需要的所有類 |
java.io |
提供了通過數(shù)據(jù)流、對(duì)象序列以及文件系統(tǒng)實(shí)現(xiàn)的系統(tǒng)輸入、輸出 |
java.lang.* |
Java編程語言的基本類庫 |
java.math.* |
提供了簡(jiǎn)明的整數(shù)算術(shù)以及十進(jìn)制算術(shù)的基本函數(shù) |
java.rmi |
提供了與遠(yuǎn)程方法調(diào)用相關(guān)的所有類 |
java.net |
提供了用于實(shí)現(xiàn)網(wǎng)絡(luò)通訊應(yīng)用的所有類 |
java.security.* |
提供了設(shè)計(jì)網(wǎng)絡(luò)安全方案需要的一些類 |
java.sql |
提供了訪問和處理來自于Java標(biāo)準(zhǔn)數(shù)據(jù)源數(shù)據(jù)的類 |
java.test |
包括以一種獨(dú)立于自然語言的方式處理文本、日期、數(shù)字和消息的類和接口 |
java.util.* |
包括集合類、時(shí)間處理模式、日期時(shí)間工具等各類常用工具包 |
javax.accessibility |
定義了用戶界面組件之間相互訪問的一種機(jī)制 |
javax.naming.* |
為命名服務(wù)提供了一系列類和接口 |
javax.swing.* |
提供了一系列輕量級(jí)的用戶界面組件,是目前Java用戶界面常用的包 |
注:在使用Java時(shí),除了java.lang外,其他的包都需要import語句引入之后才能使用。
7.2 java.lang包中的常用類
java.lang是Java語言最廣泛使用的包。它所包括的類是其他包的基礎(chǔ),由系統(tǒng)自動(dòng)引入,程序中不必用import語句就可以使用其中的任何一個(gè)類。java.lang中所包含的類和接口對(duì)所有實(shí)際的Java程序都是必要的。下面我們將分別介紹幾個(gè)常用的類。
7.2.1 String類和StringBuffer類
許多語言中,字符串是語言固有的基本數(shù)據(jù)類型。但在Java語言中字符串通過String類和StringBuffer類來處理。
1.String類
Java語言中的字符串屬于String類。雖然有其它方法表示字符串(如字符數(shù)組),但Java使用String類作為字符串的標(biāo)準(zhǔn)格式。Java編譯器把字符串轉(zhuǎn)換成String對(duì)象。String對(duì)象一旦被創(chuàng)建了,就不能被改變。如果需要進(jìn)行大量的字符串操作,應(yīng)該使用StringBuffer類或者字符數(shù)組,最終結(jié)果可以被轉(zhuǎn)換成String格式。
(1)創(chuàng)建字符串
創(chuàng)建字符串的方法有多種方式,通常我們用String類的構(gòu)造器來建立字符串。表6.2列出了String類的構(gòu)造器及其簡(jiǎn)要說明。
表7.2 String類構(gòu)造器概要
構(gòu)造器 |
說明 |
String( ) |
初始化一個(gè)新的String對(duì)象,使其包含一個(gè)空字符串 |
String(char[ ] value ) |
分配一個(gè)新的String對(duì)象,使它代表字符數(shù)組參數(shù)包含的字符序列 |
String(char[ ] valu, int offset,int count) |
分配一個(gè)新的String對(duì)象,使它包含來自字符數(shù)組參數(shù)中子數(shù)組的字符 |
String(Stringvalue ) |
初始化一個(gè)新的String對(duì)象,使其包含和參數(shù)字符串相同的字符序列 |
String(StringBufferbuffer ) |
初始化一個(gè)新的String對(duì)象,它包含字符串緩沖區(qū)參數(shù)中的字符序列 |
【例7.1】使用多種方法創(chuàng)建一個(gè)字符串并輸出字符串內(nèi)容。
public class StrOutput {
public static void main(Sring[] args) {
//將字符串常量作為String對(duì)象對(duì)待,實(shí)際上是將一個(gè)String對(duì)象賦值給另一個(gè)
String s1 = "Hello,java!";
//聲明一個(gè)字符串,然后為其賦值
String s2;
s2 = "Hello,java!";
//使用String類的構(gòu)造器中的一個(gè)。創(chuàng)建一個(gè)空字符串,然后賦值給它
String s3 = new String( );
S3 = "Hello,java!";
//將字符串直接傳遞給String類構(gòu)造器來創(chuàng)建新的字符串
String s4 = new String("Hello,java!");
//使用String類的構(gòu)造器中的一個(gè)。
//通過創(chuàng)建字符數(shù)組傳遞給String類構(gòu)造器來創(chuàng)建新的字符串
Char c1[ ] = { ' H', ' i', ' , ' , 'j', 'a', 'v', 'a'};
String s5 = newString(c1 );
//將字符數(shù)組子集傳遞給String類構(gòu)造器來創(chuàng)建新的字符串
String s6 = new String(c1,0,2 );
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
System.out.println(s5);
System.out.println(s6);
}
}
運(yùn)行結(jié)果:
C:\>java StrOutput
Hello,java!
Hello,java!
Hello,java!
Hello,java!
Hi,java
Hi
(2)字符串的操作
Java語言提供了多種處理字符串的方法。表6.3列出了String類常用的方法。
表7.3 String類的常用方法
方法 |
說明 |
char charAt(int index) |
獲取給定的Index處的字符 |
int compareTo(String anotherString) |
按照字典的方式比較兩個(gè)字符串 |
int compareToIgnoreCase(String str) |
按照字典的方式比較兩個(gè)字符串,忽略大小寫 |
String concat(String str ) |
將給定的字符串連接到這個(gè)字符串的末尾 |
static String copyValueOf(char[ ] data) |
創(chuàng)建一個(gè)和給定字符數(shù)組相同的String對(duì)象 |
static String copyValueOf(char[ ]data ,
int offset,int count) |
使用偏移量,創(chuàng)建一個(gè)和給定字符數(shù)組相同的String對(duì)象 |
boolean equals(Object anObject) |
將這個(gè)String對(duì)象和另一個(gè)對(duì)象String進(jìn)行比較 |
boolean equalsIgnoreCase(Sting anotherString) |
將這個(gè)String對(duì)象和另一個(gè)對(duì)象String進(jìn)行比較,忽略大小寫 |
void getChars(getChars(int strbegin,
int strend,char[ ] data,int offset) |
將這個(gè)字符串的字符拷貝到目的數(shù)組 |
int indexOf(int char) |
產(chǎn)生這個(gè)字符串中出現(xiàn)給定字符的第一個(gè)位置的索引 |
int indexOf(int ch,int fromIndex) |
從給定的索引處開始,產(chǎn)生這個(gè)字符串中出現(xiàn)給定字符的第一個(gè)位置的索引 |
int indexOf(String str) |
產(chǎn)生這個(gè)字符串中出現(xiàn)給定子字符的第一個(gè)位置的索引 |
int indexOf(String str,int fromIndex) |
從給定的索引處開始,產(chǎn)生這個(gè)字符串中出現(xiàn)給定子字符的第一個(gè)位置的索引 |
int length( ) |
產(chǎn)生這個(gè)字符串的長(zhǎng)度 |
boolean regionMatches(boolean ignoreCase,int toffset,String other,int ooffset,int len) |
檢查兩個(gè)字符串區(qū)域是否相等,允許忽略大小寫 |
String replace(char oldChar,char newChar) |
通過將這個(gè)字符串中的odChar字符轉(zhuǎn)換為newChar字符來創(chuàng)建一個(gè)新字符串 |
boolean starsWith(String prefix) |
檢查這個(gè)字符串是否以給定的前綴開頭 |
boolean starsWith(String prefix,int toffset) |
從給定的索引處開頭,檢查這個(gè)字符串是否以給定的前綴開頭 |
String substring(int strbegin) |
產(chǎn)生一個(gè)新字符串,它是這個(gè)字符串的子字符串 |
String substring(int strbegin,int strend) |
產(chǎn)生一個(gè)新字符串,它是這個(gè)字符串的子字符串,允許指定結(jié)尾處的索引 |
char[ ] toCharArray( ) |
將這個(gè)字符串轉(zhuǎn)換為新的字符數(shù)組 |
String toLowerCase( ) |
將這個(gè)String對(duì)象中的所有字符變?yōu)樾?/P> |
String toString( ) |
返回這個(gè)對(duì)象(它已經(jīng)是一個(gè)字符串) |
String toUpperCase( ) |
將這個(gè)String對(duì)象中的所有字符變?yōu)榇髮?/P> |
String trim( ) |
去掉字符串開頭和結(jié)尾的空格 |
static String valueOf(int i) |
將int參數(shù)轉(zhuǎn)化為字符串返回。該方法有很多重載方法,用來將基本數(shù)據(jù)類型轉(zhuǎn)化為字符串。如:static String valueOf(float f),static String valueOf(long l)等 |
下面結(jié)合常用的方法,介紹幾種典型的字符串操作。
①字符串的比較
Java語言提供了四種字符串的比較方法,這些方法有些類似于操作符。例如,可以使用equals、equalsIgnoreCase、regionMatches和compareTo方法來實(shí)現(xiàn)對(duì)字符串的比較。調(diào)用形式如下:
s1.equals(s2) ----- 如果s1等于s2,返回true,否則為false。
s1. equalsIgnoreCase (s2) ----- 如果s1等于s2,返回true,否則為false,忽略大小寫。
s1. regionMatches(boolean ignoreCase,int toffset,s2,int ooffset,int len ) ----- 如果s1和 s2的子串相等,返回true,否則為false。其中,ignoreCase為忽略大小寫設(shè)置,true為忽略大小寫,false為不忽略大小寫,toffset確定s1的起始偏移量,ooffset確定s2的起始偏移量,len確定子串的長(zhǎng)度。
s1. compareTo (s2) -----如果s1<s2,則返回小于0的值;如果s1=s2,則返回0;如果s1>s2,則返回大于0的值
【例7.2】比較字符串。
public class StrCompare {
public static void main(Sring[] args) {
String s1="aaaa";
String s2="aaaa";
String s3="AAAA";
String s4="bcd";
if (s1.equals(s2)) {
System.out.println("s1==s2");
}
else {
System.out.println("s1!=s2");
}
if (s1.equalsIgnoreCase(s3)) {
System.out.println(" s1= =s3 when ignoring case");
}
else {
System.out.println(" s1!=s3 when ignoring case");
}
if (s1.regionMatches(true,0,s3,1,3)) {
System.out.println(" s1= =s3 when ignoring case");
}
else {
System.out.println(" s1!=s3 when ignoring case");
}
if (s1.regionMatches(false,0,s3,1,3)) {
System.out.println(" s1= =s3 when not ignoring case");
}
else {
System.out.println("s1!=s3 when not ignoring case");
}
if (s1.compareTo(s4)<0) {
System.out.println(" s1<s4");
}
else if (s1.compareTo(s4)= =0){
System.out.println("s1= =s4");
}
else{
System.out.println("s1>s4");
}
}
}
運(yùn)行結(jié)果:
C:\>java StrCompare
s1= =s2
s1= =s3 when ignoring case
s1= =s3 when ignoring case
s1!= =s3 when not ignoring case
s1<s4
②求字符串長(zhǎng)度
使用String類的length方法,調(diào)用形式如下:
s1.length( ) ----- 返回s1的長(zhǎng)度,其類型為int。
【例7.3】求指定字符串的長(zhǎng)度。
public class StrLength
{public static void main(Sring[] args)
{String s1="Hello,Java!";
int i=s1.length();
System.out.println("字符串s1長(zhǎng)度為"+i);
}
}
運(yùn)行結(jié)果:
C:\>java StrLength
字符串s1長(zhǎng)度為11
③連接字符串
可以使用兩種方法將字符串連接起來:+操作符、用String類的concat方法。Concat方法的調(diào)用形式如下:
s1.concat(s2) ----- 將兩個(gè)字符串連接起來。
s1.concat(“字符串常量”) ----- 將字符串和字符串常量連接起來。
【例7.4】使用+和concat方法創(chuàng)建同一個(gè)字符串。
public class StrConcat
{public static void main(Sring[] args)
{String s1="Hello";
String s2=s1+",";
String s3=s2.concat(" Java");!
String s4=new String(" ! ");
String s5=s4.concat(s4);
System.out.println(" 連接而成的字符串是"+s5);
}
}
運(yùn)行結(jié)果:
C:\>java StrConcat
連接而成的字符串是Hello,Java!
④拷貝字符串
可以有四種方法將一個(gè)字符串復(fù)制到另一個(gè)字符數(shù)組或String對(duì)象中:copyValueOf、getChars、toCharArray、substring。調(diào)用形式:
s1.copyValueOf(data) ----- 將數(shù)組data中的內(nèi)容全部拷貝到字符串中。
s1.copyValueOf(data,int offset,int count) ----- 將數(shù)組data中以offset起始,長(zhǎng)度為count的內(nèi)容拷貝到字符串中。
s1.getChars(int strbegin,int strend, data,int offset) ----- 將s1的全部或部分內(nèi)容拷貝到數(shù)組data中。其中,strbegin為字符的起始,strend 為字符的終止,offset為字符數(shù)組的起始。
data=s1.toCharArray( ) ----- 將s1中的全部?jī)?nèi)容拷貝到一個(gè)字符數(shù)組data中。
s2=s1.substring(int strbegin) ----- 將s1中以stregin起始的內(nèi)容拷貝到s2中。
s2=s1.substring(int strbegin,int strend) ----- 將s1中以stregin起始,以strend結(jié)束之間的內(nèi)容拷貝到s2中。
【例7.5】拷貝字符串。
public class StrCopy
{public static void main(Sring[] args)
{
String s1=new String( );
char data[ ]={ 'a', 'b', 'c', 'd', 'e', 'f'};
s1=s1.copyValueOf(data);
System.out.println(" s1="+s1);
s1=s1.copyValueOf(data,2,3);
System.out.println(" s1="+s1);
s1.getChars(1,2, data,0)
System.out.println(" data="+data);
data=s1. toCharArray( );
System.out.println(" data="+data);
String s2=new String( );
String s3=new String( );
s2=s1.substring(0);
System.out.println(" s2="+s2);
s3= s1.substring(1,2);
System.out.println(" s3="+s3);
}
}
運(yùn)行結(jié)果:
C:\>java StrCopy
s1=abcdef
s2=cde
data=decdef
data=cde
s2=cde
s3=de
⑤在字符串中查找字符和子串
在字符串中查找字符和子串,確定它們的位置,有幾種常用的方法:charAt、indexOf、lastIndexOf。調(diào)用形式如下:
s1.chatAt(int index)--------返回s1中index所對(duì)應(yīng)的字符。其中,index是下標(biāo)號(hào)。
s1. indexOf (int char)--------返回s1中字符char在字符串中第一次出現(xiàn)的位置。
s1. lastIndexOf (int char)--------返回s1中字符char在字符串中最后一次出現(xiàn)的位置。
s1. indexOf (s2)--------返回s2在s1中第一次出現(xiàn)的位置。
s1. lastIndexOf (s2)--------返回s2在s1中最后一次出現(xiàn)的位置。
【例7.6】查找字符和子串。
public class StrSearch
{public static void main(Sring[] args)
{
String s1="Javav";
char c=s1.charAt(2);
System.out.println("c=",+c);
int i=s1.indexOf('a');
System.out.println("fistchar=",+i);
int j=s1.lastIndexOf('a');
System.out.println("lastchar=",+j);
i= s1.indexOf("av");
System.out.println("fiststring=",+i);
j=s1.lastIndexOf("av");
System.out.println("laststring=",+j);
}
}
運(yùn)行結(jié)果:
C:\>java StrSearch
c=v
firstchar=1
lastchar=3
firststring=1
laststring=3
⑥修改字符串
修改字符串的常用方法有:replace、toLowerCase、toUpperCase、trim。調(diào)用形式如下:
s1.replace(oldchar,newchar)--------用新字符newchar替代舊字符oldchar,若指定字符不存在,則不替代。
s1.toLowerCase( )--------將s1中的所有大寫字母轉(zhuǎn)換為小寫字母。
s1.toUpperCase( )-------- 將s1中的所有小寫字母轉(zhuǎn)換為大寫字母。
s1.trim( )--------刪除s1中的首、尾空格。
【例7.7】修改字符串。
public class StrModify
{public static void main(Sring[] args)
{
String s1="Java";
s1=s1.replae('a', 'b');
System.out.println("s1=",+s1);
String s2=s1.toLowerCase( );
String s3=s1. toUpperCase ( );
System.out.println("s2=",+s2);
System.out.println("s3=",+s3);
s2= s1.trim( );
System.out.println("s2=",+s2);
}
}
運(yùn)行結(jié)果:
C:\>java StrModify
s1= Jbvb
s2= jbvb
s3= JBVB
s2= jbvb
2.StringBuffer類
緩沖字符串類StringBuffer與String類相似,它具有String類的很多功能,甚至更豐富。它們主要的區(qū)別是StringBuffer對(duì)象可以方便地在緩沖區(qū)內(nèi)被修改,如增加、替換字符或子串。與Vector對(duì)象一樣,StringBuffer對(duì)象可以根據(jù)需要自動(dòng)增長(zhǎng)存儲(chǔ)空間,故特別適合于處理可變字符串。當(dāng)完成了緩沖字符串?dāng)?shù)據(jù)操作后,可以通過調(diào)用其方法StringBuffer.toString( )或String構(gòu)造器把它們有效地轉(zhuǎn)換回標(biāo)準(zhǔn)字符串格式。
(1)創(chuàng)建StringBuffer對(duì)象
可以使用StringBuffer類的構(gòu)造器來創(chuàng)建StringBuffer對(duì)象。表6.4 是StringBuffer的構(gòu)造器及其簡(jiǎn)要說明。
表6.4StringBuffer類構(gòu)造器概要
構(gòu)造器 |
說明 |
StringBuffer( ) |
構(gòu)造一個(gè)空的緩沖字符串,其中沒有字符,初始長(zhǎng)度為16個(gè)字符的空間 |
StringBuffer(int length) |
構(gòu)造一個(gè)長(zhǎng)度為length的空緩沖字符串 |
StringBuffer(String str) |
構(gòu)造一個(gè)緩沖字符串,其內(nèi)容初始化為給定的字符串str,再加上16個(gè)字符的空間 |
【例7.8】用多種方法創(chuàng)建StringBuffer對(duì)象。
public class StrBufferSet
{public static void main(Sring[] args)
{
StringBuffers1=new StringBuffer( );
s1.append("Hello,Java!");
System.out.println("s1=" +s1);
StringBuffers2=new StringBuffer(10 );
S2.insert(0, "Hello,Java!");
System.out.println("s2="+s2);
StringBuffers3=new StringBuffer("Hello,Java!");
System.out.println("s3="+s3);
}
}
運(yùn)行結(jié)果:
C:\>java StrBufferSet
s1=Hello,Java!
s2=Hello,Java!
s3=Hello,Java!
(2)StringBuffer類的常用方法
StringBuffer類是可變字符串,因此它的操作主要集中在對(duì)字符串的改變上。
①為StringBuffer的對(duì)象插入和追加字符串
可以在StringBuffer對(duì)象的字符串之中插入字符串,或在其之后追加字符串,經(jīng)過擴(kuò)充之后形成一個(gè)新的字符串,方法有:append和insert,調(diào)用形式如下:
s1.append(s2)--------將字符串s2加到s1之后。
s1.insert(int offset,s2)--------在s1從起始處offset開始插入字符串s2。
append和insert都有多個(gè)重載方法,這里不一一贅述。關(guān)于append和insert方法的使用見例6.8 。
②獲取和設(shè)置StringBuffer對(duì)象的長(zhǎng)度和容量
獲取和設(shè)置StringBuffer對(duì)象的長(zhǎng)度和容量的方法有:length、capacity、setlength,調(diào)用形式如下:
s1.length( )--------返回s1中字符個(gè)數(shù)。
s1. capacity ( )--------返回s1的容量,即內(nèi)存空間數(shù)量。通常會(huì)大于length( )
s1. setlength (int newLength )--------改變s1中字符的個(gè)數(shù),如果newLength大于原個(gè)數(shù),則新添的字符都為空("");相反,字符串中的最后幾個(gè)字符將被刪除。
【例7.9】顯示確定字符串的長(zhǎng)度和容量,并改變字符串的長(zhǎng)度。
public class StrLen
{public static void main(Sring[] args)
{
StringBuffers1=new StringBuffer("Hello,Java!");
System.out.println("The length is"+s1.length( ));
System.out.println("The allocated length is"+s1.capacity( ));
s1.setlength(100);
System.out.println("The new length is"+s1.length( ));
}
}
運(yùn)行結(jié)果:
C:\>java StrLen
The length is11
The allocated length is22
The new length is100
③讀取和改變StringBuffer對(duì)象中的字符
讀取StringBuffer對(duì)象中的字符的方法有:charAt和getChar,這與String對(duì)象方法一樣。在StringBuffer對(duì)象中,設(shè)置字符及子串的方法有:setCharAt、replace;刪除字符及子串的方法有:delete、deleteCharAt。調(diào)用形式如下:
s1.setCharAt(int index,char ch)--------用ch替代s1中index位置上的字符。
s1.replace(int start,int end,s2)--------s1中從start(含)開始到end(不含)結(jié)束之間的字符串以s2代替。
s1.delete(int start,int end)--------刪除s1中從start(含)開始到end(不含)結(jié)束之間的字符串。
s1.deleteCharAt(int index)------刪除s1中index位置上的字符。
【例7.10】改變字符串的內(nèi)容。
public class StrChange
{public static void main(Sring[] args)
{
StringBuffers1=new StringBuffer("Hallo,Java!");
s1.setCharAt(1, 'e');
System.out.println(s1);
s1.replace(1,5, "i");
System.out.println(s1);
s1.delete(0,3);
System.out.println(s1);
s1.deleteCharAt(4);
System.out.println(s1);
}
}
運(yùn)行結(jié)果:
C:\>java StrChange
Hello,Java!
Hi,Java!
Java!
Java
7.2.2 System類
System類是一個(gè)特殊類,它是一個(gè)公共最終類,不能被繼承,也不能被實(shí)例化,即不能創(chuàng)建System類的對(duì)象。
System類功能強(qiáng)大,與Runtime一起可以訪問許多有用的系統(tǒng)功能。System類保存靜態(tài)方法和變量的集合。標(biāo)準(zhǔn)的輸入、輸出和Java運(yùn)行時(shí)的錯(cuò)誤輸出存儲(chǔ)在變量in,out和err中。由System類定義的方法豐富并且實(shí)用。System類中所有的變量和方法都是靜態(tài)的,使用時(shí)以System作為前綴,即形如“System.變量名”和“System.方法名”。
1.標(biāo)準(zhǔn)的輸入輸出
System類包含三個(gè)使用頻繁的公共數(shù)據(jù)流,分別是:標(biāo)準(zhǔn)輸入(in)、標(biāo)準(zhǔn)輸出(out)、標(biāo)準(zhǔn)錯(cuò)誤輸出(err)。
① public static final InputStream in--------標(biāo)準(zhǔn)輸入。
這個(gè)屬性是InputStream類的一個(gè)對(duì)象,它是未經(jīng)包裝的原始Input Stream,讀取System.in之前應(yīng)該先加以包裝??梢酝ㄟ^read()方法讀取字節(jié)數(shù)據(jù)。
② public static final PrintStream out--------標(biāo)準(zhǔn)輸出。
③ public static final PrintStream err---------標(biāo)準(zhǔn)輸出。
out和err都已經(jīng)被包裝成PrintStream對(duì)象,所以可以直接使用System.out和System.err。可以通過方法print()、println()或write()方法很方便地完成各種數(shù)據(jù)類型的輸出。out與err使用上的不同是: System.out用于輸出普通信息,out的輸出一般需要緩存;System.err一般情況下用來打印錯(cuò)誤信息,不需要緩存,快速顯示緊急信息。
關(guān)于InputStream類和PrintStream類將在java.io包中介紹。
2.System類的常用方法
System類有一些有用的方法,這些方法用于處理運(yùn)行環(huán)境。下面簡(jiǎn)單介紹幾個(gè)方法及其功能。
(1)獲取當(dāng)前時(shí)間
使用currentTineMillis( )可以記錄程序執(zhí)行的時(shí)間,這是一個(gè)特別有意義的用法。currentTineMillis( )方法返回自從1970年1月1日午夜起到現(xiàn)在的時(shí)間,時(shí)間單位是毫秒。如果要記錄程序中一段有問題程序的運(yùn)行時(shí)間,可以在這段程序開始之前調(diào)用currentTineMillis( )方法存儲(chǔ)當(dāng)前時(shí)間,在這段程序結(jié)束處再次調(diào)用currentTineMillis( )方法。執(zhí)行該段程序所花費(fèi)的時(shí)間為其結(jié)束時(shí)刻的時(shí)間值減去其開始時(shí)刻的時(shí)間值。下面的程序段可以用來估計(jì)一下執(zhí)行某個(gè)循環(huán)所占用的時(shí)間:
long startTime=System.currenTimerMillis( );//記錄循環(huán)開始時(shí)間
int sum=0;
for(int i=0;i<100000;i++){
sum+=i;
}
long endTime=System.currentTimeMillis( );// 記錄循環(huán)結(jié)束時(shí)間
System.out.Println("time: "+(endTime-startTime)+ "milliseconds. ");
注意:雖然使用cuttentTimeMillis()方法可以計(jì)算出當(dāng)前的日期和時(shí)間,但是獲取當(dāng)前日期和時(shí)間最好使用java.util中的Date類。
(2)快速復(fù)制數(shù)組
使用arraycopy()方法可以將一個(gè)任意類型的數(shù)組快速地從一個(gè)地方復(fù)制到另一個(gè)地方。這比使用循環(huán)編寫的程序要快得多。調(diào)用形式為:
System.arraycopy(a1,int sourceStart,a2,int targetStart,int size)------將數(shù)組a1從下標(biāo)sourceStart開始,長(zhǎng)度為size的元素依次復(fù)制到數(shù)組a2的以targetStart為起始的單元中。
【例7.11】用arraycopy()方法復(fù)制兩個(gè)數(shù)組。
class CopyArray
{static byte array1[ ]={97,98,99,100,101};
static byte array2[ ]={102,102,102,102,102};
public static void main(Sring[] args)
{
System.out.println(" array1="+new String(array1));
System.out.println(" array2="+new String(array2));
System.arraycopy(array1,0,array2,0,array1.length);
System.out.println(" array1="+new String(array1));
System.out.println(" array2="+new String(array2));
System.arraycopy(array1,0,array1,1,array1.length-1);
System.arraycopy(array2,1,array2,0,array2.length-1);
System.out.println(" array1="+new String(array1));
System.out.println(" array2="+new String(array2));
}
}
運(yùn)行結(jié)果:
C:\>java CopyArray
array1=abcde
array2=fffff
array1=abcde
array2= abcde
array1=aabcd
array2=bcdee
(3)退出虛擬機(jī)
在用戶的程序還未執(zhí)行完之前,強(qiáng)制關(guān)閉Java虛擬機(jī)的方法是exit():
Public static void exit(int exitCode)
關(guān)閉虛擬機(jī)的同時(shí)把狀態(tài)信息exitCode傳遞給操作系統(tǒng),exitCoded非零時(shí),表示非正常退出。
(4)強(qiáng)制垃圾收集
垃圾收集器一般情況下運(yùn)行于后臺(tái),并自動(dòng)地收集已不使用了的內(nèi)存。使用gc()方法可強(qiáng)制垃圾收集器啟動(dòng):
public static void gc()
3.環(huán)境屬性
可以通過調(diào)用System.getProperty()方法來獲得不同環(huán)境屬性的值。例如下面的程序顯示當(dāng)前用戶目錄的路徑:
class PlayUserDir{
public static void main(String[ ] args){
System.out.println(System.getProperty(" user.dir"));
}
}
可以通過setProperty( )方法設(shè)置系統(tǒng)屬性的值:
public static String setProperty(String key,String value);
其中,key為鍵名,value為鍵值。
6.2.3 Math類
Math類提供了用于幾何學(xué)、三角學(xué)以及幾種一般用途方法的浮點(diǎn)函數(shù),來執(zhí)行很多數(shù)學(xué)運(yùn)算。
1.Math類定義的兩個(gè)雙精度常量
doubleE--------常量e(2.7182818284590452354)
doublePI--------常量pi(3.14159265358979323846)
2.Math類定義的常用方法
Math類定義的方法是靜態(tài)的,可以通過類名直接調(diào)用。下面簡(jiǎn)要介紹幾類常用的方法。
①三角函數(shù)
public static double sin(double a)------三角函數(shù)正弦。
public static double cos(double a)------三角函數(shù)余弦。
public static double tan(double a)------三角函數(shù)正切。
public static double asin(double a)------三角函數(shù)反正弦。
public static double acos(double a)------三角函數(shù)反余弦。
public static double atan(double a)------三角函數(shù)反正切。
② 指數(shù)函數(shù)
public static double exp(double a)------返回ea的值。
public static double log(double a)------ 返回lna的值。
public static double pow (double y,double x)------ 返回以y為底數(shù),以x為指數(shù)的冪值。
public static double sqrt(double a)------ 返回a的平方根。
③ 舍入函數(shù)
public static intceil(double a)------- 返回大于或等于a的最小整數(shù)。
public static intfloor(double a)------- 返回小于或等于a的最大整數(shù)。
以下三個(gè)方法都有其它數(shù)據(jù)類型的重載方法:
public static intabs(int a)------- 返回a的絕對(duì)值。
public static intmax(int a,int b)------- 返回a和b的最大值。
public static intmin(int a,int b)------- 返回a和b的最小值。
④其它數(shù)學(xué)方法
public static doublerandom( )------ 返回一個(gè)偽隨機(jī)數(shù),其值介于0和1之間。
public static doubletoRadians(doubleangle )------ 將角度轉(zhuǎn)換為弧度。
public static doubletoDegrees (doubleangle)------ 將弧度轉(zhuǎn)換為角度。
7.3 java.util包中的集合類
java.util是Java語言中另一個(gè)使用廣泛的包,它包括集合類、時(shí)間處理模式、日期時(shí)間工具等各種常用工具。
Java的集合類是java.util包中的重要內(nèi)容,它允許以各種方式將元素分組,并定義了各種使這些元素更容易操作的方法。集合類中存放的是對(duì)象,不同的集合類有不同的功能和特點(diǎn),適合不同的場(chǎng)合,用以解決一些實(shí)際問題。
下面我們將介紹集合類中的幾個(gè)常用類的使用。
6.3.1 Vector類
Java的數(shù)組具有很強(qiáng)的功能,但它并不總是能滿足我們的要求。數(shù)組一旦被創(chuàng)建,它的長(zhǎng)度就固定了。但是,有時(shí)我們?cè)趧?chuàng)建數(shù)組時(shí)并不確切地知道有多少項(xiàng)需要加進(jìn)去。解決這一問題的辦法是,創(chuàng)建一個(gè)盡可能大的數(shù)組,以滿足要求,但這勢(shì)必會(huì)造成空間的浪費(fèi)。Java提供了一個(gè)好的辦法:使用java.util包中的向量類Vector。
簡(jiǎn)單地說,Vector是一個(gè)動(dòng)態(tài)數(shù)組,它可以根據(jù)需要?jiǎng)討B(tài)伸縮。另外,Vector類還提供了一些有用的方法,如增加和刪除元素的方法,而這些操作在數(shù)組中一般來說必須手工完成。
Vector類提供了三個(gè)屬性,四個(gè)構(gòu)造器和多種方法,下面分別做以介紹:
1.屬性
protected int capacityIncrement--------當(dāng)向量的大小超過容量時(shí),向量容量的增長(zhǎng)量。
protected int elementCount--------這個(gè)Vector對(duì)象中的組件數(shù)。
protectedObjected[ ] elementData--------存儲(chǔ)向量的組件的數(shù)組緩沖區(qū)。
2.構(gòu)造器
Vector( )--------構(gòu)造一個(gè)空向量。
Vector(Collection c )--------構(gòu)造一個(gè)包含給定集合中的元素的向量。
Vector(int initialCapacity )--------構(gòu)造一個(gè)具有給定的初始容量的空向量。
Vector(int initialCapacity, int capacityIncrement )-------- 構(gòu)造一個(gè)具有給定的初始容量和容量增量的空向量。
3. 常用的方法
① 向向量中添加對(duì)象
向一個(gè)向量中添加新對(duì)象有兩種情況,可以用Vector提供的兩種不同方法來實(shí)現(xiàn):
void addElement(Object obj)-------- 在向量的最后增加一個(gè)元素。
void insetElementAt(Object obj,int index)-------- 在向量的指定位置插入一個(gè)元素。
② 從向量中刪除對(duì)象
從向量中刪除對(duì)象有三種情況,可以用Vector提供的三種不同方法來實(shí)現(xiàn):
void removeAllElement( )--------刪除向量中的所有對(duì)象。
void removeElement(Object ob)--------刪除向量中一個(gè)指定的對(duì)象(僅刪除第一次出現(xiàn)的對(duì)象)。
void removeElementAt( int index)--------刪除向量中一個(gè)指定位置上的對(duì)象。
③ 搜索向量中的對(duì)象
有時(shí)我們需要得到向量中特殊位置上的對(duì)象或判斷向量中是否包含某個(gè)對(duì)象,可以使用如下的方法:
Object firstElement( )--------返回這個(gè)向量的第一個(gè)對(duì)象。
Object lastElement( )--------返回這個(gè)向量的最后一個(gè)對(duì)象。
Object ElementAt(int index )--------返回這個(gè)向量中指定位置的對(duì)象。
Boolean contains(Object elem)--------如果這個(gè)對(duì)象在這個(gè)對(duì)象中,則返回true。
④獲取向量的基本信息
int capacity( )--------返回這個(gè)向量的當(dāng)前容量。
int size( )-------- 返回這個(gè)向量的對(duì)象個(gè)數(shù)。
【例7.12】使用Vector類的示例。
class VectorTest{
public static void main(Sring[] args){
Vector vec=new Vector(3);
System.out.println(" old capacity is"+vec.capacity());
vec.addElement(new Integer(1));
vec.addElement(new Integer(2));
vec.addElement(new Integer(3));
vec.addElement(new Float(2.78));
vec.addElement(new Double(2.78));
System.out.println(" new capacity is"+vec.capacity());
System.out.println(" new size is"+vec.size());
System.out.println(" first item is"+(Integer)vec.firstElement());
System.out.println(" last item is"+(Float)vec.lasttElement());
if(vec. Contains(new Integer(2)))
System.out.println(" found 2");
vec. removeElementAt(1);
if(vec.Contains(new Integer(2))){
System.out.println(" found 2");
else
System.out.println(" after deleting not found 2");
}
}
運(yùn)行結(jié)果:
C:\>java VectorTest
old capacity is3
new capacity is6
new size is5
first item is1
last item is2.78
found 2
after deleting not found 2
7.3.2 Stack類
Stack是Vector的一個(gè)子類,它實(shí)現(xiàn)標(biāo)準(zhǔn)的后進(jìn)先出堆棧。Stack 僅僅定義了創(chuàng)建空堆棧的默認(rèn)構(gòu)造函數(shù)。Stack包括了由Vector定義的所有方法,同時(shí)增加了幾種它自己定義的方法,介紹如下:
boolean empty( )--------如果堆棧是空的,則返回true,當(dāng)堆棧包含元素時(shí),返回false。
Object peek( )-----------返回位于棧頂?shù)脑?,但是并不在堆棧中刪除它。
Object pop( )------------返回位于棧頂?shù)脑?,并在進(jìn)程中刪除它。
Object push (Object element )---------將element壓入堆棧,同時(shí)也返回element。
int search(Object element)---------在堆棧中搜索element,如果發(fā)現(xiàn)了,則返回它相對(duì)于棧頂?shù)钠屏?。否則,返回-1。
【例7.13】向堆棧中添加元素并彈出。
import java.util.*
classStackTest{
public static voidmain(Sring[] args){
Stack stack1=new Stack();//構(gòu)造一個(gè)空堆棧stack1
try {
stack1.push(new Integer(0));
stack1.push(new Integer(1));
stack1.push(new Integer(2));
stack1.push(new Integer(3));
stack1.push(new Integer(4));
System.out.println((Integer)stack1.pop());
System.out.println((Integer)stack1.pop());
System.out.println((Integer)stack1.pop());
System.out.println((Integer)stack1.pop());
System.out.println((Integer)stack1.pop());
}
catch(EmptyStackException e){ }
}
}
運(yùn)行結(jié)果:
C:\>java StackTest
4
3
2
1
0
7.3.3 Hashtable類
前面講到的集合類是通過下標(biāo)來確定元素的位置,集合中的對(duì)象有一定的順序,而Hashtable(散列表)卻不同,它通過另一種方式來確定對(duì)象的位置。它是映射集合的一種實(shí)現(xiàn),提供了將一個(gè)對(duì)象與另一個(gè)對(duì)象相關(guān)聯(lián)的方法。
Hashtable是Dictionary類的子類,Dictionary類是抽象類,與查字典操作類似,它要達(dá)到通過一個(gè)鍵(key)來查找元素的目的。Hashtable類也是通過鍵來查找對(duì)象,如何確定這個(gè)鍵值呢?首先,散列表為每個(gè)對(duì)象計(jì)算出一個(gè)整數(shù),稱為散列碼,每個(gè)對(duì)象與其散列碼一一對(duì)應(yīng);然后,用散列碼與對(duì)象個(gè)數(shù)進(jìn)行取模運(yùn)算,計(jì)算出相對(duì)應(yīng)的鍵。散列表中的對(duì)象就是通過這種方式一一放入的,所以在查詢對(duì)象時(shí),用同樣的方式就可以快速定位對(duì)象在散列表中的位置。
Hashtable不僅實(shí)現(xiàn)了父類的方法,還有自己的方法,如conrainsKey(Object key)。
下面介紹幾個(gè)常用的方法:
Object put(Object key, Object value)--------將關(guān)鍵字和值插入散列表中。如果key不在散列表中,返回null。如果key已存在于散列表中,則返回與key相連的前一個(gè)值。
Object get(Object key)--------返回包含與key相關(guān)聯(lián)的值的對(duì)象。如果key不在散列表中,則返回一個(gè)空對(duì)象。
Object remove(Object key)--------刪除key及其相應(yīng)的值,返回與key相關(guān)聯(lián)的值。如果key不在散列表中,則返回一個(gè)空對(duì)象。
boolean conrainsKey(Object key)--------用來檢查形參對(duì)象是否是一個(gè)散列表的鍵,是則返回true,否則返回false。
另外,size()方法返回表中元素的個(gè)數(shù),isEmply()方法判斷表中是否包含有元素。
作為應(yīng)用散列表的一個(gè)典型例子,可考慮用一個(gè)程序來檢驗(yàn)Java的Math.random()方法的隨機(jī)性到底如何。在理想情況下,它應(yīng)該產(chǎn)生一系列完美的隨機(jī)分布數(shù)字。但為了驗(yàn)證這一點(diǎn),我們需要生成數(shù)量眾多的隨機(jī)數(shù)字,然后計(jì)算落在不同范圍內(nèi)的數(shù)字多少。散列表可以極大簡(jiǎn)化這一工作,因?yàn)樗軐?duì)象同對(duì)象關(guān)聯(lián)起來(此時(shí)是將Math.random()生成的值同那些值出現(xiàn)的次數(shù)關(guān)聯(lián)起來)。
【例7.14】用Hashtable來檢驗(yàn)隨機(jī)數(shù)的隨機(jī)性。
import java.util.*;
class Counter {
int i = 1;
public String toString() {
return Integer.toString(i);
}
}
class Statistics {
public static void main(String[] args) {
Hashtable ht = new Hashtable();
for(int i = 0; i < 10000; i++) {
// Produce a number between 0 and 20:
Integer r = new Integer((int)(Math.random() * 20));
if(ht.containsKey(r))
((Counter)ht.get(r)).i++;
else
ht.put(r, new Counter());
}
System.out.println(ht);
}
}
在main()中,每次產(chǎn)生一個(gè)隨機(jī)數(shù)字,它都會(huì)封裝到一個(gè)Integer對(duì)象里,使句柄能夠隨同散列表一起使用(不可對(duì)一個(gè)集合使用基本數(shù)據(jù)類型,只能使用對(duì)象句柄)。containKey()方法檢查這個(gè)鍵是否已經(jīng)在集合里(也就是說,那個(gè)數(shù)字以前發(fā)現(xiàn)過嗎?)若已在集合里,則get()方法獲得那個(gè)鍵關(guān)聯(lián)的值,此時(shí)是一個(gè)Counter(計(jì)數(shù)器)對(duì)象。計(jì)數(shù)器內(nèi)的值i隨后會(huì)增加1,表明這個(gè)特定的隨機(jī)數(shù)字又出現(xiàn)了一次。
假如鍵以前尚未發(fā)現(xiàn)過,那么方法put()仍然會(huì)在散列表內(nèi)置入一個(gè)新的“鍵-值”對(duì)。在創(chuàng)建之初,Counter會(huì)自己的變量i自動(dòng)初始化為1,它標(biāo)志著該隨機(jī)數(shù)字的第一次出現(xiàn)。
為顯示散列表,只需把它簡(jiǎn)單地打印出來即可。Hashtable toString()方法能遍歷所有鍵-值對(duì),并為每一對(duì)都調(diào)用toString()。Integer toString()是事先定義好的,可看到計(jì)數(shù)器使用的toString。一次運(yùn)行的結(jié)果如下(添加了換行):
{19=526, 18=533, 17=460, 16=513, 15=521, 14=495, 13=512, 12=483, 11=488,
10=487, 9=514, 8=523, 7=497, 6=487, 5=480, 4=489, 3=509, 2=503, 1=475, 0=505}
7.4 關(guān)于Java技術(shù)文檔
Java技術(shù)文檔描述代碼的工作原理,可以向程序員提供信息,是需要經(jīng)常查看的資料。這一節(jié)我們將介紹如何查看javaDOC中的類庫。
可以從Sun公司的網(wǎng)站上下載Java文檔。在下載完j2sdk-1_4_2-doc后,找到它下面的docs文件夾,打開其中的index文件(HTML文件),找到“API & Language Documentation”下的“Java 2PlatformAPI Specification”,然后選擇需要查看的那個(gè)包,進(jìn)而查看類、接口等內(nèi)容。或者直接進(jìn)入docs文件夾下的api文件夾,打開index(HTML文件),也可進(jìn)入選擇包的界面。
選擇一個(gè)包后,可以看到包的名稱及簡(jiǎn)單描述,然后是包中的內(nèi)容,分為interface summary、class summary、exception summary和error summary等(當(dāng)然包中如果沒有某一方面內(nèi)容,就不包含),如果想看包中各類的繼承結(jié)構(gòu),可以選擇最上面的菜單中的tree,就可以了解包中的總體結(jié)構(gòu)。
當(dāng)選擇一個(gè)類進(jìn)入后,可以看到如下的內(nèi)容(以Double類為例說明):
java. lang//包名
Class Double//類名
java. lang. Object//繼承結(jié)構(gòu):java. lang包中的Double類的直接父類
|//是java. lang中的Number類,
+--java. lang. Number
|
+--java. lang. Double
All Implemented Interfaces:
Comparable, Serializable
然后是類頭定義和說明,以及源于哪個(gè)版本:
public final class Double
extends Number
implements Comparable
The Double class wraps a value of the primitive type double in an object. An object of type Double contains a single field whose type is double. In addition, this class provides several methods for converting a double to a String and a string to a double, as well as other constants and methods useful when dealing with a double.
Since:
JDK1.0
See Also:
serialized Form
然后就是屬性、方法、構(gòu)造函數(shù)的概述表(summary),最后是屬性、方法、構(gòu)造函數(shù)的詳細(xì)說明。 |