《2022年完整word版,Java集合框架实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年完整word版,Java集合框架实验报告 .pdf(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、浙江大学城市学院实验报告课程名称Java高级程序设计实验项目名称Java集合框架实验学生姓名专业班级学号一、实验目的1.理解 Java 集合框架的特点、接口与类之间的关系2.掌握 Java 集合框架的List 接口,以及 List 接口的重要实现类LinkedList 、ArrayList 3.掌握 Java 集合框架的Set、SortedSet 接口,以及重要实现类HashSet 与 TreeSet 4.掌握 Java 集合框架的Map、SortedMap 接口及其重要实现类HashMap、TreeMap 5.掌握 Java 集合框架的Collection 与 Iterator 接口的特点与
2、使用方式二、实验内容1、 使用 List 管理对象集合2、 使用 Map 管理对象集合3、 使用 Set 管理对象集合4、 设计一个自定义的集合类三、实验步骤1、 在 Eclipse 中新建工程(即项目)2、 使用 List 管理对象集合1)新建一个包listExample 2)在这个包中新建三个类:Student 类, StudentList 类, StudentListTest 类。参考代码:Student.java, StudentList.java ,StudentListTest.java 3)完善上面三个类,相关要求参考源代码程序的注释,即根据要求修改源代码程名师资料总结 - -
3、-精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 16 页 - - - - - - - - - 序,给出具体的实现代码(不使用泛型类)。void addStudent(Student student) / 添加一个学生对象booleana=true; for( inti =0; i students.size();i +) Student stud = (Student)students.get(i ); if( stud.getId().equalsIgnoreCase(student.get
4、Id() a=false; if( a=true) students.add(student); /修改代码 , 保证 students集合中所有学生对象的 id 号唯一 void deleteStudentById(String id ) / 根据学号删除学生对象for( inti =0; i students.size();i +) Student stud = (Student)students.get(i ); if( stud.getId().equalsIgnoreCase(id ) students.remove(stud); void deleteStudentByName(S
5、tring name ) /根据姓名删除学生对象for( inti =0; i students.size();i +) Student stud = (Student)students.get(i ); if( stud.getName().equalsIgnoreCase(name ) students.remove(stud); void deleteStudentByAge(intage ) / 根据年龄删除学生对象for( inti =0; i students.size();i +) Student stud = (Student)students.get(i ); if( stu
6、d.getAge()=age ) students.remove(stud); Student findByName(String name) inta=0; for( inti =0; i students.size();i +) Student stud = (Student)students.get(i ); if( stud.getName().equalsIgnoreCase(name ) a+; Student st =new Studenta; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
7、- - - - - 第 2 页,共 16 页 - - - - - - - - - intb=0; for( inti =0; i students.size();i +) Student stud = (Student)students.get(i ); if( stud.getName().equalsIgnoreCase(name ) st b= stud ; b+; returnst ; Student findByAge(intage ) inta=0; for( inti =0; i students.size();i +) Student stud = (Student)stude
8、nts.get(i ); if( stud.getAge()=age ) a+; Student st =new Studenta; intb=0; for( inti =0; i students.size();i +) Student stud = (Student)students.get(i ); if( stud.getAge()=age ) st b= stud; b+; returnst ; 4)新创建 listExample2 包,重新设计设计上述程序(新程序都属于这个包),这时需要使用泛型类,即出现的List、ArrayList 或 LinkedList 都使用泛型。priv
9、ate List students = new ArrayList(); void deleteStudentById(String id ) / 根据学号删除学生对象Iterator iterator = students.iterator(); while( iterator.hasNext() Student st =(Student)iterator.next(); if( st .getId()=id ) iterator.remove(); void deleteStudentByName(String name ) /根据姓名删除学生对象Iterator iterator = s
10、tudents.iterator(); while( iterator.hasNext() Student st =(Student)iterator.next(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 16 页 - - - - - - - - - if( st .getName()=name ) iterator.remove(); void deleteStudentByAge(intage ) / 根据年龄删除学生对象Iterator iterator
11、= students.iterator(); while( iterator.hasNext() Student st =(Student)iterator.next(); if( st .getAge()=age ) iterator.remove(); List findByName(String name ) List studs=new ArrayList(); for( inti =0; i students.size();i +) Student stud = (Student)students.get(i ); if( stud.getName().equals(name) st
12、uds.add(stud); returnstuds; List findByAge(intage ) List studs=new ArrayList(); for( inti =0; i students.size();i +) Student stud = (Student)students.get(i ); if( stud.getAge()=age ) studs.add(stud); returnstuds; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 1
13、6 页 - - - - - - - - - 3、 使用 Map 管理对象集合1)新建一个包MapExample 2)在这个包中新建三个类:Student 类, StudentMap 类, StudentMapTest 类。参考代码 Student.java, StudentMap.java,StudentMapTest.java 3)完善上面三个类,相关要求参考源代码程序的注释,即根据要求修改源代码程序,给出具体的实现代码(不使用泛型类)。void deleteStudentByName(String name ) /根据学生姓名删除学生对象Collection values=students
14、.values(); Iterator it=values.iterator(); while( it.hasNext() if( it.next().getName().equals(name ) it.remove(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 16 页 - - - - - - - - - void deleteStudentByAge(intage ) / 根据学生年龄删除学生对象Collection values=students.valu
15、es(); Iterator it=values.iterator(); while( it.hasNext() if( it.next().getAge()=age ) it.remove(); Student findByName(String name) inta=0; Collection values=students.values(); Iterator it=values.iterator(); while( it.hasNext() if( it.next().getName().equals(name ) a+; intb=0; Student s=new Studenta;
16、 Collection values1=students.values(); Iterator it1=values1.iterator(); while( it1.hasNext() Student ss =it1.next(); if( ss .getName().equals(name ) s b= ss ; b+; returns; Student findByAge(intage ) inta=0; Collection values=students.values(); Iterator it=values.iterator(); while( it.hasNext() if( i
17、t.next().getAge()=age ) a+; intb=0; Student s=new Studenta; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 16 页 - - - - - - - - - Collection values1=students.values(); Iterator it1=values1.iterator(); while( it1.hasNext() Student ss =it1.next(); if( ss .getAge(
18、)=age ) s b= ss ; b+; returns; 4)新创建 MapExample2 包,重新设计设计上述程序(新程序都属于这个包),这时需要使用泛型类,即出现的Map、TreeMap 或 HashMap 都使用泛型。privateMap students= newHashMap(); void addStudent(Student student) /添加一个学生对象students.put(new Integer(student.getId(),student); Student findById(String id ) returnstudents.get(new Integ
19、er(id ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 16 页 - - - - - - - - - 4、 使用 Set 管理对象集合1)新建一个包SetExample 2)在这个包中新建三个类:Student 类, StudentSet类, StudentSetTest类。参考代码: 这三个类的参考代码见Student.java, StudentSet.java,StudentSetTest.java 3)完善上面三个类,相关要求参考源代码程序的注释,即根据要
20、求修改源代码程序,给出具体的实现代码(不使用泛型类)。void deleteStudentById(String id ) / 根据学号删除学生对象for( inti =0; i students.size();i +) Student stud = (Student)students.toArray()i ; if( stud.getId().equalsIgnoreCase(id ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 16 页 - - - - - - -
21、 - - students.remove(stud); void deleteStudentByName(String name ) /根据姓名删除学生对象for( inti =0; i students.size();i +) Student stud = (Student)students.toArray()i ; if( stud.getName().equalsIgnoreCase(name ) students.remove(stud); void deleteStudentByAge(intage ) / 根据年龄删除学生对象for( inti =0; i students.siz
22、e();i +) Student stud = (Student)students.toArray()i ; if( stud.getAge()=age ) students.remove(stud); Student findByName(String name) inta=0; for( inti =0; i students.size();i +) Student stud = (Student)students.toArray()i ; if( stud.getName().equalsIgnoreCase(name ) a+; Student st =new Studenta; in
23、tb=0; for( inti =0; i students.size();i +) Student stud = (Student)students.toArray()i ; if( stud.getName().equalsIgnoreCase(name ) st b= stud ; b+; returnst ; Student findByAge(intage ) inta=0; for( inti =0; i students.size();i +) Student stud = (Student)students.toArray()i ; if( stud.getAge()=age
24、) a+; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 16 页 - - - - - - - - - Student st =new Studenta; intb=0; for( inti =0; i students.size();i +) Student stud = (Student)students.toArray()i ; if( stud.getAge()=age ) st b= stud; b+; returnst ; 4)新创建 SetExample2
25、 包,重新设计设计上述程序(新程序都属于这个包),这时需要使用泛型类,即出现的Set、TreeSet或 HashSet都使用泛型。注意: Student 类实现 Comparable 接口的作用。void deleteStudentById(String id ) /根据学号删除学生对象Iteratorit=students.iterator(); while( it.hasNext() if( it.next().getId().equalsIgnoreCase(id ) it.remove(); void deleteStudentByName(String name ) /根据姓名删除学
26、生对象Iteratorit=students.iterator(); while( it.hasNext() if( it.next().getName().equalsIgnoreCase(name) it.remove(); void deleteStudentByAge(intage ) / 根据年龄删除学生对象Iteratorit=students.iterator(); while( it.hasNext() if( it.next().getAge()=age ) it.remove(); publicclass Student implements Comparable /实现
27、Comparable接口对于TreeSet排序有用 publicint compareTo(Object arg0 ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 16 页 - - - - - - - - - Student stud = (Student)arg0 ; returnthis.getId().compareTo(stud .getId(); 实现是自定义排序功能名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
28、- - - - - - 名师精心整理 - - - - - - - 第 11 页,共 16 页 - - - - - - - - - 5、 设计一个自定义的集合类四. 实验结果与分析1. 请说明采用接口变量操作集合对象的方式,并阐述这么做的主要优点。提示:在“使用List 管理对象集合”的实验中,LinkedList 、ArrayList 两个类都可以管理一批对象,但是程序中使用List 接口变量引用LinkedList 、ArrayList 对象,即使用如下方式:private List students = new ArrayList(); 而不是直接使用LinkedList 、ArrayLi
29、st 类型变量,比如:private ArrayList students = new ArrayList(); 这样做有什么用意,有什么好处?这是一种很好的设计模式.一个接口有多种实现,这种写法是java 面向对象的一种思名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 16 页 - - - - - - - - - 想,依赖倒置原则,即依赖于抽象不依赖于实现(具体 )。给调用者提供的应该是接口或者抽象类,而实现者可以实现或者继承接口或者抽象类来满足调用者,这样调用者不必
30、知道实现者怎样操作,实现者也可以根据具体情况去实现,这样去除了耦合。这就是java 设计模式的基础思想之一。从 Java 语法上,这种方式是使用接口引用指向具体实现,这样大大提高了代码使用的灵活性。2.请说明 LinkedList 、ArrayList 有何不同,各自适用于哪些场合?LinkedList :采用链表来管理集合的元素。优点是可以方便地进行元素的增加,删除。即元素个数变化的代价较小,但是查询性能比数组差。ArrayList :使用可变长度的数组来管理集合的元素。优点是查询性能比链表好,缺点是长度不可变化,删除元素代价大。LinkedList 适用于元素增加删除频繁的场合。Array
31、List 适用于查询元素较频繁的场合名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 16 页 - - - - - - - - - 3.请说明 HashSet,TreeSet 有何不同,各自适用于哪些场合?1、TreeSet中的数据是自动排好序的,不允许放入null 值2、HashSet 中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束3、HashSet 要求放入的对象必须实现HashCode()方法,放入的对象,是以
32、hashcode码作为标识的, 而具有相同内容的String 对象, hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例4. 请说明 HashMap、TreeMap 有何不同,各自适用于哪些场合?HashMap 通过 hashcode对其内容进行快速查找,而TreeMap 中所有的元素都保持着某种固定的顺序, 如果你需要得到一个有序的结果你就应该使用TreeMap (HashMap 中元素的排列顺序是不固定的)。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - -
33、 - 第 14 页,共 16 页 - - - - - - - - - 5. Iterator 与 For 循环都可以用于遍历集合中的元素,请问有何不同之处。Iterator:通用,对于所有集合,使用Iterator 性能都一样 , 客户端自身不维护遍历集合的 指针 ,所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator 来维护,而这个Iterator 由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。客户端从不直接和集合类打交道,它总是控制Iterator,向它发送 向前 ,向后 ,取当前元素 的命令,就可以间接遍历整个集合。For 循环:虽然和 Iterator 性能
34、差不多,但是在查找链表如LinkedList 的时候遍历集合的开销会差别很大! 就以 LinkedList来说,用 get(i)方法来取元素的主要代码, 我们可以看到, LinkedList 内的 get(i)方法,用了循环方式来返回元素,性能肯定会差. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 16 页 - - - - - - - - - 6. 简单地分析比较不同集合类在选用上的主要原则。List 接口可以存储重复的数据。并且可以基于位置(下标)操作集合。当增删
35、改频繁的时候用LinkedList 。当查询频繁时用ArrayList Map 接口类似数学中的映射。对象的管理是一组键-值得映射关系。主要是适用于数量较多的对象管理。希望通过KEY 快速的查到对应的value。HashMap 是通过哈希表管理的,允许null TreeMap 该映射按照键自然排序。不允许为空Set接口不允许有重复的元素。HashSet 通过哈希算法管理允许 null TreeSet按照元素自然的排序五讨论、心得(可写遇到的问题及解决方法,或者对技术的理解等)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 16 页 - - - - - - - - -