下面我们l出一些DatecM常用Ҏ?br> (1)public static long UTC(int year,int month,int date,int hrs. int min,int sec)
该方法将利用l定参数计算UTC倹{UTC是一U计时体Ӟ与GMT(格林威治旉)的计时体pȝ有差别。UTC计时体系是基于原子时钟的Q而GTMT计时体系是基于天文学观测的。计中使用的一般ؓGMT计时体系?br> (2)public static long parse(String s)
该方法将字符串s转换成一个long型的日期。在介绍构造方法Date(long date)时曾使用q这个方法?br> 字符串s有一定的格式Q一般ؓQ?br> (星期 ?nbsp;q?nbsp;旉GMT+时区)
若不注明时区Q则为本地时区?br> (3)public void setMonth(int month)
(4)public int getMonth()
q两个方法分别ؓ讑֮和获取月份倹{?br> 获取的月份的值域??1Q?代表1月,11代表12月?br> (5)public String toString()
(6)public String toLocalString()
(7)public String toGMTString()
给定日期对象{换成不同格式的字W串。它们对应的具体的格式可参看例子8.1?br> (8)public int getTimezoneOffset()
该方法用于获取日期对象的时区偏移量?br> ?.1中对上面介绍的DatecM的基本方法进行了具体的应用,q打C相应的结果。由于用了一些过时的ҎQ所以编译时会有警告信息。另外,׃本例中的旉表示与^台有养I不同的JDK版本Ҏ处理不完全相同,因此不同版本的JDK执行本例的结果可能有l微差异?br> ?.1 DateApp.java
import java.lang.System;
import java.util.Date;
public class DateApp{
public static void main(String args[]){
Date today=new Date();
//today中的日期被设成创建时ȝ日期和时_假设创徏时刻?997q??br> //23?7?1?4U?br> System.out.println("Today's date is "+today);
//q回一般的旉表示法,本例中结果ؓ
//Today's date is Fri May 23 17:51:54 1997
System.out.println("Today's date(Internet GMT)is:"
+today.toGMTString());
//q回l果为GMT旉表示法,本例中结果ؓ
//Today's date(Internet GMT)is: 23 May 1997 09:51:54:GMT
System.out.println("Today's date(Locale) is:"
+today.toLocaleString());
//q回l果为本C惯的旉表示法,l果?br> //Today's date(Locale)is:05/23/97 17:51:54
System.out.println("Today's year is: "+today.getYear());
System.out.println("Today's month is: "+(today.getMonth()+1));
System.out.println("Today's date is: "+today.getDate());
//调用DatecMҎQ获取年月日的倹{?br> //下面调用了不同的构造方法来创徏Datecȝ对象?br> Date day1=new Date(100,1,23,10,12,34);
System.out.println("Day1's date is: "+day1);
Date day2=new Date("Sat 12 Aug 1996 13:3:00");
System.out.println("Day2's date is: "+day2);
long l= Date.parse("Sat 5 Aug 1996 13:3:00 GMT+0800");
Date day3= new Date(l);
System.out.println("Day3's date(GMT)is: "+day3.toGMTString());
System.out.println("Day3's date(Locale)is: "
+day3.toLocaleString());
System.out.println("Day3's time zone offset is:"
+day3.getTimezoneOffset());
}
}
q行l果(JDK1.3版,与原文不同,原文是JDK1.0?Q?br> E:\java\tutorial\java01>java DateApp
Today's date is Thu Dec 27 17:58:16 CST 2001
Today's date(Internet GMT)is:27 Dec 2001 09:58:16 GMT
Today's date(Locale) is:2001-12-27 17:58:16
Today's year is: 101
Today's month is: 12
Today's date is: 27
Day1's date is: Wed Feb 23 10:12:34 CST 2000
Day2's date is: Fri Aug 12 13:03:00 CST 1996
Day3's date(GMT)is: 5 Aug 1996 05:03:00 GMT
Day3's date(Locale)is: 1996-8-5 13:03:00
Day3's time zone offset is:-480
E:\java\tutorial\java01>
1.3 日历cCalendar
在早期的JDK版本中,日期(Date)c附有两大功能:(1)允许用年、月、日、时、分、秒来解释日期:(2)允许对表C日期的字符串进行格式化和句法分析。在JDK1.1中提供了cCalendar来完成第一U功能,cDateFormat来完成第二项功能。dateFormat是java.text包中的一个类。与DatecL所不同的是QDateFormatcL受用各种语言和不同习惯表C的日期字符丌Ӏ本节将介绍java.util包中的类Calendar及其它新增加的相关的cR?br> cCalendar是一个抽象类Q它完成日期(Date)cd普通日期表C法(即用一l整型域如YEARQMONTHQDAYQHOUR表示日期)之间的{换?br> ׃所使用的规则不同,不同的日历系l对同一个日期的解释有所不同。在JDK1.1中提供了CalendarcM个子cGregorianCalendar??它实C世界上普遍用的公历pȝ。当然用户也可以通过l承Calendarc,q增加所需规则Q以实现不同的日历系l?br> WGregorianCalendarl承了CalendarcR本节将在介l类GregorianCalendar的同旉带介lCalendarcM的相x法?br> cGregorianCalendar提供了七U构造函敎ͼ
(1)public GregorianCalendar()
创徏的对象中的相兛_D讄成指定时区,~省地点的当前时_即程序运行时所处的时区、地点的当前旉?br> (2)public GregorianCalendar(TimeZone zone)
创徏的对象中的相兛_D讄成指定时区zoneQ缺省地点的当前旉?br> (3)public GregorianCalendar(Locale aLocale)
创徏的对象中的相兛_D讄成缺省时区,指定地点aLocale的当前时间?br> (4)public GregorianCalendar(TimeZone zone,Local aLocale)
创徏的对象中的相兛_D讄成指定时区,指定地点的当前时间?br> 上面使用到的cTimeZone的性质如下Q?br> TimeZone是java.util包中的一个类Q其中封装了有关时区的信息。每一个时区对应一lID。类TimeZone提供了一些方法完成时Z对应ID两者之间的转换?br> (?已知某个特定的IDQ可以调用方?br> public static synchronized TimeZone getTimeZone(String ID)
来获取对应的时区对象?br> ?nbsp;太^z时区的ID为PSTQ用下面的方法可获取对应于太qx时区的时区对象:
TimeZone tz=TimeZone.getTimeZone("PST");
调用ҎgetDefault()可以获取L所处时区的对象?br> TimeZone tz=TimeZone.getDefault();
(?调用以下Ҏ可以获取时区的ID
■public static synchronized String[] getavailableIDs(int rawOffset)
Ҏl定时区偏移D取ID数组。同一时区的不同地区的ID可能不同Q这是由于不同地区对是否实施夏时制意见不l一而造成的?br> 例String s[]=TimeZone.getAvailableIDs(-7*60*60*1000);
打印sQ结果ؓs[0]=PNTQs[1]=MST
■public static synchronized String[] getAvailableIDs()
获取提供的所有支持的ID?br> ■public String getID()
获取特定时区对象的ID?br> ?nbsp;TimeZone tz=TimeZone.getDefault();
String s=tz.getID();
打印sQ结果ؓs=CTT?br> 上面使用cȝ对象代表了一个特定的地理、政L文化区域。Locale只是一U机Ӟ它用来标识一cd象,Local本nq不包含此类对象?br> 要获取一个Locale的对象有两种ҎQ?br> (?调用Localecȝ构造方?br> Locale(String language,String country)
Locale(String language,String country,String variant)
参数说明Qlanguage??在ISO-639中定义的代码Q由两个写字母l成?br> country??在ISO-3166中定义的代码Q由两个大写字母l成?br> variant??售货商以及特定浏览器的代码,例如使用WIN代表Windows?br> (?调用LocalecM定义的常?br> LocalcL供了大量的常量供用户创徏Locale对象?br> ?nbsp;Locale.CHINA
Z国创Z个Locale的对象?br> cTimeZone和类Locale中的其它ҎQ读者可查阅API?br> (5)public GregorianCalendar(int year,int month,int date)
(6)public GregorianCalendar(int year,int month,int date,int hour,int minute)
(7)public GregorianCalendar(int year,int month,int date,int hour,int minute,int second)
用给定的日期和时间创Z个GregorianCalendar的对象?br> 参数说明Q?br> year-讑֮日历对象的变量YEARQmonth-讑֮日历对象的变量MONTHQ?br> date-讑֮日历对象的变量DATEQhour-讑֮日历对象的变量HOUR_OF_DAYQ?br> minute-讑֮日历对象的变量MINUTEQsecond-讑֮日历对象的变量SECOND?br> 与DatecM不同的是year的值没?900q个下限Q而且year的g表实际的q䆾。month的含义与Datecȝ同,0代表1月,11代表12月?br> ?nbsp;GregorianCalendar cal=new GregorianCalendar(1991,2,4)
cal的日期ؓ1991q??受?br> 除了与Date中类似的Ҏ外,Calendarc还提供了有x法对日历q行滚动计算和数学计。计规则由l定的日历系l决定。进行日期计时Q有时会遇到信息不或信息不实等Ҏ情况。Calendar采取了相应的Ҏ解决q些问题。当信息不时将采用~省讄Q在GregorianCalendarcM~省讄一般ؓYEAR=1970,MONTH=JANUARY,DATE=1?br> 当信息不实时QCalendar按下面的次序优先选择相应的Calendar的变量组合,q将其它有冲H的信息丢弃?br> MONTH+DAY_OF_MONTH
MONTH+WEEK_OF_MONTH+DAY_OF_WEEK
MONTH+DAY_OF_WEEK_OF_MONTH+DAY_OF_WEEK
DAY_OF+YEAR
DAY_OF_WEEK_WEEK_OF_YEAR
HOUR_OF_DAY
1.4 随机数类Random
Java实用工具cd中的cjava.util.Random提供了生各U类型随机数的方法。它可以产生int、long、float、double以及Goussian{类型的随机数。这也是它与java.lang.Math中的ҎRandom()最大的不同之处Q后者只产生double型的随机数?br> cRandom中的Ҏ十分单,它只有两个构造方法和六个普通方法?br> 构造方法:
(1)public Random()
(2)public Random(long seed)
Java产生随机数需要有一个基值seedQ在W一U方法中基值缺省,则将pȝ旉作ؓseed?br> 普通方法:
(1)public synonronized void setSeed(long seed)
该方法是讑֮基值seed?br> (2)public int nextInt()
该方法是产生一个整型随机数?br> (3)public long nextLong()
该方法是产生一个long型随机数?br> (4)public float nextFloat()
该方法是产生一个Float型随机数?br> (5)public double nextDouble()
该方法是产生一个Double型随机数?br> (6)public synchronized double nextGoussian()
该方法是产生一个double型的Goussian随机数?br> ?.2 RandomApp.java?br> //import java.lang.*;
import java.util.Random;
public class RandomApp{
public static void main(String args[]){
Random ran1=new Random();
Random ran2=new Random(12345);
//创徏了两个类Random的对象?br> System.out.println("The 1st set of random numbers:");
System.out.println("\t Integer:"+ran1.nextInt());
System.out.println("\t Long:"+ran1.nextLong());
System.out.println("\t Float:"+ran1.nextFloat());
System.out.println("\t Double:"+ran1.nextDouble());
System.out.println("\t Gaussian:"+ran1.nextGaussian());
//产生各种cd的随机数
System.out.print("The 2nd set of random numbers:");
for(int i=0;i<5;i++){
System.out.println(ran2.nextInt()+" ");
if(i==2) System.out.println();
//产生同种cd的不同的随机数?br> System.out.println();//原文如此
}
}
}
q行l果Q?br> E:\java01>java RandomApp
The 1st set of random numbers:
Integer:-173899656
Long:8056223819738127077
Float:0.6293638
Double:0.7888394520265607
Gaussian:0.5015701094568733
The 2nd set of random numbers:1553932502
-2090749135
-287790814
-355989640
-716867186
E:\java01>
1.5 向量cVector
Java.util.Vector提供了向?Vector)cM实现cM动态数l的功能。在Java语言中。正如在一开始就提到q,是没有指针概늚Q但如果能正灵zd使用指针又确实可以大大提高程序的质量Q比如在C、C++中所?#8220;动态数l?#8221;一般都由指针来实现。ؓ了I补这点缺PJava提供了丰富的cd来方便编E者用,VectorcM是其中之一。事实上Q灵zM用数l也可完成向量类的功能,但向量类中提供的大量Ҏ大大方便了用L使用?br> 创徏了一个向量类的对象后Q可以往其中随意地插入不同的cȝ对象Q既不需֏cd也不需预先选定向量的容量,q可方便地进行查找。对于预先不知或不愿预先定义数组大小Qƈ需频繁q行查找、插入和删除工作的情况,可以考虑使用向量cR?br> 向量cL供了三种构造方法:
public vector()
public vector(int initialcapacity,int capacityIncrement)
public vector(int initialcapacity)
使用W一U方法,pȝ会自动对向量对象q行理。若使用后两U方法,则系l将Ҏ参数initialcapacity讑֮向量对象的容?卛_量对象可存储数据的大?Q当真正存放的数据个数超q容量时Q系l会扩充向量对象的存储容量。参数capacityIncrementl定了每ơ扩充的扩充倹{当capacityIncrement?Ӟ则每ơ扩充一倍。利用这个功能可以优化存储?br> 在VectorcM提供了各U方法方便用户用:
■插入功?br> (1)public final synchronized void addElement(Object obj)
obj插入向量的尾部。obj可以是Q何类的对象。对同一个向量对象,可在其中插入不同cȝ对象。但插入的应是对象而不是数|所以插入数值时要注意将数D{换成相应的对象?br> ?nbsp;要插入一个整?Ӟ不要直接调用v1.addElement(1)Q正的Ҏ为:
Vector v1=new Vector();
Integer integer1=new Integer(1);
v1.addElement(integer1);
(2)public final synchronized void setElementAt(object obj,int index)
index处的对象设成objQ原来的对象被覆盖?br> (3)public final synchronized void insertElementAt(Object obj,int index)
在index指定的位|插入objQ原来对象以及此后的对象依次往后顺延?br> ■删除功?br> (1)public final synchronized void removeElement(Object obj)
从向量中删除obj。若有多个存在,则从向量头开始试Q删除找到的W一个与obj相同的向量成员?br> (2)public final synchronized void removeAllElement()
删除向量中所有的对象?br> (3)public final synchronized void removeElementlAt(int index)
删除index所指的地方的对象?br> ■查询搜索功?br> (1)public final int indexOf(Object obj)
从向量头开始搜索obj ,q回所遇到的第一个obj对应的下标,若不存在此objQ返?1?br> (2)public final synchronized int indexOf(Object obj,int index)
从index所表示的下标处开始搜索obj?br> (3)public final int lastIndexOf(Object obj)
从向量尾部开始逆向搜烦obj?br> (4)public final synchronized int lastIndexOf(Object obj,int index)
从index所表示的下标处由尾臛_逆向搜烦obj?br> (5)public final synchronized Object firstElement()
获取向量对象中的首个obj?br> (6)public final synchronized Object lastelement()
获取向量对象中的最后一个obj?br> 了解了向量的最基本的方法后Q我们来看一下例8.3VectorApp.java?br> ?.3 VectorApp.java?br> import java.util.Vector;
import java.lang.*;//q一句不应该要,但原文如?br> import java.util.Enumeration;
public class VectorApp{
public static void main(String[] args){
Vector v1=new Vector();
Integer integer1=new Integer(1);
v1.addElement("one");
//加入的ؓ字符串对?br> v1.addElement(integer1);
v1.addElement(integer1);
//加入的ؓInteger的对?br> v1.addElement("two");
v1.addElement(new Integer(2));
v1.addElement(integer1);
v1.addElement(integer1);
System.out.println("The vector v1 is:\n\t"+v1);
//v1转换成字W串q打?br> v1.insertElementAt("three",2);
v1.insertElementAt(new Float(3.9),3);
System.out.println("The vector v1(used method insertElementAt()) is:\n\t "+v1);
//往指定位置插入新的对象Q指定位|后的对象依ơ往后顺?br> v1.setElementAt("four",2);
System.out.println("The vector v1(used method setElementAt()) is:\n\t "+v1);
//指定位|的对象讄为新的对?br> v1.removeElement(integer1);
//从向量对象v1中删除对象integer1׃存在多个integer1所以从头开?br> //找,删除扑ֈ的第一个integer1
Enumeration enum=v1.elements();
System.out.print("The vector v1(used method removeElement())is:");
while(enum.hasMoreElements())
System.out.print(enum.nextElement()+" ");
System.out.println();
//使用枚Dc?Enumeration)的方法来获取向量对象的每个元?br> System.out.println("The position of object 1(top-to-bottom):"
+ v1.indexOf(integer1));
System.out.println("The position of object 1(tottom-to-top):"
+v1.lastIndexOf(integer1));
//按不同的方向查找对象integer1所处的位置
v1.setSize(4);
System.out.println("The new vector(resized the vector)is:"+v1);
//重新讄v1的大,多余的元素被行弃
}
}
q行l果Q?br> E:\java01>java VectorApp
The vector v1 is:
[one, 1, 1, two, 2, 1, 1]
The vector v1(used method insertElementAt()) is:
[one, 1, three, 3.9, 1, two, 2, 1, 1]
The vector v1(used method setElementAt()) is:
[one, 1, four, 3.9, 1, two, 2, 1, 1]
The vector v1(used method removeElement())is:one four 3.9 1 two 2 1 1
The position of object 1(top-to-bottom):3
The position of object 1(tottom-to-top):7
The new vector(resized the vector)is:[one, four, 3.9, 1]
E:\java01>
从例1.3q行的结果中可以清楚C解上面各U方法的作用Q另外还有几炚w解释?br> (1)cVector定义了方?br> public final int size()
此方法用于获取向量元素的个数。它的返回值是向是中实际存在的元素个数Q而非向量定w。可以调用方法capactly()来获取容量倹{?br> ҎQ?br> public final synchronized void setsize(int newsize)
此方法用来定义向量大。若向量对象现有成员个数已超q了newsize的|则超q部分的多余元素会丢失?br> (2)E序中定义了Enumerationcȝ一个对?br> Enumeration是java.util中的一个接口类Q在Enumeration中封装了有关枚D数据集合的方法?br> 在Enumeration中提供了ҎhawMoreElement()来判断集合中是束q有其它元素和方法nextElement()来获取下一个元素。利用这两个Ҏ可以依次获得集合中元素?br> Vector中提供方法:
public final synchronized Enumeration elements()
此方法将向量对象对应C个枚丄型。java.util包中的其它类中也大都有这cL法,以便于用戯取对应的枚Dcd?br>
1.6 栈类Stack
StackcLVectorcȝ子类。它向用h供了堆栈q种高的数据结构。栈的基本特性就是先q后出。即先放入栈中的元素后被推出。StackcM提供了相应方法完成栈的有x作?br> 基本ҎQ?br> public Object push(Object Hem)
Hem压入栈中QHem可以是Q何类的对象?br> public Object pop()
弹出一个对象?br> public Object peek()
q回栈顶元素Q但不弹出此元素?br> public int search(Object obj)
搜烦对象obj,q回它所处的位置?br> public boolean empty()
判别栈是否ؓI?br> ?.4 StackApp.java使用了上面的各种Ҏ?br> ?.4 StackApp.java?br> import java.lang.*;
import java.util.*;
public class StackApp{
public static void main(String args[]){
Stack sta=new Stack();
sta.push("Apple");
sta.push("banana");
sta.push("Cherry");
//压入的ؓ字符串对?br> sta.push(new Integer(2));
//压入的ؓInteger的对象,gؓ2
sta.push(new Float(3.5));
//压入的ؓFloat的对象,gؓ3.5
System.out.println("The stack is,"+sta);
//对应栈sta
System.out.println("The top of stack is:"+sta.peek());
//对应栈顶元素Q但不将此元素弹?br> System.out.println("The position of object Cherry is:"
+sta.search("cherry"));
//打印对象Cherry所处的位置
System.out.print("Pop the element of the stack:");
while(!sta.empty())
System.out.print(sta.pop()+" ");
System.out.println();
//栈中的元素依次弹出q打印。与W一ơ打印的sta的结果比较,可看出栈
//先进后出的特?br> }
}
q行l果(?

]]>