集合和异常处理课件_第1页
集合和异常处理课件_第2页
集合和异常处理课件_第3页
集合和异常处理课件_第4页
集合和异常处理课件_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

关于集合和异常处理第1页,讲稿共67页,2023年5月2日,星期三集合注意:不是所有的集合类都是从Collection继承第2页,讲稿共67页,2023年5月2日,星期三集合接口(Conllection接口)第3页,讲稿共67页,2023年5月2日,星期三集合接口(Map接口)第4页,讲稿共67页,2023年5月2日,星期三集合框架第5页,讲稿共67页,2023年5月2日,星期三集合有三种类型List:事物列表Set:唯一的事物列表Map具有唯一ID的事物第6页,讲稿共67页,2023年5月2日,星期三List接口下的几个实现类ArrayList:一个可增长的数组,提供快速遍历和快速随机访问,当需要快速遍历时而不是做大量删除和插入时,用ArrayListVector(Hashtable)为了线程安全,Vector方法被同步,通常使用ArrayList而不用Vector。ArrayList和Vector是唯一的两个设计了RadomAccess方法类第7页,讲稿共67页,2023年5月2日,星期三Set接口下的几个实现类Set接口:重在数据的唯一性,不允许重复,set接口通过equals()方法确定两个对象是否相等,重复时只能有一个放在set中。Set的三种实现类HashSet:未排序、未分类的集合,不能重复插入值,不关心数据顺序时使用LinkedHashSet:一个排序,但未分类的集合,在元素之间使用一个双向链表来连接,当关心遍历顺序时使用LinkedHashSet,它将按插入的顺序进行遍历,当使用HashSet时遍历的顺序是不可预知的。TreeSet:按照一种二叉树的结构进行存储,并可以保证遍历时,会按照元素的自然顺序进行排序。也可以自己构造一个TreeSet,让其按照自己的想法进行排序第8页,讲稿共67页,2023年5月2日,星期三Map接口下的实现类Map接口:按“键-值”对进行插入,(键、值都是对象)可以按照键来搜索值对象可以查找值的集合,也可以查找键的集合HashMap:一种未分类,未排序的映射类,不需要顺序时HashMap是一种最好的选择,因为其效率较高,HashMap允许集合中有一个null键和多个null值。Hashtable:Hashtable是HashMap的同步版本,但Hashtable不允许有任何的null存在。LinkedHashMap:和linkedHashSet一样,LinkedHashMap维护插入和访问的顺序,添加和删除比HashMap慢,但遍历的速度要更快。TreeMap:一个顺序的Map集合。第9页,讲稿共67页,2023年5月2日,星期三集合函数集合的定义;---是将多个元素组成一个单元的对象.作用:---集合用于存储、检索和操作数据,以己将数据从一个方法传输至另一个方法。经常使用到的java.util包中的:ArrayList、LinkdList,、HashMap、Vector、List和Map等类和接口。第10页,讲稿共67页,2023年5月2日,星期三ArrayList类的概念ArrayList对象:是长度可变的对象引用数组,用于创建动态数组。它扩展AbstractList并实现List接口。三个之间的比较:List是有序的集合,可以包含重复的元素。AbstractList类实现List接口,有助随机方式访问元素。ArrayList在访问和遍历对象时,性能优。第11页,讲稿共67页,2023年5月2日,星期三ArrayList类java.lang.Object

java.util.AbstractCollection<E> java.util.AbstractList<E> java.util.ArrayList<E>

第12页,讲稿共67页,2023年5月2日,星期三ArrayList特性ArrayList支持按照需要增长的动态数组。在java中,标准数组是固定长度的,数组创建以后,不能增长或者收宿。而arrarylist可以动态增减大小,数组列表初始长度超过时,集合自动增长;当删除时,集合自动变小。第13页,讲稿共67页,2023年5月2日,星期三ArrayList类优点每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。第14页,讲稿共67页,2023年5月2日,星期三ArrayList类构造方法构造方法:ArrayList()

构造一个初始容量为10的空列表。ArrayList(Collection<?extendsE>

c)

构造一个包含指定collection的元素的列表,这些元素是按照该collection的迭代器返回它们的顺序排列的。ArrayList(int

initialCapacity)

构造一个具有指定初始容量的空列表。第15页,讲稿共67页,2023年5月2日,星期三ArrayList类常用方法常用方法:

booleanadd(E

e)

将指定的元素添加到此列表的尾部。

voidadd(int

index,E

element)

将指定的元素插入此列表中的指定位置。Voidclear()

移除此列表中的所有元素。

voidtrimToSize()

将此ArrayList实例的容量调整为列表的当前大小。E

set(int

index,E

element)

用指定的元素替代此列表中指定位置上的元素。第16页,讲稿共67页,2023年5月2日,星期三ArrayList类常用方法

booleanremove(int

index)

移除此列表中指定位置上的元素。

booleanremove(Object

o)

移除此列表中首次出现的指定元素(如果存在)。

intsize()

返回此列表中的元素数BooleanisEmpty()

如果此列表中没有元素,则返回true

E

get(int

index)

返回此列表中指定位置上的元素。

voidensureCapacity(int

minCapacity)

如有必要,增加此ArrayList实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。第17页,讲稿共67页,2023年5月2日,星期三ArraryList示例:ArrayListls=newArrayList();ls.add("a");ls.add("b");ls.add("c");ls.add("d");ls.add(2,"4");ls.get(2);ls.trimToSize();ls.set(1,"haocai");ls.ensureCapacity(6);ls.isEmpty();ls.removeAll(ls);//removeRange(1,3);ls.remove(3);ls.clear();System.out.println(ls.get(4));System.out.println(ls.isEmpty());System.out.println(ls);第18页,讲稿共67页,2023年5月2日,星期三ArrayList类ArrayListls=newArrayList();t3b=newt3();ls.add("C");ls.add("F");ls.add("E");ls.add("D");ls.add(b);ls.remove(4);System.out.println(ls.size());System.out.println(ls);第19页,讲稿共67页,2023年5月2日,星期三Vector类java.util

类Vector<E>java.lang.Objectjava.util.AbstractCollection<E>java.util.AbstractList<E>

java.util.Vector<E>

第20页,讲稿共67页,2023年5月2日,星期三Vector类Vector类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector的大小可以根据需要增大或缩小,以适应创建Vector后进行添加或移除项的操作。第21页,讲稿共67页,2023年5月2日,星期三Vector类常用的方法

voidaddElement(E

obj)

将指定的组件添加到此向量的末尾,将其大小增加1。voidinsertElementAt(E

obj,int

index)

将指定对象作为此向量中的组件插入到指定的index处。

E

elementAt(int

index)

返回指定索引处的组件。

booleancontains(Object

o)

如果此向量包含指定的元素,则返回true。

String

toString()

返回此向量的字符串表示形式,其中包含每个元素的String表示形式。第22页,讲稿共67页,2023年5月2日,星期三Vector类常用的方法

E

set(int

index,E

element)

用指定的元素替换此向量中指定位置处的元素。

E

remove(int

index)

移除此向量中指定位置的元素。

intindexOf(Object

o)

返回此向量中第一次出现的指定元素的索引,如果此向量不包含该元素,则返回-1。第23页,讲稿共67页,2023年5月2日,星期三Vector类常用的方法

E

set(int

index,E

element)

用指定的元素替换此向量中指定位置处的元素。

E

remove(int

index)

移除此向量中指定位置的元素。

intindexOf(Object

o)

返回此向量中第一次出现的指定元素的索引,如果此向量不包含该元素,则返回-1。第24页,讲稿共67页,2023年5月2日,星期三Enumeration类Enumeration是一个接口类,它提供了一种访问各种数据结构中的所有数据抽象机制,就是我们要访问各种数据结构中的所有元素时,都可以使用同样方式,调用同样的方法。实现Enumeration接口的对象,它生成一系列元素,一次生成一个。第25页,讲稿共67页,2023年5月2日,星期三Enumeration类

booleanhasMoreElements()

测试此枚举是否包含更多的元素。空是返回false,则ture;

EnextElement()

如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素,取出保存对象。第26页,讲稿共67页,2023年5月2日,星期三Enumeration类示例Vectorv=newVector();v.addElement(“a”);v.addElement(“b”);第27页,讲稿共67页,2023年5月2日,星期三Iterator迭代器集合通常,有许多情况需要遍历集合中的元素,例如显示集合中的每一个元素。一种遍历方法是使用迭代器(iterator),它是实现iterator或者ListIterator接口的一个对象。使用迭代器能够在集合中遍历以获得或者删除元素.第28页,讲稿共67页,2023年5月2日,星期三Iterator迭代器对collection进行迭代的迭代器。迭代器取代了JavaCollectionsFramework中的Enumeration。迭代器与枚举有两点不同:迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的collection移除元素。方法名称得到了改进。第29页,讲稿共67页,2023年5月2日,星期三Iterator迭代器的方法方法:

booleanhasNext()

如果仍有元素可以迭代,则返回true。

E

next()

返回迭代的下一个元素。

voidremove()

从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)。第30页,讲稿共67页,2023年5月2日,星期三Iterator常用类演示//数组迭代Iteratoritr=al.iterator();//如果仍有元素可以迭代,则返回true//循环while(itr.hasNext()){

//

对象,返回迭代的下一个元素。Objectelement=itr.next();//打印System.out.print(element);}第31页,讲稿共67页,2023年5月2日,星期三HashSet类java.util

类HashSet<E>java.lang.Object

java.util.AbstractCollection<E>java.util.AbstractSet<E>java.util.HashSet<E>此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。第32页,讲稿共67页,2023年5月2日,星期三HashSet类方法

intsize()

返回此set中的元素的数量(set的容量)。

booleanadd(E

e)

如果此set中尚未包含指定元素,则添加指定元素。

voidclear()

从此set中移除所有元素。BooleanisEmpty()

如果此set不包含任何元素,则返回true。第33页,讲稿共67页,2023年5月2日,星期三HashSet类方法示例HashSeths=newHashSet();hs.add("ok");hs.remove("ok");System.out.print(hs.size());System.out.print(hs);第34页,讲稿共67页,2023年5月2日,星期三Hashtable类java.util

类Hashtable<K,V>java.lang.Object

java.util.Dictionary<K,V>java.util.Hashtable<K,V>此类实现一个哈希表,该哈希表将键映射到相应的值。任何非null对象都可以用作键或值。第35页,讲稿共67页,2023年5月2日,星期三Hashtable类如果很多条目要存储在一个Hashtable

中,那么与根据需要执行自动rehashing操作来增大表的容量的做法相比,使用足够大的初始容量创建哈希表或许可以更有效地插入条目。初始容量主要控制空间消耗与执行rehash

操作所需要的时间损耗之间的平衡。如果初始容量大于Hashtable所包含的最大条目数除以加载因子,则永远不会发生rehash

操作。但是,将初始容量设置太高可能会浪费空间。第36页,讲稿共67页,2023年5月2日,星期三Hashtable类方法

V

put(K

key,V

value)

将指定key

映射到此哈希表中的指定value。Enumeration<K>keys()

返回此哈希表中的键的枚举。

intsize()

返回此哈希表中的键的数量。String

toString()

返回此Hashtable对象的字符串表示形式,其形式为ASCII字符",

"(逗号加空格)分隔开的、括在括号中的一组条目。

Object.hashCode()

返回一个叫闪列码的值。第37页,讲稿共67页,2023年5月2日,星期三Hashtable类方法实例

Hashtableht=newHashtable();ht.put("okok",newDouble(12.33));System.out.print(ht);}第38页,讲稿共67页,2023年5月2日,星期三properties类Properties

类表示了一个持久的属性集。Properties

可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。因为Properties

继承于Hashtable,所以可对Properties

对象应用put

和putAll

方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是String

的项。相反,应该使用setProperty

方法。如果在“不安全”的Properties

对象(即包含非String

的键或值)上调用store

或save

方法,则该调用将失败。类似地,如果在“不安全”的Properties

对象(即包含非String

的键)上调用propertyNames

或list

方法,则该调用将失败。第39页,讲稿共67页,2023年5月2日,星期三properties类

voidload(Reader

reader)

按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。

voidstore(OutputStream

out,String

comments)

以适合使用load(InputStream)

方法加载到Properties

表中的格式,将此Properties

表中的属性列表(键和元素对)写入输出流。第40页,讲稿共67页,2023年5月2日,星期三properties类方法演示Propertiessets=newProperties();

try{sets.store(newFileOutputStream("d:\\a.txt"),"ThisProgramisused:");

sets.put("saa",newInteger(3421));System.out.print(sets);

}catch(Exceptione){e.printStackTrace();}}第41页,讲稿共67页,2023年5月2日,星期三什么是异常?异常类通常用来定义程序所遇到的轻微异外。可以写代码来处理异常并继续程序执行,而不是让程序中断。例如:发生下列情况时,会出现异常:想打开的文件不存在网络连接中断受控操作数超出预定范围非常感兴趣地正在装载的类文件丢失第42页,讲稿共67页,2023年5月2日,星期三7.4异常关系图第43页,讲稿共67页,2023年5月2日,星期三异常机制有什么作用?在程序中发生错误时,发现错误的方法能抛出一个异常到其调用程序。然后,调用方法捕获该异常,以一定的方法处理异常并继续程序执行。这个方案给程序员一个写处理程序的选择,来处理异常。它为系统和用户之间提供了一种友好的交互方式。第44页,讲稿共67页,2023年5月2日,星期三异常分类第45页,讲稿共67页,2023年5月2日,星期三实例

//HelloWorld程序版本的简单扩展publicclassHelloWorld{

publicstaticvoidmain(Stringargs[]){

inti=0;

Stringgreetings[]={"Helloworld!",

"No,Imeanit!","HELLOWORLD!!"};

while(i<4){

System.out.println(greetings[i]);

i++;

}

}}第46页,讲稿共67页,2023年5月2日,星期三Error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。RuntimeException表示一种设计或实现问题,即如果程序运行正常,从不会发生的情况(比如刚才的数组越界)。

IOException表示输入输出过程中出现的异常分类说明第47页,讲稿共67页,2023年5月2日,星期三运行结果编译执行,输出结果如下:

Helloworld!

No,Imeanit!

HELLOWORLD!!

java.lang.ArrayIndexOutOfBoundsException:

atHelloWorld.main(HelloWorld.java:12)原因:当i=3是,按照循环中的规定,要输出的greetings[3]不存在,超出了数组的边界,因而产生异常。第48页,讲稿共67页,2023年5月2日,星期三异常处理Java编程语言提供了一个来考虑哪个异常被抛出以及如何来恢复它的机制。try和catch语句调用栈机制finally语句重访前例

第49页,讲稿共67页,2023年5月2日,星期三try和catch语句try{

//可能抛出异常的代码段;

}catch(MyExceptionTypee){

//处理一个特殊的异常;

}catch(Exceptione){

//处理一个普通的异常;

}将能够抛出异常的代码放入try块中,然后创建相应的catch块的列表。如果生成的异常与catch中提到的相匹配,catch条件的块语句就被执行。在try块之后,可能有许多catch块,每一个都处理不同的异常。一定要将特殊的异常写在前面。第50页,讲稿共67页,2023年5月2日,星期三调用栈机制

如果方法中的一个语句抛出一个没有在相应的try/catch块中处理的异常,那么这个异常就被抛出到调用方法中。如果异常也没有在调用方法中被处理,它就被抛出到该方法的调用程序。这个过程要一直延续到异常被处理。如果一直到main()中仍没有被处理,那么该异常就中断程序的执行。

第51页,讲稿共67页,2023年5月2日,星期三main()

上抛异常first()

上抛异常second()

总经理

(问题解决不了)部门经理

(问题解决不了)办事员一个事例对照第52页,讲稿共67页,2023年5月2日,星期三finally语句

try{

//可能出现异常的代码段;

}

finally{

//总是执行的代码段;

}

finally语句定义一个总是执行的代码块,而不考虑异常是否被捕获。即使try代码块和catch块中使用return语句退出当前方法或break跳出某个循环,finally

代码块都要执行。Finally中的代码块不能被执行的唯一情况是:在被保护代码块中执行了System.exit(0)第53页,讲稿共67页,2023年5月2日,星期三//对前面一个HelloWorld程序的补充,加入了异常处理部分publicclassHelloWorld2{

publicstaticvoidmain(Stringargs[]){

inti=0; Stringgreetings[]={"Helloworld!", "No,Imeanit!","HELLOWORLD!!"};

while(i<4){

try{ System.out.println(greetings[i]); }catch(ArrayIndexOutOfBoundsExceptione){ System.out.println("Re-settingIndexValue");

}finally{

System.out.println("Thisisalwaysprinted");} i++;}}改进前面的例子第54页,讲稿共67页,2023年5月2日,星期三

Helloworld!

Thisisalwaysprinted

No,Imeanit!

Thisisalwaysprinted

HELLOWORLD!!

Thisisalwaysprinted

Re-settingIndexValue

Thisisalwaysprinted

执行结果

第55页,讲稿共67页,2023年5月2日,星期三处理或声明规则

当一个方法出现问题时程序员可以采取以下两种措施:

通过将try{}和catch(){}块纳入其代码中,在这里捕获给被命名为属于某个超类的异常,并调用方法处理它。即使catch块是空的,这也算是处理情况。

让被调用的方法表示它将不处理异常,而且该异常将被抛回到它所遇到的调用方法中。它是通过throws关键字来声明的,其格式如下:publicvoidtroublesome()throwsIOException第56页,讲稿共67页,2023年5月2日,星期三Throws例子publicclassTestException{ publicstaticvoidmain(String[]args) { try { intreslut=newTest().devide(3,0); System.out.println("theresultis"+reslut); } catch(Exceptione) { System.out.println(e.getMessage()); } System.out.println("programisrunninghere,thatisnormal!"); }}classTest{ publicintdevide(intx,inty)throwsException { intresult=x/y; returnx/y; }}第57页,讲稿共67页,2023年5月2日,星期三创建自己的异常

用户定义异常是通过扩展Exception类来创建的。它包含一个构造函数、几个变量以及方法;使用语句来抛出已经创建的异常:

thrownewMyException();第58页,讲稿共67页,2023年5月2日,星期三class

IllegalValueException

extends

Exception{}classUserTrial{int

val1,val2;public

UserTrial(int

a,int

b){val1=a;val2=b;}void

show()

throws

IllegalValueException{if((val1<0)||(val2>0))

throw

new

IllegalValueException();

System.out.println("value1="+val1);System.out.println("value2="+val2);}}第59页,讲稿共67页,2023年5月2日,星期三public

class

ThrowExample{public

static

void

main(String[]args){UserTrialvalues=new

UserTrial(-1,1);try{values.show();}catch(IllegalValueException

e){//e.printStackTrace();System.out.println("非法值");}}}第60页,讲稿共67页,2023年5月2日,星期三实例

(定义一个叫MyException异常)publicclassMyExceptionextendsException{privateintnum;//当前错误号

publicstaticfinalintDATA_FORMATERR=100;//定义常量

publicMyException(intnum){this.num=num;}publicStringgetMessage(){Stringmsg=null;switch(num){caseDATA_FORMAT_ERR:msg="数据格式错误"; break; default:

温馨提示

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

评论

0/150

提交评论