《基础类库和工具类库.ppt》由会员分享,可在线阅读,更多相关《基础类库和工具类库.ppt(84页珍藏版)》请在金锄头文库上搜索。
1、第第6章章 基础类库和工具类库基础类库和工具类库6.1 Java基础类基础类6.2 字符串相关类字符串相关类6.3 集合集合6.4 泛型泛型6.5 日期和时间日期和时间6.6 使用使用java.text包格式化数字和日期包格式化数字和日期6.1 Java基础类基础类1. 基础类库基础类库lJava运行环境运行环境 (Java Runtime Environment,JRE)为一般为一般的应用开发提供了大量类库支持,其提供的基础类库被称为的应用开发提供了大量类库支持,其提供的基础类库被称为JFC。这些系统定义好的类根据实现的功能不同,可以划分。这些系统定义好的类根据实现的功能不同,可以划分成不同
2、的集合,每个集合是一个包,合称类库。成不同的集合,每个集合是一个包,合称类库。ljava.langJava语言的核心类库,包含了一般语言的核心类库,包含了一般Java语言必不可少的一些语言必不可少的一些系统类定义。系统类定义。ljava.io标准输入和输出类库,通过数据流、序列化和文件系统提供标准输入和输出类库,通过数据流、序列化和文件系统提供系统输入和输出。系统输入和输出。ljava.util提供一些常用的工具类。提供一些常用的工具类。ljava.awt构建图形用户界面的类库。构建图形用户界面的类库。ljava.awt.event提供处理由提供处理由AWT组件所激发的各类事件的接口和类。组件
3、所激发的各类事件的接口和类。ljava.applet用来实现运行于浏览器中的用来实现运行于浏览器中的Java Applet的工具类库。的工具类库。与网络编程相关的类库。与网络编程相关的类库。ljava.sql用来实现用来实现JDBC(Java Data Connection)的类库,利用它)的类库,利用它可以使可以使Java程序具有访问不同类的数据库的功能。程序具有访问不同类的数据库的功能。ljava.security提供了用于安全框架的类和接口。实现了一个容易提供了用于安全框架的类和接口。实现了一个容易配置的、精细访问控制的安全结构。另外,还支持配置的、精细访问控制的安全结构。另外,还支持加
4、密公钥对的生成和存储以及消息摘要(加密公钥对的生成和存储以及消息摘要(message digest)和数字签名的生成等加密操作。)和数字签名的生成等加密操作。ljava.text通过与特定语言无关的方式格式化文本消息、日期通过与特定语言无关的方式格式化文本消息、日期和数值。和数值。ljava.math提供用于执行任意精度整数算法提供用于执行任意精度整数算法 (BigInteger) 和任和任意精度小数算法意精度小数算法 (BigDecimal) 的类。的类。2. ObjectlObject类是类层次的根。类是类层次的根。l所有类都直接或间接地继承了所有类都直接或间接地继承了Object类,所类
5、,所以一个以一个Object类型的变量可以类型的变量可以引用任何对象引用任何对象,不论是类实例还是数组。不论是类实例还是数组。lObject类定义了类定义了11个可供所有对象继承的方个可供所有对象继承的方法。这些方法分为两类:通用工具方法和支法。这些方法分为两类:通用工具方法和支持线程的方法。持线程的方法。lpublic boolean equalsequals(Object obj)lpublic int hashCodehashCode()lprotected Object cloneclone() throws CloneNotSupportedExceptionlpublic fina
6、l Class getClassgetClass()lprotected void finalizefinalize() throws Throwablelpublic String toStringtoString()lpublic final void waitwait(long timeout) throws InterruptedExceptionlpublic final void waitwait(long timeout, int nanos) throws InterruptedExceptionlpublic final void waitwait() throws Inte
7、rruptedExceptionlpublic final void notifynotify()lpublic final void notifyAllnotifyAll()Object类中类中equals方法的性质方法的性质l反身性(反身性(Reflexive) 对于任何引用对于任何引用x,x.equals(x) 将返回将返回true。l对称性(对称性(Symmetric) 对于引用对于引用x和和y,当且仅当,当且仅当y.equals(x) 返回返回true时,时,x.equals(y)才会返回才会返回true。l传递性(传递性(Transitive) 对于引用对于引用x、y和和z,如果,
8、如果x.equals(y)返回返回true,y.equals(z)也返回也返回true,那么,那么x.equals(z)也将返也将返回回true。l一致性(一致性(Consistent) 对于引用对于引用x和和y,只要对象比较时所,只要对象比较时所有的信息并没有做任何的改动,那么多次调用有的信息并没有做任何的改动,那么多次调用x.equals(y)要要么都返回么都返回true,要么都返回,要么都返回false。l对于任何非空引用(对于任何非空引用(non-null reference)x,x.equals(null)将返回将返回false。Object类中的类中的toString方法方法lOb
9、ject类中类中toString()只提供了该对象的类名、只提供了该对象的类名、一个一个字符和实例散列码的十六进制表示,通字符和实例散列码的十六进制表示,通常这些信息对于用户是远远不够的。常这些信息对于用户是远远不够的。l可以通过覆盖可以通过覆盖toString方法,在其中提供一些方法,在其中提供一些更加友好的信息。更加友好的信息。3. 基本数据类型的封装基本数据类型的封装lJava中定义了多种基本数据类型,但为了与中定义了多种基本数据类型,但为了与面向对象程序设计思想相符合,面向对象程序设计思想相符合,Java基本类基本类库中同时提供了对这些基本类型的封装类。库中同时提供了对这些基本类型的封
10、装类。基本数据类型封装类bytejava.lang.Byteshortjava.lang.Shortintjava.lang.Integerfloatjava.lang.Floatdoublejava.lang.Doublebooleanjava.lang.Booleancharjava.lang.Chatacterlongjava.lang.Longl这些类一般有如下特点:这些类一般有如下特点:l类中定义了对应基本数据类型的一些常数;类中定义了对应基本数据类型的一些常数;l提供基本数据类型和字符串的相互转换方法;提供基本数据类型和字符串的相互转换方法;l对象中封装的值是不可改变的,改变对象值
11、对象中封装的值是不可改变的,改变对象值的惟一方法是创建一个新的对象;的惟一方法是创建一个新的对象;l作为典型的值类实现,对作为典型的值类实现,对equals()、hashCode()和和toString()方法都做了改写。方法都做了改写。lpublic class test l public static void main(String args)l Integer a=new Integer(12);l Integer b=new Integer(12);l System.out.println(a.equals(b);l l4. Systemljava.lang.System类是个很特殊
12、的类,该类类是个很特殊的类,该类不能被实例化不能被实例化,是个非常典型的,是个非常典型的静态方法类静态方法类,主要提供与系统相关的主要提供与系统相关的静态方法静态方法和一些和一些静态静态对象对象,如标准输入输出。,如标准输入输出。5. Mathljava.lang.Math类用来完成一些常用的数学计类用来完成一些常用的数学计算,提供了一些实现标准数学函数计算的算,提供了一些实现标准数学函数计算的静静态方法态方法,使用时无需创建实例。,使用时无需创建实例。6.2 字符串相关类字符串相关类1. Stringl字符串是字符串是Java中比较特殊的数据类型。中比较特殊的数据类型。Java语言将字符串作
13、为对象来处理,有对应的类语言将字符串作为对象来处理,有对应的类定义,每一个字符串常量是字符串类定义,每一个字符串常量是字符串类String的的一个实例。一个实例。String类中提供了很多非常方便的类中提供了很多非常方便的字符串操作和查询方法字符串操作和查询方法2. StringBufferlStringBuffer类封装了一个字符数组,同时提类封装了一个字符数组,同时提供了对这个字符数组的相关操作。与供了对这个字符数组的相关操作。与String相相比,任何修改性的操作都是在同一个字符数比,任何修改性的操作都是在同一个字符数组上进行,而不像组上进行,而不像String那样为了线程访问安那样为了
14、线程访问安全创建大量副本对象。全创建大量副本对象。3. StringTokenizerl提供了对字符串的解析和分割的功能,如对提供了对字符串的解析和分割的功能,如对一个字符串需要按照某些特征子串进行分割,一个字符串需要按照某些特征子串进行分割,就可以使用这个类。就可以使用这个类。lStringTokenizer位于位于java.util包中。包中。构造方法:构造方法:lpublic StringTokenizer(String str)为指定字符串构造一个为指定字符串构造一个 string tokenizer。tokenizer 使用默使用默认的分隔符集合认的分隔符集合 tnrf,即:空白字符
15、、制表符、换,即:空白字符、制表符、换行符、回车符和换页符。分隔符字符本身不作为行符、回车符和换页符。分隔符字符本身不作为标记标记。lpublic StringTokenizer(String str, String delim)为指定字符串构造一个为指定字符串构造一个 string tokenizer。delim 参数中的参数中的字符都是分隔标记的分隔符。分隔符字符本身不作为标记。字符都是分隔标记的分隔符。分隔符字符本身不作为标记。 lpublic StringTokenizer(String str, String delim, boolean returnDelims)为指定字符串构造一
16、个为指定字符串构造一个 string tokenizer。delim 参数中的参数中的所有字符都是分隔标记的分隔符。所有字符都是分隔标记的分隔符。 如果如果 returnDelims 标志为标志为 true,则分隔符字符也作为标记,则分隔符字符也作为标记返回。每个分隔符都作为一个长度为返回。每个分隔符都作为一个长度为 1 的字符串返回。如果的字符串返回。如果标志为标志为 false,则跳过分隔符,只是用作标记之间的分隔符。,则跳过分隔符,只是用作标记之间的分隔符。方法方法描述描述int countTokens()使用当前分隔符集,使用当前分隔符集,还有多少个有多少个标记需要解需要解析析bool
17、ean hasMoreElements()测试字符串中是否字符串中是否还有更多的可用有更多的可用标记boolean hasMoreTokens()同上同上Object nextElement()用用Object对象返回下一个象返回下一个标记String nextToken()用用String对象返回下一个象返回下一个标记String nextToken(String delimuters)用用String对象返回下一个象返回下一个标记,并将分隔符,并将分隔符串串设置置为delimuters所指定的分隔符串所指定的分隔符串lpackage myclass;limport java.util.St
18、ringTokenizer;lpublic class testl public static void main(String args)l StringTokenizer st = new StringTokenizer(this is an apple);l while (st.hasMoreTokens() l System.out.println(st.nextToken();l l lStringTokenizer是出于兼容性的原因而被保留的遗留类(虽然在新代码中是出于兼容性的原因而被保留的遗留类(虽然在新代码中并不鼓励使用它)。建议所有寻求此功能的人使用并不鼓励使用它)。建议所有
19、寻求此功能的人使用String的的split方法或方法或java.util.regex包。包。lpublic String split(String regex)根据给定的根据给定的正则表达式正则表达式(RegularExpression)的的匹配来拆分此字符串。匹配来拆分此字符串。lString result = this is an apple.split(s);/ s -空白字符空白字符 lfor (int x=0; x0)l return -1;l else if(c0)l return 1;l else return 0;l llpublic class Test l public
20、static void main(String args)l TreeSet aset=new TreeSet();l aset.add(d);l aset.add(b);l aset.add(a);l aset.add(c);l for(Object ob:aset)l System.out.print(String)ob+t);lSystem.out.println();ll TreeSet bset=new TreeSet(new StrComparator();l bset.addAll(aset);l bset.add(e);l for(Object ob:bset)l System
21、.out.print(String)ob+t);l l输出:输出:a b c d e d c b a java.lang public interface Comparablel此接口强行对实现它的每个类的对象进行整此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的体排序。此排序被称为该类的自然排序自然排序,类,类的的 compareTo 方法被称为它的方法被称为它的自然比较方法自然比较方法。l实现此接口的对象列表(和数组)可以通过实现此接口的对象列表(和数组)可以通过 Collections.sort()(和(和 Arrays.sort())进行)进行自动排序。实现此接口的对象
22、可以用作有序自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指映射表中的键或有序集合中的元素,无需指定比较器。定比较器。limport java.util.*;lclass Student implements Comparablelint id;lString name;lpublic Student(int id,String name)lthis.id=id;lthis.name=name;llpublic int compareTocompareTo(Object s)lStudent ss=(Student)s;lreturn id-ss.id;lllpub
23、lic class Test l public static void main(String args)l TreeSet aset=new TreeSet();l aset.add(new Student(3,c);l aset.add(new Student(2,b);l aset.add(new Student(1,a);l aset.add(new Student(4,d);l for(Object ob:aset)l Student s=(Student)ob;l System.out.println(s.id+t+s.name);l l l1 a1 a2 b2 b3 c3 c4
24、d4 d 使用迭代器访问集合元素使用迭代器访问集合元素l遍历集合中的元素是一个常见的操作,比如遍历集合中的元素是一个常见的操作,比如显示集合中的每个元素。要想遍历集合中的显示集合中的每个元素。要想遍历集合中的元素,可使用迭代器。元素,可使用迭代器。迭代器迭代器是指实现了是指实现了Iterator或或ListIterator接口的一个对象。迭代接口的一个对象。迭代器允许通过循环集合来获取或删除集合元素。器允许通过循环集合来获取或删除集合元素。ListIterator通过扩展通过扩展Iterator来允许来允许双向双向遍历遍历和修改集合元素。和修改集合元素。Iterator接口中的方法接口中的方法
25、方法方法描述描述boolean hasNext()如果如果还有元素,返回有元素,返回trueObject next()返回下一个元素。返回下一个元素。void remove()删除当前元素除当前元素ListIterator接口中的方法接口中的方法方法方法描述描述void add(Object obj)把把obj对象插入到列表中的象插入到列表中的next()调用所返回的元用所返回的元素之前素之前boolean hasNext()如果如果还有元素,返回有元素,返回trueboolean hasPrevious()如果如果还有前一个元素,返回有前一个元素,返回trueObject next()返回下
26、一个元素返回下一个元素int nextIndex()返回下一个元素的索引。如不存在下一个元素,返回下一个元素的索引。如不存在下一个元素,返回列表的大小返回列表的大小Object previous()返回前一个元素返回前一个元素int prebviousIndex()返回前一个元素的索引。如不存在前一个元素,返回前一个元素的索引。如不存在前一个元素,返回返回1void remove()删除当前元素。(需在除当前元素。(需在调用用next()或或previous()之之后)后)void set(Object obj)把当前元素把当前元素设置成置成obj对象象l要想用迭代器访问集合,必须先获得迭代器
27、。要想用迭代器访问集合,必须先获得迭代器。每个每个集合类集合类均提供了一个返回迭代器的均提供了一个返回迭代器的iterator()方法,方法,而且返回的迭代器均而且返回的迭代器均指向当前集合的开头指向当前集合的开头。l通常情况下,使用迭代器遍历集合应该遵循以下步通常情况下,使用迭代器遍历集合应该遵循以下步骤:骤:调用集合的iterator()方法获取一个指向集合开头的迭代器。设置一个循环来调用hasNext()方法,其中只要hasNext()方法返回true,循环就继续进行。在循环体中,调用next()方法来获得每个元素。l对于实现了对于实现了List接口的集合,还可以通过调用接口的集合,还可
28、以通过调用ListIterator()来获得迭代器。来获得迭代器。lpackage myclass;limport java.util.*;lclass Testl public static void main(String args)l ArrayList alist=new ArrayList();l alist.add(a);l alist.add(b);l alist.add(c);l alist.add(d);l Iterator itr01=alist.iterator(); Iterator itr01=alist.iterator();l while(itr01.hasNex
29、t()l Object element=itr01.next();l System.out.print(element+ );l l ListIterator itr02=alist.listIterator();l while(itr02.hasNext()l Object element=itr02.next();l itr02.set(element+-);l ll System.out.println();l while(itr02.hasPrevious()l Object element=itr02.previous();l System.out.print(element+ );
30、l l l输出:输出:a b c d d- c- b- a- 使用映射使用映射l映射是存储关键字与值之间的联系或关键字映射是存储关键字与值之间的联系或关键字值对的对象。通过一个给定的关键字,可值对的对象。通过一个给定的关键字,可以查找到一个对应的值。关键字必须是惟一以查找到一个对应的值。关键字必须是惟一的,但值可以是重复的。的,但值可以是重复的。支持映射的接口支持映射的接口接口接口描述描述Map惟一地映射关惟一地映射关键字到字到值Map.Entry描述映射中的一个元素(关描述映射中的一个元素(关键字字值对),它是),它是Map的内部的内部类SortedMap扩展展Map,使关,使关键字字值能能
31、够按升序存按升序存储Map接口接口方法方法描述描述boolean containsKey(Object key)如如调用映射中含有用映射中含有key关关键字,返回字,返回trueboolean containsKey(Object value)如如调用映射中含有用映射中含有value,返,返回回trueboolean isEmpty()如果如果调用映射用映射为空,返回空,返回truevoid putAll(Map map)把把map中的所有关中的所有关键字字值对加入到加入到调用映射中用映射中int size()返回返回调用映射中的关用映射中的关键字字值对的个数的个数映射类映射类类描述描述Abs
32、tractMap提供提供 Map 接口的骨干接口的骨干实现HashMap使用散列表使用散列表TreeMap使用使用树结构构WeakHashMap使用弱关使用弱关键字散列表字散列表LinkedHashMap允允许按插入按插入顺序遍序遍历映射映射TreeMap类类lTreeMap类使用树形结构实现类使用树形结构实现Map接口,它提供了按序相邻接口,它提供了按序相邻存储关键字值对的有效方式。存储关键字值对的有效方式。l构造函数:构造函数:lTreeMap()l创建一个按关键字自然顺序进行排序的空的映射。创建一个按关键字自然顺序进行排序的空的映射。lTreeMap(Comparator comp)l创
33、建一个按创建一个按comp比较器进行排序的空的映射。比较器进行排序的空的映射。lTreeMap(Map m)l用用m映射的元素作为初始元素创建一个树形映射。映射的元素作为初始元素创建一个树形映射。lTreeMap(SortedMap sm)l用用sm有序映射的映射作为初始元素按照有序映射的映射作为初始元素按照sm有序映射的相同有序映射的相同顺序创建一个树形映射。顺序创建一个树形映射。limport java.util.*;lpublic class Testl public static void main(String args)l TreeMap tm=new TreeMap();l tm
34、.put(red,红色红色);l tm.put(green,绿色绿色);l tm.put(blue,蓝色蓝色);ll System.out.println(tm.get(red);ll Set es=tm.entrySet();/ /返回此映射中包含的映射关系的返回此映射中包含的映射关系的返回此映射中包含的映射关系的返回此映射中包含的映射关系的 Set Set 视图视图视图视图l Iterator iter=es.iterator();l while(iter.hasNext()l System.out.println(iter.next();l l l输出:输出:红色红色blue=蓝色蓝色g
35、reen=绿色绿色red=红色红色集合小结集合小结l集合遍历集合遍历 P135对于对于List系列而言,可以利用元素的索引进行,系列而言,可以利用元素的索引进行,而而Set系列是没有索引的,需使用迭代器。系列是没有索引的,需使用迭代器。l排序和查找排序和查找 P136学习学习Collections类类6.4 泛型泛型*l泛型,又称为参数化类型,是含有单个或多泛型,又称为参数化类型,是含有单个或多个类型参数的类或接口的定义。个类型参数的类或接口的定义。l泛型类和泛型接口的定义机制是对平时所熟泛型类和泛型接口的定义机制是对平时所熟知的类和接口定义机制的扩展,利用这种机知的类和接口定义机制的扩展,利
36、用这种机制可以定义泛型类和泛型接口的集合。制可以定义泛型类和泛型接口的集合。l在大多数情况下,泛型被设计用来处理集合。在大多数情况下,泛型被设计用来处理集合。一般应用程序员只要熟练使用系统提供的泛一般应用程序员只要熟练使用系统提供的泛型类,就足够应付大多数的程序需要了。型类,就足够应付大多数的程序需要了。泛型类的定义泛型类的定义l泛型类的定义与普通类的定义非常相近,差别泛型类的定义与普通类的定义非常相近,差别仅仅仅仅在在于于泛型类名称后有个参数描述泛型类名称后有个参数描述泛型类名称后有个参数描述泛型类名称后有个参数描述。lpublic class LinkedList /类定义代码l泛型实质上
37、定义了类型的集合,利用泛型创建具体泛型实质上定义了类型的集合,利用泛型创建具体的类时,只需为尖括号中的参数提供合适的实参,的类时,只需为尖括号中的参数提供合适的实参,此时出现在定义中的类型变量此时出现在定义中的类型变量T将被所提供的类型实将被所提供的类型实参替代,这样就生成了所需要的类。参替代,这样就生成了所需要的类。LinkedListLinkedList定义了一个可存储定义了一个可存储String对象的对象的LinkedList类类LinkedList定义了一个可存储定义了一个可存储String对象的对象的LinkedList类类LinkedList定义了一个可存储定义了一个可存储Stri
38、ng对象的对象的LinkedList类类泛型在使用中的一些规则和限制泛型在使用中的一些规则和限制l泛型的类型参数可以有多个。泛型的类型参数可以有多个。l泛型的类型参数只能是类类型泛型的类型参数只能是类类型(包括自定义(包括自定义类),类),不能是简单类型不能是简单类型。l在在static方法中不可以使用泛型,泛型变量也方法中不可以使用泛型,泛型变量也不可以用不可以用static关键字来修饰。关键字来修饰。l不可以定义泛型数组,不可以定义泛型数组,T ob = new T(); /错。错。class MyClassprivate T a;private U b;public MyClass(T
39、a,U b)this.a=a;this.b=b;public T getA()return a;public U getB()return b;public class Test public static void main(String args)MyClassMyClass m=new MyClassMyClass(abc,123);String s=m.getA();System.out.println(s);Integer i=m.getB();System.out.println(i); class MyClassObject a;Object b;public MyClass(O
40、bject a,Object b)this.a=a;this.b=b;public Object getA()return a;public Object getB()return b;public class test public static void main(String args)MyClass m=new MyClass (abc,123);String s= (String)m.getA();System.out.println(s);Integer i= (Integer)m.getB();System.out.println(i); import java.util.*;c
41、lass Student implements Comparableint id;String name;public Student(int id,String name)this.id=id;this.name=name;public int compareTo(Student s)Student ss=s;return id-ss.id;import java.util.*;import java.util.*;class Student implements Comparableclass Student implements Comparableint id;int id;Strin
42、g name;String name;public Student(int id,String name)public Student(int id,String name)this.id=id;this.id=id;this.name=name;this.name=name; public int compareTo(Object s)public int compareTo(Object s)Student ss=(Student)s;Student ss=(Student)s;return id-ss.id;return id-ss.id; public class test publi
43、c static void main(String args) TreeSet aset=new TreeSet(); aset.add(new Student(3,c); aset.add(new Student(2,b); aset.add(new Student(1,a); aset.add(new Student(4,d); for(Student ob:aset) Student s=ob; System.out.println(s.id+t+s.name); public class test public class test public static void main(St
44、ring args) public static void main(String args) TreeSet aset=new TreeSet(); TreeSet aset=new TreeSet(); aset.add(new Student(3,c); aset.add(new Student(3,c); aset.add(new Student(2,b); aset.add(new Student(2,b); aset.add(new Student(1,a); aset.add(new Student(1,a); aset.add(new Student(4,d); aset.ad
45、d(new Student(4,d); for(Object ob:aset) for(Object ob:aset) Student s=(Student)ob;Student s=(Student)ob; System.out.println(s.id+t+s.name);System.out.println(s.id+t+s.name); 6.4日期和时间日期和时间*lDate类提供了操作时间的基本功能。类提供了操作时间的基本功能。Date() /使用当前日期和时间初始化对象使用当前日期和时间初始化对象Date(long milliseconds) /参数等于从参数等于从1970年年1月
46、月1日午夜开始计算已经过去的时间数(毫秒)。日午夜开始计算已经过去的时间数(毫秒)。lDate中的很多方法已经过时。中的很多方法已经过时。lDate类没有提供允许获得日期和时间的各个组成成类没有提供允许获得日期和时间的各个组成成分的方法,只能获得毫秒计数的日期和时间,或者分的方法,只能获得毫秒计数的日期和时间,或者从从toString()方法所返回的字符串表示中获得日期和方法所返回的字符串表示中获得日期和时间。如要获得日期和时间的详细信息,则需使用时间。如要获得日期和时间的详细信息,则需使用Calendar类。类。 limport java.util.*;lpublic class Test
47、lpublic static void main(String args) lDate date=new Date();lSystem.out.println(date);llong msec=date.getTime();lSystem.out.println(Milliseconds= +msec);llSun Apr 15 11:30:10 CST 2012Milliseconds=1334460610588lCalendar类是一个类是一个抽象类抽象类,提供了一组允许把毫秒,提供了一组允许把毫秒为单位的时间转换为一些有用时间成分,如年、月、为单位的时间转换为一些有用时间成分,如年、月、
48、日、时、分和秒的方法。日、时、分和秒的方法。lCalendar 提供了一个类方法提供了一个类方法 getInstance(),返回,返回一个一个GregorianCalendar对象,这个对象被初始化对象,这个对象被初始化成默认地域和时区下的当前日期和时间。成默认地域和时区下的当前日期和时间。lCalendar还定义了很多还定义了很多int型的常量,这些常量一般型的常量,这些常量一般在获取或设置在获取或设置Calendar类的成员时使用。类的成员时使用。import java.util.*;class Test public static void main(String args) Cale
49、ndar now=Calendar.getInstance(); System.out.println(now.get(Calendar.YEAR); lCalendar类的具体实现子类类的具体实现子类GregorianCalendar(格林高利历,公历),(格林高利历,公历),实现了我们所熟悉的公历日历,可以根据各实现了我们所熟悉的公历日历,可以根据各自的规则提供一些特定的功能来解释时间信自的规则提供一些特定的功能来解释时间信息。息。import java.text.DateFormat;import java.util.*;public class Test public static v
50、oid main(String args) GregorianCalendar now=new GregorianCalendar(); GregorianCalendar date=new GregorianCalendar(2012,3,16); System.out.println(now.get(Calendar.MONTH); System.out.println(date.get(Calendar.MONTH); DateFormat fmt=DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA); System.out
51、.println(fmt.format(date.getTime(); System.out.println(2000是否是闰年:是否是闰年:+date.isLeapYear(2000);注意:注意:注意:注意:这是四月这是四月这是四月这是四月6.5 使用使用java.text包格式化数字和日期包格式化数字和日期*格式化数字格式化数字l在在NumberFormat类中为我们提供了格式化类中为我们提供了格式化4种数字的方法:整数、小数、货币和百分比,种数字的方法:整数、小数、货币和百分比,通过工厂方法通过工厂方法getInstance, getNumberIntance, getCurrency
52、Instance, getPercentInstance方法获得相应的实例对方法获得相应的实例对象就行。象就行。l例如我们要以字符串表示人民币例如我们要以字符串表示人民币88888.88元,这样来写就行:元,这样来写就行:lpackage myclass;limport java.text.*;lpublic class testl public static void main(String args)l NumberFormat nf = NumberFormat.getCurrencyInstance();l System.out.println(nf.format(88888.88);
53、ll输出:输出:¥88,888.88定制格式化数字定制格式化数字l可是对于稍微复杂一点的需求,可是对于稍微复杂一点的需求,NumberFormat就满足不了就满足不了了,幸好了,幸好java还提供了还提供了DecimalFormat实现定制的格式化。实现定制的格式化。要使用要使用DecimalFormat对象,必须提供给它提供一个格式化对象,必须提供给它提供一个格式化的模式的模式(pattern):lString pattern = lDecimalFormat df = new DecimalFormat(pattern);l或者:或者:lDecimalFormat df = new Dec
54、imalFormat();ldf. applyPattern(pattern);l然后就调用它的然后就调用它的format方法就行了。方法就行了。l所以关键就是这个模式怎么定义。所以关键就是这个模式怎么定义。l在在DecimalFormat类的类的JavaDoc中有模式的语法表示。下面中有模式的语法表示。下面是模式中某些字符的含义表:是模式中某些字符的含义表:l字符字符 含义含义l 0 一位数字,这一位缺失显示为一位数字,这一位缺失显示为0。用来补零。用来补零l # 一位数字一位数字, 这一位缺失就不显示这一位缺失就不显示 l . 小数点,不用多说了吧小数点,不用多说了吧l , 千位分隔符千位
55、分隔符l E 科学计数法科学计数法l % 百分比百分比格式化日期格式化日期l把日期转化为字符串最简单的方法就是调用把日期转化为字符串最简单的方法就是调用Date类的类的toString或者或者toLocaleString方法:方法:System.out.println(new Date(); 输出:输出:2004-8-7 8:16:14。l可是如果我们想把月和日补成可是如果我们想把月和日补成2位不要时分秒位不要时分秒2004-08-07,这就不灵了。这就不灵了。java.text.DateFormat提供了大量的工厂方法:提供了大量的工厂方法:getDateInstance(int style
56、), getTimeInstance(int style), getDateTimeInstance(int dateStyle, int timeStyle)等等。等等。其中其中style必须是必须是DateFormat.LONG, DateFormat.MEDIUM, DateFormat.SHORT之一。之一。定制格式化日期定制格式化日期l同样,同样,java.text.SimpleDateFormat可以通过模式可以通过模式(pattern)实现定制格式化:实现定制格式化:lString pattern = lSimpleDateFormat df = new SimpleDateFo
57、rmat(pattern);或者:或者:SimpleDateFormat df = new SimpleDateFormat();ldf. applyPattern(pattern);下面是下面是SimpleDateFormat的的javadoc中的一个模式符号简表:中的一个模式符号简表:l符号符号 意义意义 合法数值合法数值 示例示例l y Year Year 1996; 96 l M Month in year Month July; Jul; 07 l d Day in month Number 10 l a Am/pm marker Text PM l H Hour in day (0
58、-23) Number 0 l h Hour in am/pm (1-12) Number 12 l m Minute in hour Number 30 l s Second in minute Number 55 l S Millisecond Number 978 l z Time zone General time zone Pacific Standard Time; PST; GMT-8:00 l Z Time zone RFC 822 time zone -0800例:例:import java.text.*;import java.util.*;public class tes
59、t public static void main(String args) defaultNumberFormat(); System.out.println(); customNumberFormat(); System.out.println(); defaultDateFormat(); System.out.println(); customDateFormat(); System.out.println(); public static void defaultNumberFormat() int i = 123456; double x = 882323.23523; doubl
60、e p = 0.528; double c = 52.83; NumberFormat nf = NumberFormat.getInstance(); System.out.println(Integer + i + is displayed as + nf.format(i); System.out.println(Double + x + is displayed as + nf.format(x); NumberFormat nfInt = NumberFormat.getIntegerInstance(); System.out.println(Integer + i + is di
61、splayed as + nfInt.format(i); NumberFormat nfNumber = NumberFormat.getNumberInstance(); System.out.println(Double + x + is displayed as + nfNumber.format(x); NumberFormat nfPercent = NumberFormat.getPercentInstance(); System.out.println(Percent + p + is displayed as + nfPercent.format(p); NumberForm
62、at nfCurrency = NumberFormat.getCurrencyInstance(); System.out.println(Currency + p + is displayed as + nfCurrency.format(c); /这里没有涉及相应的这里没有涉及相应的parse方法方法 public static void customNumberFormat() double x = 1000.0 / 3; System.out.println(default output is + x); patternPrint(#,#.#, x); patternPrint(#.
63、#, x); patternPrint(#.00, x); patternPrint(#.0#, x); patternPrint(00000.#, x); patternPrint($#,#.#, x); patternPrint(0.#E0, x); patternPrint(00.#%, x); double y = 23.0012; System.out.println(default output is + y); patternPrint(#,#.#, y); patternPrint(#.#, y); patternPrint(#.00, y); patternPrint(#.0
64、#, y); patternPrint(00000.#, y); patternPrint($#,#.#, y); patternPrint(0.#E0, y); patternPrint(00.#%, y); public static void patternPrint(String pattern, double x) DecimalFormat df = new DecimalFormat(pattern); System.out.println(output for pattern + pattern + is + df.format(x); public static void d
65、efaultDateFormat() Date date = new Date(); System.out.println(simple date + date.toLocaleString(); DateFormat df = DateFormat.getDateTimeInstance(); System.out.println(df.format(date); DateFormat dfLong = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG); System.out.println(dfLong.for
66、mat(date); DateFormat dfMedium = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); System.out.println(dfMedium.format(date); DateFormat dfShort = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); System.out.println(dfShort.format(date); public static void custom
67、DateFormat() Date date = new Date(); patternPrint(yyyy.MM.dd HH:mm:ss z, date); /两个两个MM, dd会导致补零会导致补零 patternPrint(yy年年M月月d日日 HH时时mm分分, date); /两个两个yy就显示为两位年份就显示为两位年份 patternPrint(EEE, MMM d, yy, date); patternPrint(h:mm a, date); patternPrint(hh oclock a, zzzz, date); patternPrint(yyyyy.MMMMM.dd GG
68、G hh:mm aaa, date); patternPrint(EEE, d MMM yyyy HH:mm:ss Z, date); patternPrint(yyMMddHHmmssZ, date); public static void patternPrint(String pattern, Date date) SimpleDateFormat df = new SimpleDateFormat(pattern); System.out.println(df.format(date); 输出:输出:lInteger 123456 is displayed as 123,456lDou
69、ble 882323.23523 is displayed as 882,323.235lInteger 123456 is displayed as 123,456lDouble 882323.23523 is displayed as 882,323.235lPercent 0.528 is displayed as 53%lCurrency 0.528 is displayed as ¥52.83ldefault output is 333.3333333333333loutput for pattern #,#.# is 333.33loutput for pattern #.# is
70、 333.33loutput for pattern #.00 is 333.33loutput for pattern #.0# is 333.33loutput for pattern 00000.# is 00333.33loutput for pattern $#,#.# is $333.33loutput for pattern 0.#E0 is 3.333E2loutput for pattern 00.#% is 33333.33%ldefault output is 23.0012loutput for pattern #,#.# is 23loutput for patter
71、n #.# is 23loutput for pattern #.00 is 23.00loutput for pattern #.0# is 23.0loutput for pattern 00000.# is 00023loutput for pattern $#,#.# is $23loutput for pattern 0.#E0 is 2.3E1loutput for pattern 00.#% is 2300.12%lsimple date 2007-5-13 23:56:18l2007-5-13 23:56:18l2007年年5月月13日日 下午下午11时时56分分18秒秒l20
72、07-5-13 23:56:18l07-5-13 下午下午11:56l2007.05.13 23:56:18 CSTl07年年5月月13日日 23时时56分分l星期日星期日, 五月五月 13, 07l11:56 下午下午l11 oclock 下午下午, 中国标准时间中国标准时间l02007.五月五月.13 公元公元 11:56 下午下午l星期日星期日, 13 五月五月 2007 23:56:18 +0800l070513235618+0800小结:小结: 使用一门编程语言进行实际使用一门编程语言进行实际开发,遇到的很多问题已经不开发,遇到的很多问题已经不再是语言自身如何使用,而是再是语言自身如何使用,而是如何使用语言相关的类库或方如何使用语言相关的类库或方法来尽快地解决实际问题。法来尽快地解决实际问题。