《复习集合容器类》由会员分享,可在线阅读,更多相关《复习集合容器类(33页珍藏版)》请在金锄头文库上搜索。
1、复习复习-集合容器类集合容器类1 1复习要求v集合容器类概念vHashcode和equals方法v集合容器中主要接口SetListMapIteratorComparablev集合容器中主要类ArrayListLinkedListVectorStackHashMapHashTable集合容器v集合是一组聚集在一起且在内存中以特殊方式组织的对象,定义集合对象的类通常称为容器类v三种类型:Set集集里的对象不按任何特定的方式排列可以向集中r增加对象,但不能有重复的对象List序列序列中的对象以线性方式存储,不需要特殊的顺序但有头有尾,以任意固定顺序组织,如数组Map映射映射的每一项都含有一对对象,键
2、-值键决定了对象在映射中的存储位置。映射中的键必须各不相同。43756141212K3-v2K1-v1K2-v1K4-v3集列表映射集合重写hashCode和equals方法v涉及到equals()方法和hashCode()方法集中元素不能重复,需要比较两个对象是否相等TreeSet和TreeMap要进行比较两个对象,对于自己定义的类型,需要重写equals()和hashCode()方法以实现自定义的对象相等规则v相等的对象应该具有相等的hashCode值a.equals(b)是true,则是相等=a.hashcode()=b.hashcode()a.equals(b)是false,则是不相等
3、=a.hashcode()!=b.hashcode()v如果两个对象的hashCode相同,它们并不一定相同考试注意vhashCode和equals方法,toString方法都是公共的v下面的写法对这几个方法的重写是无效的classFoobooleanequals(Objecto)一定要写成classFoopublicbooleanequals(Objecto)集合v使用集合时有几种基本操作:将对象添加到集合从集合中删除对象查找一个对象或一组对象是否存在于集合内从集合中检索对象遍历集合,逐个查看每个元素集合容器中主要接口v核心接口Collection集合中最顶层的接口Set继承自Collect
4、ion不允许有重复的元素,用equals方法来区分重复与否List继承自Collection线性的Map没有继承自Collection接口keyvalueSortedSet继承Set接口Iterator迭代接口,可以实现遍历集合中的元素Comparable和Comparator比较接口Collection常用方法booleanadd(Objectobj)添加一个Object元素booleanaddAll(Collectionc)booleancontains(Objectobj)判断obj是否是调用类集的一个元素(属于)booleancontainsAll(Collectionc)判断c是否是
5、调用类集的子集(包含)booleanequals(Collectionc)判断c是否与调用类集相等inthashCode()返回调用类集的hash码Iteratoriterator()返回调用类集的迭代程序,用来遍历元素booleanremoveAll(Collectionc)从调用类集中去掉所有c中包含的元素(差集)booleanretainAll(Collectionc)从调用类集中去掉包含在c中以外的元素(补集)ObjecttoArray()返回类集的元素组成的数组voidclear()booleanisEmpty()intsize()考试注意v对add(Objectobj)方法,可以添
6、加任意Object对象到集合中,但不能直接添加:int,char,double等数据。v可以使用下面的方法实现:ArrayLista=newArrayList();a.add(newInteger(1);a.add(newInteger(2);考试注意v区分Collection和CollectionsCollections是一个类,有很多有用的静态方法。而Collection是一个接口。其他常用接口vSet没有定义新的方法,元素不重复vList新增方法voidadd(intindex,Objectobj)插入点以后的元素将后移booleanaddAll(intindex,Collectionc
7、)如果调用列表改变了,返回true,否则返回falseObjectget(intindex)intindexOf(Objectobj)返回obj对象在列表中的索引,不存在返回-1intlastIndexOf(Objectobj)返回obj在列表中的最后一个实例的下标,不存在返回-1ListIteratorlistIterator()ListIteratorlistIterator(intindex)返回index开始的迭代程序Objectset(intindex,Objectobj)对列表index处的值进行修改ListsubList(intstart,intend)从start到end-1v
8、Map不能有相同key,一个key只能映射到一个值用于插入和删除元素的变换方法remove(Objectkey)从Map中删除键和关联的值put(Objectkey,Objectvalue)将指定值与指定键相关联clear()从Map中删除所有映射putAll(Mapt)将指定Map中的所有映射复制到此map其他常用接口vSortedSet一类有序的Set集合,实现Comparator接口常用方法Comparatorcomparator()返回调用排序集合的比较函数,如果改集合使用自然顺序,则返回nullObjectfirst()返回被排序集合的第一个元素SortedSetheadSet(Ob
9、jectend)返回一个包含小于end元素的SortedSetObjectlast()返回调用排序集合的最后一个元素SortedSetsubSet(Objectstart,Objectend)包括从start到end-1SortedSettailSet(Objectstart)返回包含大于等于start的元素Iterator接口v迭代接口,可以实现遍历集合中的元素。v常用方法booleanhasNext()判断是否有元素Objectnext()如果没有下一个元素则引发NoSuchElementException异常。voidremove()删除当前元素,如果试图在调用next()方法后调用re
10、move()方法则引发IllegalStateException异常。迭代器(iterator)的使用vIteratorit=test.iterator();/test是一个集合的对象while(it.hasnext()it.next();/取一个元素,Comparable和Comparator接口v比较接口vComparable通用的接口,用户可以实现它来完成自己特定的比较比较固定,和一个具体类相绑定.vComparator可以看成一种算法的实现,在需要容器集合实现比较功能的时候,实现该接口;比较灵活,它可以被用于各个需要比较功能的类使用。Comparable接口v所有可以“排序”的类都实现
11、了Comparable接口,Comparable接口中只有一个方法:publicintcompareTo(Objectobj)若this=obj,则返回0若thisobj,则返回正整数若thisobj,则返回负整数v实现了Comparable接口的类通过实现compareTo()方法来确定该类对象的排序方式v如果是基本类型的话,可以用封装器类来解决,如int对应Integerfloat对应Floatv一般要求:e1.equals(Object)e2)和pareTo(Object)e2)=0具有相同的值集中主要类uHashSet类u按照哈希算法来存取对象,存取速度比较快.u用对象的equals(
12、)方法来区分不同的对象,避免重复u有一个子类LinkedHashSet类,不仅实现了哈希算法,而且实现了链表数据结构(提高插入和删除的效率)存放的元素相应的类必须要重新定义hashCode()和equals()方法保证当两个对象用equals()方法比较的结果为true时,这两个对象的hashcode()方法的返回值相等。uTreeSet类u实现了SortedSet接口,具有排序功能uTreeSet作为有序集,存放的元素相应的类必须自定义排列顺序要实现比较接口Comparable或者Comparator接口u保证这个类的compareTo()和equals()方法采用相同的比较规则来比较两个对
13、象是否相等考试注意v当使用HashSet或者LinkedHashSet时,添加到他们的对象必须重写hashcode和equals方法v当使用TreeSet时,添加到他们的对象必须重写实现比较接口,同时重写compareTo、hashcode和equals三个方法。列表中主要类vArrayList代表大小可变的数组,允许对元素进行快速的随机访问,但是插入和删除慢。vVector与ArrayList比较相似,但Vecotr类的实现采用了同步机制,通常使用ArrayList,因为使用了同步性能损失vLinkedList基于链表的数据结构,便于插入和删除有方法addFirst(),addLast(),
14、getFirst(),getLast(),removeFirst(),removeLast()可以使它作为栈、队列和双向队列来使用vStack后进先出的堆栈List常用算法v类java.util.Collections提供了一些静态方法实现了基于List集合的一些常用算法voidsort(Listl)/对List中的元素排序voidshuffle(Listl)/对List中的元素进行随机排列voidreverse(Listl)/对List中的元素进行逆序排列voidfill(Listl,Objecto)/用一个特定对象重写整个Listvoidcopy(Listdest,Listsrc)/将源内
15、容拷贝到目的intbinarySearch(Listl,Objecto)/对顺序的List采用折半查找的方法查找特定对象List示例Listlist=newArrayList();/声明一个列表list.add(newInteger(3);/加入列表list.add(newInteger(4);list.add(newInteger(3);list.add(newInteger(2);for(inti=0;ilist.size();i+)System.out.println(list.get(i)+”);/get方法返回集合中的对象3432List的iterator()方法和Set的itera
16、tor()方法一样,能返回Iterator对象,可以用Iterator来遍历集合对象。Iteratorit=list.iterator();while(it.hasNext()System.out.println(it.next();为列表排序Collections.sort(list);for(inti=0;ilist.size();i+)System.out.println(list.get(i)+”);ArrayListvArrayList是List接口的一个可变长数组实现。vArrays长度是不可改变的Arraylist长度是可改变的。v常用方法add增加一个元素add(intinde
17、x,Eelement)指定位置处添加元素remove删除一个对象toArray()将集合变为对象数组v例子Strings=P,C,M;List list = Arrays.asList( s ); System.out.println(list); Collections.sort(list); System.out.println(list);LinkedListimportjava.util.LinkedList;importjava.util.ListIterator;publicclassLinkedList之有关操作publicstaticvoidmain(Stringargs)Li
18、nkedListl=newLinkedList();l.add(abc);l.add(efg);l.add(gogo);l.add(error);l.remove(3);/移除第四个元素System.out.println(l.get(0);/索引从0开始,得到第一个元素System.out.println(l.get(1);/得到第二个元素System.out.println(l.get(2);/System.out.println(l.get(3);表示的是一个链表的操作类表示的是一个链表的操作类 常用的方法常用的方法 addadd为链表增加数据为链表增加数据 element()eleme
19、nt()找到链表头找到链表头 poll()poll()以先进先出的方式取出全部的数据以先进先出的方式取出全部的数据 getFirst();getLast();removeFirst();removeLast();addFirst();addLast();向量类Vectorv向量(Vector)类以实现类似动态数组的功能vVector是Java语言为解决数组长度和元素类型不能改变而引入的工具类,用来表示列表数据结构。其元素可以是任何类型的对象(不能是简单数据类型,如果要存放,可以用数据类型类)v向量类提供了三种构造方法:publicvector()publicvector(intinitialc
20、apacity,intcapacityIncrement)publicvector(intinitialcapacity)Vector类适合于如下的情况:n需要处理的对象数目不定n序列中元素都是对象,而不是基本数据类型的量n需要做频繁的元素插入和删除n需要定位序列中的对象或其他查找操作Stackv继承自Vectorv增加5个方法实现堆栈功能push入栈Pop出栈peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。vStack刚创建后是空栈考试注意v列表中往往会考ArrayList,Vector和LinkedList尤其是LinkedList因
21、为提供了很多方法可以模拟双向列表、队列和栈等一些特殊的线性表v排序Collections.sort(任何列表对象)Comparable接口comparaeTo(Objecto)方法负数如果thisObjectanotherObject经常通过String、数据包装类、Date、Calendar.。Comparator排序compare(Objectthis,Objectother)同上用Arrays类排序Arrays.sorts()考试注意v查询数组和集合Collections类binarySearch()方法成功返回下标查询之前必须进行排序实现Comparable或者Comparator接口
22、但是如果是放在数组中的基本数据类型就不能实现自然排序接口v在Arrays和List中进行转换List和Set有toArray()方法返回的是一个新的Object数组Arrays中有一个方法是asList()方法v使用遍历器Iteratornext和hasNext方法映射中主要类vHashMap按照哈希算法来存取键对象,有很好的存取能力如果集合中对象所属的类重新定义了equals()方法,那么这个类也必须重新定义hashCode(),并且保证当两个对象用equals()方法比较的结果为true时,这两个键对象的hashcode()方法的返回值相等。vHashtable无序存放的,是旧的操作类,k
23、ey不允许重复vTreeMap实现了SortedMap接口,能对键对象进行排序,和TreeSet一样,TreeMap也支持自然排序和客户化排序两种方式如果对集合中的键对象进行自然排序,则要求对象所属的类实现Comparable接口,并且保证这个类的compareTo()和equals()方法采用相同的比较规则来比较两个键对象是否相等。HashMapv向集合中增加和取出内容put(Objectkey,Objectvalue)增加内容get(Ekey)根据key找出其对应的valuev判断指定的key或value是否存在containsKey(Objectkey)判断Map集合是否存在指定的key
24、containsValue(Objectvalue)判断Map集合是否存在指定的valueHashTablev哈希表是重要的存储方式,也是一种常见的检索方法v常用方法put(Objectkey,Objectvalue)插入检索publicsynchronizedObjectget(Objectkey)根据给定关键字key获取相对应的对象publicsynchronizedbooleancontainsKey(Objectkey)判断哈希表中是否包含关键字keypublicsynchronizedbooleancontains(Objectvalue)判断value是否是哈希表中的一个元素。remove删除枚举集合publicsynchronizedEnumerationkeys()返回关键字对应的枚举对象publicsynchronizedEnumerationelements()返回元素对应的枚举对象TreeMapv实现Map接口,把元素存储在树中vTreeMap操作比HashMap开销大,但树结构,返回排序的关键字v不要按照关键字顺序提取Map的元素,HashMap更实用v使用电话薄或者字典是使用TreeMap的理想候选考试注意v当使用任何一种Map时,放入改容器中的任何类都必须重写hashcode和equals方法