ImageVerifierCode 换一换
格式:DOCX , 页数:54 ,大小:89.90KB ,
资源ID:10032140      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10032140.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(java 集合与泛型.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

java 集合与泛型.docx

1、java 集合与泛型 Collection接口及实现类Java语言的Collection接口及实现类是在java.util包中定义的,其中定义了多个接口和类,它们统称为Java集合框架(Java Collection Framework)。Java集合框架由两种类型构成,一个是Collection,另一个是Map。Collection对象用于存放一组对象,Map对象用于存放一组关键字/值的对象。Collection和Map是最基本的接口,它们又有子接口,这些接口的层次关系如图1所示。图1 Java集合框架的接口继承关系1.1 Collection接口及操作Collection接口是所有集合类型

2、的根接口,它有三个子接口:Set接口、List接口和Queue接口。Collection接口的定义如下:public interface Collection extends Iterable / 基本操作 int size(); boolean isEmpty(); boolean contains(Object element); boolean add(E element); boolean remove(Object element); Iterator iterator(); / 批量操作 boolean containsAll(Collection c); boolean addA

3、ll(Collection c); boolean removeAll(Collection c); boolean retainAll(Collection c); void clear(); / 数组操作 Object toArray(); T toArray(T a);说明 从JDK 1.5开始,Java开始支持范型(generics)的概念。在Collection接口的声明中,就表示该接口支持范型,它指的是集合中的对象类型。这样,当我们声明一个Collection实例时,应该使用这种方式指明包含在集合中的对象类型。这可以使编译器在编译时检查存入集合的对象类型是否正确,从而减少运行时错误

4、。Collection接口中定义的方法主要包括三类:集合操作、批量操作和数组操作。1. 基本操作实现基本操作的方法有size(),它返回集合中元素的个数;isEmpty()方法返回集合是否为空;contains()方法返回集合中是否包含指定的对象;add()方法和remove()方法实现向集合中添加元素和删除元素的功能;iterator()方法用来返回Iterator对象。通过基本操作可以检索集合中的元素。检索集合中的元素有两种方法:使用增强的for循环和使用Iterator迭代对象。(1)使用增强的for循环使用增强的for循环不但可以遍历数组的每个元素,还可以遍历集合的每个元素。下面的代码

5、打印集合的每个元素:for (Object o : collection) System.out.println(o);(2)使用迭代器迭代器是一个可以遍历集合中每个元素的对象。通过调用集合对象的iterator()方法可以得到Iterator对象,再调用Iterator对象的方法就可以遍历集合中的每个元素。Iterator接口的定义如下:public interface Iterator boolean hasNext(); E next(); void remove(); 该接口的hasNext()方法返回迭代器中是否还有对象;next()方法返回迭代器中下一个对象;remove()方法删

6、除迭代器中的对象,该方法同时从集合中删除对象。假设c为一个Collection对象,要访问c中的每个元素,可以按下列方法实现:Iterator it = c.iterator();while (it.hasNext() System.out.println(it.next();2. 批量操作实现批量操作的方法有containsAll(),它返回集合中是否包含指定集合中的所有元素;addAll()方法和removeAll()方法将指定集合中的元素添加到集合中和从集合中删除指定的集合元素;retainAll()方法删除集合中不属于指定集合中的元素;clear()方法删除集合中所有元素。3. 数组操

7、作toArray()方法可以实现集合与数组的转换。该方法可以实现将集合元素转换成数组元素。无参数的toArray()方法实现将集合转换成Object类型的数组。有参数的toArray()方法将集合转换成指定类型的对象数组。例如,假设c是一个Collection对象,下面的代码将c中的对象转换成一个新的Object数组,数组的长度与集合c中的元素个数相同。Object a = c.toArray();假设我们知道c中只包含String对象,可以使用下面代码将其转换成String数组,它的长度与c中元素个数相同:String a = c.toArray(new String0);1.2 Set接口

8、及实现类Set接口是Collection的子接口,Set接口对象类似于数学上的集合概念,其中不允许有重复的元素。Set接口没有定义新的方法,只包含从Collection接口继承的方法。Set接口有几个常用的实现类,它们的层次关系如图2所示:图2 Set接口及实现类的层次结构Set接口的常用的实现类有:HashSet类、TreeSet类和LinkedHashSet类。1. HashSet类与LinkedHashSet类HashSet类是抽象类AbstractSet的子类,它实现了Set接口,HashSet使用哈希方法存储元素,具有最好的性能,但元素没有顺序。HashSet类的构造方法有: Has

9、hSet() 创建一个空的哈希集合,装填因子(load factor)是0.75。 HashSet(Collection c) 用指定的集合c的元素创建一个哈希集合。 HashSet(int initialCapacity) 创建一个哈希集合,并指定的集合初始容量。 HashSet(int initialCapacity, float loadFactor) 创建一个哈希集合,并指定的集合初始容量和装填因子。LinkedHashSet类是HashSet类的子类。该实现与HashSet的不同之处是它对所有元素维护一个双向链表,该链表定义了元素的迭代顺序,这个顺序是元素插入集合的顺序。下面的程序从

10、命令行输入若干英文单词,输出每个重复的单词,不同单词的个数及消除重复单词后的列表。程序FindDups.javaimport java.util.*;public class FindDups public static void main(String args) Set hs = new HashSet(); for (String a : args) if (!hs.add(a) System.out.println(Duplicate: + a); System.out.println(hs.size()+ distinct words: +hs); _如果使用下面命令运行程序:C:j

11、ava FindDups i came i saw i left会得到下面结果:Duplicate: iDuplicate: i4 distinct words: i, left, saw, came由于上面程序中使用的实现类为HashSet,它并不保证集合中元素的顺序。注意 该程序对集合的声明中使用了泛型的方法,即加上了,如果去掉,该程序在JDK 5.0下也能成功编译,但会显示下面的提示:Note: D:javaFindDups.java uses unchecked or unsafe operations.Note: Recompile with -Xlint:unchecked for

12、 details.该提示说明程序中使用了未检查的或不安全的操作,如果要知道详细细节,可以带-Xlint:unchecked参数重新编译该程序。2. 用集合对象实现集合运算对于Set对象的批量操作方法,可以实现标准集合代数运算。假设s1和s2是Set对象,下面的操作可实现相关的集合运算。s1.containAll(s2):如果s2是s1的子集,该方法返回true;s1.addAll(s2):实现集合s1与s2的并运算;s1.retainAll(s2):实现集合s1与s2的交运算;s1.removeAll(s2):实现集合s1与s2的差运算。为了计算两个集合的并、交、差运算而又不破坏原来的集合,可

13、以通过下面代码实现:Set union = new HashSet(s1);union.addAll(s2);Set intersection = new HashSet(s1);intersection.retainAll(s2);Set difference = new HashSet(s1);difference.removeAll(s2);下面的程序实现了两个集合的并、交、差运算:程序SetDemo.javaimport java.util.*;public class SetDemo public static void main(String args) Set s1 = new

14、HashSet(); Set s2 = new HashSet(); s1.add(new String(one); s1.add(new String(two); s1.add(new String(three); s2.add(new String(two); s2.add(new String(three); s2.add(new String(four); Set union = new HashSet(s1); union.addAll(s2); Set intersection = new HashSet(s1); intersection.retainAll(s2); Set d

15、ifference = new HashSet(s1); difference.removeAll(s2); System.out.println(union); System.out.println(intersection); System.out.println(difference); _程序输出结果为: one,two,foue,three two,three one3. SortedSet接口与TreeSet类SortedSet接口对象是有序对象的集合,其中的元素排序规则按照元素的自然顺序排列。为了能够使元素排序,要求插入到SortedSet对象中的元素必须是相互可以比较的。关于对

16、象的顺序在下节讨论。SortedSet接口中定义了下面几个方法: E first() 返回有序集合中的第一个元素。 E last() 返回有序集合中最后一个元素。 SortedSet subSet(E fromElement, E toElement) 返回有序集合中的一个子有序集合,它的元素从fromElement开始到toElement结束(不包括最后元素)。 SortedSet headSet(E toElement) 返回有序集合中小于指定元素toElement的一个子有序集合。 SortedSet tailSet(E fromElement) 返回有序集合中大于等于fromEleme

17、nt元素的子有序集合。 Comparator comparator() 返回与该有序集合相关的比较器,如果集合使用自然顺序则返回null。TreeSet是SortedSet接口的实现类,它使用红黑树为存储元素排序,它基于元素的值对元素排序,它的操作要比HashSet慢。TreeSet类的构造方法有: TreeSet() 创建一个空的树集合。 TreeSet(Collection c) 用指定集合c中的元素创建一个新的树集合,集合中的元素是按照元素的自然顺序排序。 TreeSet(Comparator c) 创建一个空的树集合,元素的排序规则按给定的c的规则排序。 TreeSet(SortedS

18、et s) 用SortedSet对象s中的元素创建一个树集合,排序规则与s的排序规则相同。下面的程序创建一个TreeSet对象,其中添加了四个字符串对象。从输出结果中我们可以看到,这些字符串是按照字母的顺序排列的。程序 TreeSetTest.javaimport java.util.*;public class TreeSetTest public static void main(String args) Set ts = new TreeSet(); String s = new Stringone,two,three,four; for (int i=0;is.length;i+) t

19、s.add(si); System.out.println(ts); _程序输出结果为:four, one, three, two1.3 对象顺序在上一小节中我们看到,在创建TreeSet类对象时如果没有指定比较器(Comparator)对象,集合中的元素是按自然顺序排列的,如果指定了比较器对象,集合中的元素是根据比较器的规则排序。所谓自然顺序(natural ordering)指的是集合中对象的类实现了Comparable接口,并实现了其中的compareTo()方法,对象则根据该方法排序。如果希望集合中元素能够排序,必须使元素是可比较的,即要求元素所属的类必须实现Comparable接口。

20、如果试图对没有实现Comparable接口的集合元素排序,将抛出ClassCastException运行时异常。Java平台中有些类实现了Comparable接口,如基本数据类型包装类(Byte、Short、Integer、Long、Float、Double 、Character、Boolean),另外还有File类、String类、Date类、BigInteger类、BigDecimal类等也实现了Comparable接口,这些类的对象直接可按自然顺序排序。另一种排序方法是创建TreeSet对象时指定一个比较器对象,这样集合中的元素将按比较器的规则排序。下面分别叙述这两种方法:1. 实现Co

21、mparable接口如果要对我们自己定义的类进行排序,则应该在定义类的时候实现java.lang.Comparable接口,并实现其中的compareTo()方法,该接口的定义如下:public interface Comparable public int compareTo(T obj);该接口中只声明了一个compareTo()方法,该方法用来实现调用对象与参数对象比较,返回值是一个整数。当调用对象小于、等于、大于参数对象时,该方法分别返回负整数、0和正整数。下面的程序说明了如何通过实现Comparable接口对Student类的对象根据学号(id的值)进行排序。程序Student.ja

22、vaimport java.util.*;public class Student implements Comparable int id; String name; public Student(int id,String name) this.id = id; this.name = name; public int compareTo(Student s)if(this.ids.id)return 1;else return 0; public String toString() return +this.id+,+this.name+; public static void main

23、(String args) Student stud=new Student new Student(1002,Wang), new Student(1003,Zhang), new Student(1001,Zhou);Set ts = new TreeSet ();for(int i =0; i stud.length; i +)ts.add(studi); System.out.println(ts); _程序运行结果为:1001,Zhou, 1002,Wang,1003,ZhangStudent类实现了Comparable接口的compareTo()方法,它是根据学号(id的值)来比较

24、两个Student对象的大小。当将Student对象存放到TreeSet中时就是按照compareTo()方法对Student对象排序的。2. 比较器Comparator如果一个类没有实现Comparable接口或实现了Comparable接口,我们又想改变比较规则,可以定义一个实现java.util.Comparator接口的类,然后为集合提供一个新的比较器。Comparator接口定义了2个方法,它的声明如下:public interface Comparator int compare(T obj1, T obj2); boolean equals(Object obj);compare

25、()方法用来比较它的两个参数。当第一个参数小于、等于、大于第二个参数时,该方法分别返回负整数、0、正整数。equals()方法用来比较两个Comparator对象是否相等。字符串的默认比较规则是按字典顺序比较,假如按反顺序比较,我们可以通过下面的类来实现:程序DescSort.javaimport java.util.*;public class DescSort implements Comparator public int compare(String s1, String s2) if(pareTo(s2)0) return -1; else if(pareTo(s2)0) retur

26、n 1; else return 0; _下面的程序就可以实现字符串的降序排序:程序DescSortDemo.javaimport java.util.*;public class DescSortDemo public static void main(String args) String s=new String China, England,France,America,Russia,;Set ts = new TreeSet ();for(int i =0; i s.length; i +)ts.add(si); System.out.println(ts);Comparator c

27、omp = new DescSort();ts = new TreeSet (comp);for(int i =0; i s.length; i +)ts.add(si); System.out.println(ts); _输出结果为:America, China, England, French, RussiaRussia, French, England, China, America 输出的第一行是按字符串自然顺序的比较输出,第二行的输出使用了自定义的比较器,按与自然顺序相反的顺序输出。1.4 List接口及实现类List接口也是Collection接口的子接口,它实现一种顺序表的数据结构,有时也称为序列。存放在List中的所有元素都有一个下标(下标从0开始),可以通过下标访问List中的元素。List中可以包含重复元素。List接口及其实现类的层次结构如图.3所示:图.3 List接口及实现类的层次结构Java平台提供了两个List类的通用实现类,ArrayList类和LinkedList类。另外,Java早期版本的Vector类和Stack类被重新修改以适应新的集合框架。下面首先讨论List接口的操作,后面讨论这些实现类。List接口除了继承Collection的方法外,还定义了一些自己的方法。使用这些方法可以实现定位访问、查

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1