电子教案(Java大学实用教程)--第7章_第1页
电子教案(Java大学实用教程)--第7章_第2页
电子教案(Java大学实用教程)--第7章_第3页
电子教案(Java大学实用教程)--第7章_第4页
电子教案(Java大学实用教程)--第7章_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章常用实用类,1.Date类2.Calendar类3.Math类与Biglnteger类4.LinkedList泛型类5.HashSet泛型类6.HashMap泛型类7.TreeSet泛型类8.TreeMap泛型类9.Stack泛型类,7.1Date类,1Date对象Date类在java.util包中。使用Date类的无参数构造方法创建的对象可以获取本地当前时间。用Date的构造方法Date(longtime)创建的Date对象表示相对1970年1月1日0点(GMT)的时间,例如参数time取值60*60*1000秒表示ThuJan0101:00:00GMT1970。可以用System类的静态方法publiclong,currentTimeMillis()获取系统当前时间,这个时间是从1970.年1月1日0点(GMT)到目前时刻所走过的毫秒数(这是一个不小的数)。可以根据currentTimeMillis()方法得到的数字,用Date的构造方法Date(longtime)来创建一个本地日期的Date对象。2格式化时间Date对象表示时间的默认顺序是:星期、月、日、小时、分、秒、年。例如:SatApr2821:59:38CST2001。我们可能希望按着某种习惯来输出时间,比如时间的序:年月星期日或年月星期日小时分秒。,这时可以使用DateFormat的子类SimpleDateFormat来实现日期的格式化。SimpleDateFormat有一个常用构造方法:publicSimpleDateFormat(Stringpattern)。该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用:format(Datedate)方法格式化时间对象date。,需要注意的是,pattern中应当含有一些有效的字符序列。例如:ly或yy表示用2位数字输出年份;yyyy表示用4位数字输出年份。lM或MM表示用2为数字或文本输出月份,如果想用汉字输出月份,pattern中应连续包含至少3个M,如:MMM。ld或dd表示用2位数字输出日。lH或HH表示用两位数字输出小时。lm或mm表示用两位数字输出分。ls或ss表示用两位数字输出秒。lE表示用字符串输出星期。,在下面的例子1中,我们用三种格式输出时间。上述程序的输出结果:现在的时间:ThuSep0209:33:55CST2004现在的时间:time:2004-09-02goodTime:2004年-09月-星期四02日-09:时33:分55:秒北京时间现在的时间:北京时间02日09时九月55秒33分星期四-3600秒表示的日期时间是:ThuJan0107:59:56CST1970-1800秒表示的日期时间是:ThuJan0107:59:58CST1970,返回,7.2Calendar类,Calendar类在java.util包中。使用Calendar类的static方法getInstance()可以初始化一个日历对象,如:Calendarcalendar=Calendar.getInstance();然后,calendar对象可以调用方法:publicfinalvoidset(intyear,intmonth,intdate)publicfinalvoidset(intyear,intmonth,intdate,inthour,intminute)publicfinalvoidset(intyear,intmonth,intdate,inthour,intminute,intsecond),将日历翻到任何一个时间,当参数year取负数时表示公元前。calendar对象调用方法:publicintget(intfield)可以获取有关年份、月份、小时、星期等信息,参数field的有效值由Calendar的静态常量指定,例如:calendar.get(Calendar.MONTH);返回一个整数,如果该整数是0表示当前日历是在一月,该整数是1表示当前日历是在二月等。,日历对象调用publiclonggetTimeInMillis()可以将时间表示为毫秒。下面的例子2使用Calendar来表示时间。并计算了2005年和1949年之间相隔的天数。上述程序的输出结果:现在的时间是:2004年9月2日星期49时38分30秒2005年10月1日和1949年10月1日相隔20454天下面的例子3输出2005年10月的日历页。,返回,7.3Math类与BigInteger类,1Math类在编写程序时,可能需要计算一个数的平方根、绝对值、获取一个随机数等等。java.lang包中的类包含许多用来进行科学计算的类方法,这些方法可以直接通过类名调用。另外,Math类还有两个静态常量,E和PI,它们的值分别是:2.7182828284590452354和3.14159265358979323846。,以下是Math类常用方法:lpublicstaticlongabs(doublea)返回a的绝对值。lpublicstaticdoublemax(doublea,doubleb)返回a、b的最大值。lpublicstaticdoublemin(doublea,doubleb)返回a、b的最小值。lpublicstaticdoublerandom()产生一个0到1之间的随机数(不包括0和1)。lpublicstaticdoublepow(doublea,doubleb)返回a的b次幂。,lpublicstaticdoublesqrt(doublea)返回a的平方根。lpublicstaticdoublelog(doublea)返回a的对数。lpublicstaticdoublesin(doublea)返回正弦值。lpublicstaticdoubleasin(doublea)返回反正弦值。有时我们可能需要对输出的数字结果进行必要的格式化,例如,对于3.14356789,我们希望保留小数位为3位、整数部分至少要显示3位,即将3.14356789格式化为003.144。可以使用java.text包中的NumberFormat类,该类调用类方法:publicstaticfinalNumberFormatgetInstance(),l实例化一个NumberFormat对象,该对象调用lpublicfinalStringformat(doublenumber)l方法可以格式化数字number。lNumberFormat类有如下常用方法:lpublicvoidsetMaximumFractionDigits(intnewValue)lpublicvoidsetMinimumFractionDigits(intnewValue)lpublicvoidsetMaximumIntegerDigits(intnewValue)lpublicvoidsetMinimumIntegerDigits(intnewValue),在下面的例子4中我们用一定的格式输出5的平方根,通过一个20次的循环,每次获取1到8之间的一个随机数。2BigInteger类程序有时需要处理大整数,java.math包中的BigInteger类提供任意精度的整数运算。可以使用构造方法:publicBigInteger(Stringval)构造一个十进制的BigInteger对象。该构造方法可以发生NumberFormatException异常,也就是说,字符串参数val中如果含有非数字字母就会发生NumberFormatException异常。,以下是BigInteger类的常用方法:publicBigIntegeradd(BigIntegerval)返回当前大整数对象与参数指定的大整数对象的和。publicBigIntegersubtract(BigIntegerval)返回当前大整数对象与参数指定的大整数对象的差。publicBigIntegermultiply(BigIntegerval)返回当前大整数对象与参数指定的大整数对象的积。publicBigIntegerdivide(BigIntegerval)返回当前大整数对象与参数指定的大整数对象的商。,publicBigIntegerremainder(BigIntegerval)返回当前大整数对象与参数指定的大整数对象的余。publicintcompareTo(BigIntegerval)返回当前大整数对象与参数指定的大整数的比较结果,返回值是1、-1或0,分别表示当前大整数对象大于、小于或等于参数指定的大整数。publicBigIntegerabs()返回当前大整数对象的绝对值。publicBigIntegerpow(intexponent)返回当前大整数对象的exponent次幂。,publicStringtoString()返回当前大整数对象十进制的字符串表示。publicStringtoString(intp)返回当前大整数对象p进制的字符串表示。在下面的例子5中,计算了2个大整数的和、差、积和商,并计算出了一个大整数的因子个数(因子中不包括1和大整数本身)。,返回,7.4LinkedList泛型类,使用LinkedList泛型类可以创建链表结构的数据对象。链表是由若干个节点组成的一种数据结构,每个节点含有一个数据和下一个节点的引用(单链表),或含有一个数据并含有上一个节点的引用和下一个节点的引用(双链表),节点的索引从0开始。链表适合动态地改变它存储的数据,如,增加、删除节点等。,1LinkedList对象java.util包中的LinkedList泛型类创建的对象以链表结构存储数据,习惯上称LinkedList类创建的对象为链表对象。例如,LinkedListmylist=newLinkedList();创建一个空双链表。然后mylist可以使用add(Stringobj)方法向链表依次增加节点,节点中的数据是参数obj指定对象的引用。,例如:mylist.add(“How”);mylist.add(“Are”);mylist.add(“You”);mylist.add(“Java”);这时,双链表mylist就有了有个节点,节点是自动连接在一起的,不需要我们去做连接,也就是说,不需要我们去操作安排节点中所存放的下一个或上一个节点的引用。,2常用方法以下是LinkedList泛型类的一些常用方法。publicbooleanadd(Eelement)向链表末尾添加一个新的节点,该节点中的数据是参数elememt指定的对象。publicvoidadd(intindex,Eelement)向链表的指定位置添加一个新的节点,该节点中的数据是参数elememt指定的对象。publicvoidaddFirst(Eelement)向链表的头添加新节点,该节点中的数据是参数elememt指定的对象。,publicEremoveFirst()删除第一个节点,并返回这个节点中的对象。publicEremoveLast()删除最后一个节点对象,并返回这个节点中的对象。publicEget(intindex)得到链表中指定位置处节点中的对象。publicEgetFirst()得到链表中第一个节点中的对象。publicEgetLast()得到链表中最后一个节点中的对象。publicintindexOf(Eelement)返回含有数据element的节点在链表中首次出现的位置,如果链表中无此节点则返回-1。,publicintlastIndexOf(Eelement)返回含有数据element的节点在链表中最后出现的位置,如果链表中无此节点则返回-1。publicEset(intindex,Eelement)将当前链表index位置节点中的对象element替换为参数element指定的对象。并返回被替换的对象。publicintsize()返回链表的长度,即节点的个数。publicbooleancontains(Objectelement)判断链表节点中是否有节点含有对象element。,publicObjectclone()得到当前链表的一个克隆链表,该克隆链表中节点数据的改变不会影响到当前链表中节点的数据,反之亦然。下述例子6使用了上述一些方法。3遍历链表例子6借助get方法实现了遍历链表。我们可以借助泛型类Iterator实现遍历链表,一个链表对象可以使用iterator()方法返回一个Iterator类型的对象,如果链表是“Student类型”的链表,即链表节点中的数据是Student类创建的对象,那么该链表使用iterator()方法返回一个Iterator类型的对象,该对象使用next()方法遍历链表。在下面的例子7中,我们把学生的成绩存放在一个链表中,并实现了遍历链表。,4LinkedList泛型类实现的接口LinkedList泛型类实现了泛型接口List,而List接口由是Collection接口的子接口。LinkedList类中的绝大部分方法都是接口方法的实现。编程时,可以使用接口回调技术,即把LinkedList对象的引用赋值给Collection接口变量或List接口变量,那么接口就可以调用类实现的接口方法。,5SDK1.5之前的LinkedList类JDK1.5之前没有泛型的LinkedList类,可以用普通的LinkedList创建一个链表对象,例如:LinkedListmylist=newLinkedList();创建了一个空双链表。然后mylist链表可以使用add(Objectobj)方法向这个链表依次添加节点。由于任何类都是Object类的子类,因此可以把任何一个对象作为链表节点中的对象。,需要注意的是当使用get()获取一个节点中的对象,要用类型转换运算符转换回原来的类型。Java泛型的主要目的是可以建立具有类型安全的集合框架,如链表、散列表等数据结构,最重要的一个优点就是:在使用这些泛型类建立的数据结构时,不必进行强制类型转换,即不要求进行运行时类型检查。SDK1.5是支持泛型的编译器,它将运行时类型检查提前到编译时执行,使代码更安全。如果你使用旧版本的LinkedList类,1.5编译器会给出警告信息,但程序仍能正确运行。下面是使用旧版本LinkedList的例子。,返回,7.5HashSet泛型类,HashSet泛型类在数据组织上类似数学上的集合,可以进行“交”、“并”、“差”等运算。1HashSet对象HashSet泛型类创建的对象称作集合,例如HashSetset=HashSet();那么,set就是一个可以存储String类型数据的集合,set可以调用add(Strings)方法将String类型的数据添加到集合中,添加到集合中的数据称做集合的元素。,集合不允许有相同的元素,也就是说,如果b已经是集合中的元素,那么再执行set.add(b)操作是无效的。集合对象的初始容量是16个字节,装载因子是0.75,也就是说,如果集合添加的元素超过总容量的75%时,集合的容量将增加一倍。2常用方法publicbooleanadd(Eo)向集合添加参数指定的元素。publicvoidclear()清空集合,使集合不含有任何元素。publicbooleancontains(Objecto)判断参数指定的数据是否属于集合。publicbooleanisEmpty()判断集合是否为空。,publicbooleanremove(Objecto)集合删除参数指定的元素。publicintsize()返回集合中元素的个数。ObjecttoArray()将集合元素存放到数组中,并返回这个数组。booleancontainsAll(HanshSetset)判断当前集合是否包含参数指定的集合。publicObjectclone()得到当前集合的一个克隆对象,该对象中元素的改变不会影响到当前集合中元素,反之亦然。,3集合的交、并与差集合对象调用booleanaddAll(HashSetset)方法可以和参数指定的集合求并运算,使得当前集合成为两个集合的并。集合对象调用booleanbooleanretainAll(HashSetset)方法可以和参数指定的集合求交运算,使得当前集合成为两个集合的交。集合对象调用booleanbooleanbooleanremoveAll(HashSetset)方法可以和参数指定的集合求差运算,使得当前集合成为两个集合的差参数指定的集合必须和当前集合是同种类型的集合,否则上述方法返回false。,下面的例子10求2个集合A、B的对称差集合,即求。上述程序的运行结果:A和B的对称差集合有4个元素:4,6,3,5,4HashSet泛型类实现的接口HashSet泛型类实现了泛型接口Set,而Set接口由是Collection接口的子接口。HashSet类中的绝大部分方法都是接口方法的实现。编程时,可以使用接口回调技术,即把HashSet对象的引用赋值给Collection接口变量或Set接口变量,那么接口就可以调用类实现的接口方法。,返回,7.6HashMap泛型类,HashMap也是一个很实用的类,HashMap对象采用散列表这种数据结构存储数据,习惯上称HashMap对象为散列映射对象。散列映射用于存储键/值数据对,允许把任何数量的键/值数据对存储在一起。键不可以发生逻辑冲突,即不要两个数据项使用相同的键,如果出现两个数据项对应相同的键,那么,先前散列映射中的键/值对将被替换。散列映射在它需要更多的存储空间时会自动增大容量。,例如,如果散列映射的装载因子是0.75,那么当散列映射的容量被使用了75%时,它就把容量增加到原始容量的倍。对于数组和链表这两种数据结构,如果要查找它们存储的某个特定的元素却不知道它的位置,就需要从头开始访问元素直到找到匹配的为止;如果数据结构中包含很多的元素,就会浪费时间。这时最好使用散列映射来存储要查找的数据,使用散列映射可以减少检索的开销。,1HashMap对象HashMap泛型类创建的对象称作散列映射,例如:HashMaphashtable=HashSet();那么,hashtable就可以存储“键/值”对数据,其中的键必须是一个String对象,键对应的值必须是Student对象。hashtable可以调用publicVput(Kkey,Vvalue)将键/值对数据存放到散列映射中,该方法同时返回键所对应的值。,2常用方法publicvoidclear()清空散列映射。publicObjectclone()返回当前散列映射的一个克隆。publicbooleancontainsKey(Objectkey)如果散列映射有键/值对使用了参数指定的键,方法返回true,否则返回false。publicbooleancontainsValue(Objectvalue)如果散列映射有键/值对的值是参数指定的值,方法返回true,否则返回false。,publicVget(Objectkey)返回散列映射中使用key做键的键/值对中的值。publicbooleanisEmpty()如果散列映射不含任何键/值对,方法返回true,否则返回false。publicVremove(Objectkey)删除散列映射中键为参数指定的键/值对,并返回键对应的值。publicintsize()返回散列映射的大小,即散列映射中键/值对的数目。,3遍历散列映射如果想获得散列映射中所有键/值对中的值,首先使用publicCollectionvalues()方法返回一个实现Collection接口类创建的对象的引用,并要求将该对象的引用返回到Collection接口变量中。values()方法返回的对象中存储了散列映射中所有“键/值”对中的“值”,这样接口变量就可以调用类实现的方法,比如获取Iterator对象,然后输出所有的值。下面的例子11使用了散列映射的常用方法,并遍历了散列映射。,4HashMap泛型类实现的接口HashMap泛型类实现了泛型接口Map,HashMap类中的绝大部分方法都是Map接口方法的实现。编程时,可以使用接口回调技术,即把HashMap对象的引用赋值给Map接口变量,那么接口就可以调用类实现的接口方法。,返回,7.7TreeSet泛型类,TreeSet类是实现Set接口的类,它的大部分方法都是接口方法的实现。TreeSet泛型类创建的对象称作树集,例如TreeSettree=TreeSet();那么,tree就是一个可以存储Student类型数据的集合,tree可以调用add(Strings)方法将Student类型的数据添加到树集中,存放到树集中的对象按对象的串表示升序排列。以下是TreeSet类的常用方法:,publicbooleanadd(Eo)向树集添加加对象,添加成功返回true,否则返回false。publicvoidclear()删除树集中的所有对象。publicvoidcontains(Objecto)如果包含对象o方法返回true,否则返回false。publicEfirst()返回树集中的第一个对象(最小的对象)。publicElast()返回最后一个对象(最大的对象)。,publicisEmpty()判断是否是空树集,如果树集不含对象返回true。publicbooleanremove(Objecto)删除树集中的对象o。publicintsize()返回树集中对象的数目。但很多对象不适合按着字符串排列大小。对象调用toString()方法就可以获得自己的字符串表示,比如一个文本框(TextField)的字符串表示是:java.awt.TextFieldtextfield0,0,0,0 x0,invalid,text=,editable,selection=0-0如果让文本框按着字符串来比较大小似乎无任何意义。,我们在创建树集时可自己规定树集中的对象按着什么样的“大小”顺序排列。假如我们有四个学生对象,他们有姓名和成绩,我们想把这四个对象添加到树集中,并按着成绩的高低排列,而不是按着姓名的字典序排列节点。首先创建学生的Student类可以实现接口:Comparable。Comparable接口中有一个方法:publicintcompareTo(Objectb);Student类通过实现这个接口来规定它创建的对象的大小关系,如下所示:,classStudentimplementsComparableintenglish=0;Stringname;Student(inte,Stringn)english=e;name=n;publicintcompareTo(Objectb)Studentst=(Student)b;return(this.english-st.english);,Comparator是java.util包中的一个接口,compare是接口中的方法,因此匿名类的方法体必须实现接口中的方法(有关匿名类可参见第5章,13节)。当mytree每次添加对象时,都会再调用接口中的方法实现对象大小的互相比较,mytree调用接口方法的过程对编程人员是不可见的,Sun公司在编写开发TreeSet类时已经实现了这一机制。下面的例子12把Student对象添加到树集中,并按

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论