




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章Java工具类6.1Java类集框架6.2泛型和枚举6.3常用类本章重点集合类、数学类的使用6.1Java类集框架6.1.1JAVA中的类集框架6.1.2List接口及实现类6.1.3Set接口及实现类6.1.4Map接口及实现类1Java的类集框架JAVA的类集框架实现了对各种数据结构的封装,极大的降低了我们对数据管理与处理的难度。所谓框架就是一个类库的集合。集合框架就是一个用来表示和操作集合的统一的架构,包含了实现集合的接口与类。类集(Collection或称为容器)是一种包含其它对象,并提供对所包含对象的操作方法的对象,其包含的对象可以由同一类型的对象组成,也可以由不同类型的对象组成。6.1Java中的类集框架概念2类集框架中的接口6.1Java中的类集框架层次2集合框架中的接口Collection:集合层次中的根接口,JDK没有提供这个接口直接的实现类。Set:不能包含重复的元素。对象可能不是按存放的次序存放,也就是说不能像数组一样按索引的方式进行访问,SortedSet是一个按照升序排列元素的Set。List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。Map:包含了key-value对。Map不能包含重复的key。SortedMap是一个按照升序排列key的Map。6.1Java中的类集框架接口2集合框架中的实现类SortedSetSetListMapHashSet
LinkedHashSet
TreeSet
ArrayList
LinkedList
SortedMapHashMap
TreeMap
6.1Java中的类集框架接口与类2Collection接口Collection接口是构造类集框架的基础。它声明所有类集都将拥有的核心方法,因为所有类集都实现Collection,所以熟悉它的方法对于清楚地理解框架是必要的。下面是该类接口中声明的最常用的方法:booleanadd(Objectobj)
将obj添加对类集中voidclear()
从类集中删除所有元素,即清空类集booleancontains(Objectobj)
如果obj是调用类集的一个元素,则返回true,否则,返回false,依赖于对象的equals()方法booleanisEmpty()
如果调用类集是空的,则返回true;否则返回falseIteratoriterator()
返回调用类集的迭代器booleanremove(Objectobj)
从调用类集中删除obj的一个实例。如果这个元素被删除了,则返回true;否则返回falseintsize()
返回调用类集中元素的个数6.1Java中的类集框架Collection接口2Collection接口中的其它方法booleanaddAll(Collectionc)将集合c中的所有元素都加入到当前类集中booleancontainsAll(Collectionc)如果调用类集包含了c中的所有元素,则返回true;否则,返回falsebooleanremoveAll(Collectionc)从调用类集中删除c的所有元素。如果类集被改变了(也就是说元素被删除了),则返回true;否则返回falsebooleanretainAll(Collectionc)删除调用类集中除了包含在c中的元素之外的全部元素。如果类集被改变了(也就是说元素被删除了),则返回true,否则返回falseObject[]toArray()返回一个数组,该数组包含了所有存储在调用类集中的元素。数组元素是类集元素的拷贝Object[]toArray(Objectarray[])返回一个数组,该数组仅仅包含了那些类型与数组元素类型匹配的类集元素。数组元素是类集元素的拷贝。如果array的大小与匹配元素的个数相等,它们被返回到array。如果array的大小比匹配元素的个数小,将分配并返回一个所需大小的新数组,如果array的大小比匹配元素的个数大,在数组中,在类集元素之后的单元被置为null。如果任一类集元素的类型都不是array的子类型,则引发一个ArrayStoreException异常6.1Java中的类集框架Collection接口2ArrayList和LinkedListArrayList:我们可以将其看作是能够自动增长容量的数组。利用ArrayList的toArray()返回一个数组。Arrays.asList()返回一个列表。Liststooges=Arrays.asList("Larry","Moe","Curly");
LinkedList是采用双向循环链表实现的。利用LinkedList实现栈(stack)、队列(queue)、双向队列,包含:getFirstgetLastaddFirstaddLastremoveFirstremoveLastArrayList底层采用数组完成,而LinkedList则是以一般的双向链表(double-linkedlist)完成,其内每个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素。如果我们经常在List的开始处增加元素,或者在List中进行插入和删除操作,应该使用LinkedList,否则的话,使用ArrayList将更加快速。6.1Java中的类集框架List接口类2List类使用举例使用List接口的实现类Collectioncol=newArrayList();col=newLinkedList();col=newVector();//以下代码使用这三个类输出效果一致
col.add(newInteger(50));col.add(newFloat(3.14f));col.add("hello");col.add(newInteger(50));//添加
col.add(newDate());Iteratoriter=col.iterator();//获取每一元素,并输出
while(iter.hasNext()){ Objectitem=iter.next();System.out.println(item);}
col.remove(newFloat(3.14f));
//删除
System.out.println("集合长度:"+col.size());System.out.println(col.contains("hello"));//是否有"hello"col.clear();//清空案例6-16.1Java中的类集框架List类实例2List类使用举例List接口使用举例
Listlst=newArrayList();lst.add(newInteger(50));lst.add("hello");lst.add(newDate());lst.add(0,newInteger(30));//在指定位置添加
//输出
for(inti=0;i<lst.size();i++)System.out.println(lst.get(i));System.out.println("hello是类集中的第"+lst.indexOf("hello")+"个元素");lst.remove(newInteger(30));lst.remove(1);//根据编号删除6.1Java中的类集框架List类实例3HashSet和TreeSetTreeSet是依靠TreeMap来实现的。TreeSet是一个有序集合,TreeSet中元素将按照升序排列,缺省是按照自然顺序进行排列,意味着TreeSet中元素要实现Comparable接口。我们可以在构造TreeSet对象时,传递实现了Comparator接口的比较器对象。HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。案例6-36.1Java中的类集框架Set接口类3Set类使用举例使用Set接口的实现类Collectioncol=newTreeSet();col=newHashSet();
col.add(newInteger(50));col.add(newInteger(50));col.add("hello");col.add(newFloat(3.14f));col.add(newDate());//添加
//添加过程会出异常,为什么?
Iteratoriter=col.iterator();//获取每一元素,并输出
while(iter.hasNext()){Objectitem=iter.next();System.out.println(item);}col.remove(newFloat(3.14f));//删除
System.out.println("集合长度:"+col.size());System.out.println(col.contains("hello"));//是否有"hello"col.clear();//清空//考虑一下,与使用List接口的实现类相比,效果有什么不同6.1Java中的类集框架Set类实例3集合类使用举例之VectorVector是JDK1.2之前的类,向量。但为了程序的通用性,最好不要使用其特有的方法,下面的代码演示了其特有方法的使用
Vectorv=newVector();v.addElement("aaaa");//添加,等同于v.add("aaaa");Objectobj=v.elementAt(0);//获取指定位置的元素,等同于v.get(0);v.removeElement("aaa");//删除,等同于v.remove("aaa")v.removeElementAt(0);//等同于v.remove(0)v.removeAllElements();//清空,等同于v.clear()Enumerationenu=v.elements();while(enu.hasMoreElements())//输出
System.out.println(enu.nextElement());6.1Java中的类集框架Vector4Map映射(map)是一个存储关键字和值的关联或者说是关键字/值对的对象。给定一个关键字,可以得到它的值。关键字和值都是对象。关键字必须是唯一的。但值是可以被复制的。Map接口映射唯一关键字到值。关键字(key)是以后用于检索值的对象。给定一个关键字和一个值,可以存储这个值到一个Map对象中。当这个值被存储以后,就可以使用它的关键字来检索它。映射循环使用两个基本操作:get()和put()。使用put()方法可以将一个指定了关键字和值的值加入映射。为了得到值,可以通过将关键字作为参数来调用get()方法。调用返回该值。6.1Java中的类集框架Map4Map接口的方法voidclear()从调用映射中删除所有的关键字/值对booleancontainsKey(Objectk)检查调用映射中是否包含关键字KbooleancontainsValue(Objectv)检查调用映射中是否包含值VObjectget(Objectk)返回与关键字k相关联的值booleanisEmpty()如果调用映射是空的,则返回true;否则返回falseObjectput(Objectk,Objectv)将一个键值对加入调用映射Objectremove(Objectk)删除关键字等于k的键值对intsize()返回映射中关键字/值对的个数SetentrySet()返回包含了映射中的项的集合(Set)。该集合包含了类型Map.Entry的对象。这个方法为调用映射提供了一个集合“视图”SetkeySet()返回一个包含调用映射中关键字的集合(Set)。这个方法为调用映射的关键字提供了一个集合“视图”Collectionvalues()返回一个包含了映射中的值的类集。这个方法为映射中的值提供了一个类集“视图”6.1Java中的类集框架Map接口4Map接口Map接口的可用实现类主要有HashMap,TreeMap,Hashtable,PropertiesHashtable,Properties是JDK1.0/1.1中的HashMap对key进行散列。TreeMap按照key进行排序。和Set类似,HashMap的速度通常都比TreeMap快,只有在需要排序的功能的时候,才使用TreeMap。案例6-46.1Java中的类集框架Map接口4Map接口对Map接口的操作,常常是转换为对类集的操作,一个Map可通过自身的方法转换为三个类集:Key,Value,Key+ValueSetkeys=map.keySet()Collectionsvalues=map.values();Setkvs=map.entrySet();内容为Map.Entry的集合6.1Java中的类集框架Map接口4Map使用举例Mapm=newHashMap();//TreeMap,Hashtable,Properties均可m.put("张三",);m.put("李四",);m.put("王五",);m.put("张三",);//覆盖掉第一个值System.out.println("是否有李四的电话号码:”
+m.containsKey("李四"));m.remove("王五");//删除王五的记录StringzsCode=(String)m.get("张三");6.1Java中的类集框架Map接口4Map使用举例//输出所有电话薄
//通过迭代Key
Setkeys=m.keySet();Iteratoriter=keys.iterator();while(iter.hasNext()){Objectkey=iter.next();Objectvalue=m.get(key);System.out.println(key+":"+value);}//通过迭代MapEntry,一个Map.Entry是一个Key+value的组合
Setentrys=m.entrySet();Iteratoritr=entrys.iterator();while(itr.hasNext()){Map.Entryentry=(Map.Entry)itr.next();Stringkey=(String)entry.getKey();Stringvalue=(String)entry.getValue();System.out.println(key+":"+value);6.1Java中的类集框架Map接口5Properties介绍属性(Properties)是Hashtable的一个子类。它用来保持值的列表,在其中关键字和值都是字符串(String)Properties类的一个有用的功能是可以指定一个默认属性,如果没有值与特定的关键字相关联,则返回这个默认属性。例如,默认值可以与关键字一起在getProperty()方法中被指定——如getProperty(“name”,“defaultvalue”)。如果“name”值没有找到,则返回“defaultvalue”Properties中主要提供了以下独特的方法:
ObjectsetProperty(String
key,String
value)添加值对,key与Value均为字符串
StringgetProperty(Stringkey)根据key检索对应的Valuevoidstore(OutputStream
out,String
header)将所有的键值对写入指定输出流
voidload(InputStream
inStream)
从指定输入流中载入键值对
voidlist(PrintWriter
out)
用指定的流显示键值对内容
6.1Java中的类集框架PropertiesJDK1.2对以前类集的替代用ArrayList代替了Vector。用HashMap代替了Hashtable。用LinkedList代替了Stack。相对于ArrayList和HashMap,Vector和Hashtable中所有的方法都是线程同步的。类集总结类集框架为程序员提供了一个功能强大的设计方案以解决编程过程中面临的大多数任务。下一次当你需要存储和检索信息时,可考虑使用类集。记住,类集不仅仅是专为那些“大型作业”,例如联合数据库,邮件列表或产品清单系统等所专用的。它们对于一些小型作业也是很有效的。例如,TreeMap可以给出一个很好的类集以保留一组文件的字典结构。TreeSet在存储工程管理信息时是十分有用的。坦白地说,对于采用基于类集的解决方案而受益的问题种类只受限于你的想象力。6.2
泛型和枚举6.2.1Java中的泛型6.2.2Java中的枚举1泛型
泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全简单。6.2Java中的泛型有两个类如下,要构造两个类的对象,并打印出各自的成员xpublicclassStringFoo{
privateStringx;
publicStringFoo(Stringx){
this.x=x;
}
publicStringgetX(){
returnx;
}
publicvoidsetX(Stringx){
this.x=x;
}}publicclassDoubleFoo{
privateDoublex;
publicDoubleFoo(Doublex){
this.x=x;
}
publicDoublegetX(){
returnx;
}
publicvoidsetX(Doublex){
this.x=x;
}}
以上的代码实在无聊6.2Java中的泛型引入定义对上面的两个类进行重构,写成一个类publicclassObjectFoo{
privateObjectx;
publicObjectFoo(Objectx){this.x=x;
}
publicObjectgetX(){returnx;
}
publicvoidsetX(Objectx){this.x=x;
}}
6.2Java中的泛型引入定义强制转换publicclassObjectFooDemo{
publicstaticvoidmain(Stringargs[]){
ObjectFoostrFoo=newObjectFoo(newStringFoo("HelloGenerics!"));
ObjectFoodouFoo=newObjectFoo(newDoubleFoo(Double("33")));
ObjectFooobjFoo=newObjectFoo(newObject());
System.out.println("strFoo.getX="+(StringFoo)strFoo.getX());
System.out.println("douFoo.getX="+(DoubleFoo)douFoo.getX());
System.out.println("objFoo.getX="+objFoo.getX());
}}6.2Java中的泛型引入定义用Java5泛型来实现案例6-5publicclassGenericsFoo<T>{
privateTx;
publicGenericsFoo(Tx){this.x=x;
}
publicTgetX(){returnx;
}
publicvoidsetX(Tx){this.x=x;
}}6.2Java中的泛型如何定义实例化publicclassGenericsFooDemo{
publicstaticvoidmain(Stringargs[]){
GenericsFoo<String>strFoo=newGenericsFoo<String>("HelloGenerics!");
GenericsFoo<Double>douFoo=newGenericsFoo<Double>(newDouble("33"));
GenericsFoo<Object>objFoo=newGenericsFoo<Object>(newObject());
System.out.println("strFoo.getX="+strFoo.getX());
System.out.println("douFoo.getX="+douFoo.getX());
System.out.println("objFoo.getX="+objFoo.getX());
}}6.2Java中的泛型使用泛型2枚举枚举的本质是类:定义枚举:可以有方法,包括构造方法。枚举类可以实现接口。每个枚举值可以实现接口带有抽象方法的枚举类6.2Java中的枚举型要点枚举定义publicenumENumColor{Red,Orange,Yellow,Green,Blue;
publicStringgetColorString(){switch(this.ordinal()){case0:return"ColorisRed"; case1:return"ColorisOrange";case2:return"ColorisYellow";case3:return"ColorisGreen";case4:return"ColorisBlue";default:return"invalidColor";}}};6.2Java中的枚举型定义枚举实例案例6-6publicclassENumExample{publicstaticvoidmain(String[]args){
for(ENumColorcolor:ENumColor.values()){System.out.println(color+"-----"+
color.getColorString());}System.out.println("\n\nXXXXConstvalue:"+
ENumColor.Yellow);}}6.2Java中的枚举型应用了解java.lang包掌握包装类
掌握String、StringBuilder、StringBuffer
以下类:ClassObjectDateCalendarMath与Math.random()Random类6.3常用类Class类案例6-7使用对象中的getClass()方法使用静态forName()方法使用自定义ClassLoader
对象加载新类创建的对象或或无需声明自动创建对象通过6.3Class类特点getClass()和getSuperclass()classStoreString{protectedStoreString(){}privateStringname="diana";}classStoreIntegerextendsStoreString{protectedStoreInteger(){}privateintdeptno;}publicclassClassDemo{protectedClassDemo(){}publicstaticvoidmain(String[]args){StoreStringobjString=newStoreString();StoreIntegerobjInteger=newStoreInteger();ClassobjClass;
objClass=objString.getClass();System.out.println(“objString对象的类型是:“+objClass.getName());objClass=objInteger.getClass();System.out.println(“objInteger对象的类型是:"+objClass.getName());objClass=objClass.getSuperclass();System.out.println(“objInteger的父类是"+objClass.getName());}}6.3Class类使用Object类方法说明booleanequals(Objectobj)将当前对象实例与给定的对象进行比较,检查它们是否相等voidfinalize()throwsThrowable当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。通常被子类重写StringtoString()返回此对象的字符串表示voidwait()throwsInterruptedException使当前线程进入等待状态所有类的父类默认情况下,用户定义的类扩展自Object类6.3Object类使用Date类Date类表示日期和时间提供操纵日期和时间各组成部分的方法Date类的最佳应用之一是获取系统当前时间构造方法说明Date()使用当天的日期创建DateDate(longdt)使用自1970年1月1日以后的指定毫秒数创建Date6.3Date类使用Date类的使用voiddisplay(){StringstrDate,strTime="";
DateobjDate=newDate();System.out.println(“今天的日期是:"+objDate);
longtime=objDate.getTime();System.out.println(“自1970年1月1日起"+“以毫秒为单位的时间(GMT):"+time);
strDate=objDate.toString();//提取GMT时间
strTime=strDate.substring(11,(strDate.length()-4));//按小时、分钟和秒提取时间
strTime=“时间:"+strTime.substring(0,8);System.out.println(strTime);}6.3Date类使用日期格式importjava.util.*;importjava.text.*;classAAA{ publicstaticvoidmain(String[]args) { Randomrnd=newRandom(); intx=rnd.nextInt(); System.out.println("HelloWorld!"+x); doubled=Math.random(); System.out.println("HelloWorld!="+d);
SimpleDateFormatsd=newSimpleDateFormat("yyyy:MM:dd----hh-mm-ss"); System.out.println(sd.format(newDate())); }}6.3Date类使用Random类案例6-8此类生成随机数两种构造方法Random类的方法:newRandom(long);没有参数
nextInt()nextFloat()nextDouble()Doubled=Math.random();//在0—1之间Randomrnd=newRandom();intx=rnd.nextInt(1000);//在0—1000之间intx=rnd.nextInt();6.3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中考说明文相关知识点
- 如何加强供电所管理
- 技术类实习生合同范本
- 培训出差报告
- 会员权益转让合同
- 彩妆创业财务分析报告
- 房地产拍卖合同示范
- 教学设计人物课件
- 6S管理在医院药品管理中的应用
- 技术部经理履新述职报告
- SOR-FJ-001-01抗生素发酵工艺批生产记录(整套)
- 湖北省2024年中考道德与法治真题试卷【附真题答案】
- 《中国饮食文化》课件-中国饮食文化溯源
- 浙江省杭州市上城区部分学校2023-2024学年九年级下学期科学学情调查考试(二)试卷
- QCT1168-2022汽车用电动空气压缩机性能要求及台架试验方法
- 高考数学解答题常考公式及答题模板
- 退租房协议书
- 人教版高一下学期期末考试数学试卷与答案解析(共五套)
- 湖北省武汉市2024届高三下学期四月调考数学试卷
- DB43-T 2927-2024 中医护理门诊建设与管理规范
- 森林草原防灭火培训
评论
0/150
提交评论