实验6 泛型与集合框架_附答案
- 格式:doc
- 大小:59.50 KB
- 文档页数:5
集合框架1,集合概述为了保存数量不确定的数据,以及保存具有映射关系的数据,Java提供了集合类,集合类主要保存、盛装其它数据(集合里只能保存对象,实际上保存的是对象的引用变量),因此集合类也被称为容器类。
Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类,所有的集合类都位于java.util包下。
下图是部分集合框架的梗概:2,CollectionCollection接口是List、Set和Queue接口的父接口,该接口里定义了List、Set和Queue 的共性方法,必须要掌握。
2.1,boolean add(Object o):用于向集合中添加元素,如果集合对象被添加操作改变了,则返回true。
2.2,boolean addAll(Collection c):将集合c里的所有元素添加到指定的集合里,如果集合被添加操作改变了,返回true。
2.3,void clear():清除集合里的所有元素。
2.4,bolean contains(Object o):返回集合里是否包含指定元素。
2.5,boolean containsAll(Collection c):返回集合里是否含集合c里的所有元素。
2.6,boolean isEmpty():返回集合是否为空。
当集合长度为0时,返回true;否则返回false。
2.7,Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素。
2.8,boolean remove(Object o):删除集合中指定元素o,当集合中包含了一个或多个元素o 时,全部删除,返回true。
2.9,boolean removeAll(Collection c):从该集合中删除集合c里包含的元素,删除一个或一个以上元素,返回true。
2.10,boolean retainAll(Collection c):从该集合中删除集合c里不包含的元素,取交集,操作改变了该集合,返回true。
java 集合框架(习题)集合框架Key Point* Collection接口、Set 接口、List 接口基本操作* List 接口及其实现类* Set 接口及其实现类* 迭代遍历* Hash 算法与hashCode方法* Comparable接口* Map 接口及其实现类* 遍历Map* 泛型练习1. 填空Collection接口的特点是元素是对象;List 接口的特点是元素有(有|无)顺序,可以(可以|不可以)重复;Set 接口的特点是元素无(有|无)顺序,不可以(可以|不可以)重复;Map 接口的特点是元素是键值对,其中值可以重复,键不可以重复。
2. (List)有如下代码import java.util.*;public classTestLi st{public static void main(String args[]){List list = new ArrayL ist();list.add(“Hello”);list.add(“World”);list.add(1, “Learn”);list.add(1,“Java”);printL ist(list);}public static void printL ist(List list){for(Object obj:list){String str=(String)obj;System.out.printl n(obj);}}}要求:1) 把//1 处的代码补充完整,要求输出li s t 中所有元素的内容2) 写出程序执行的结果Helloj ava LearnW orld3) 如果要把实现类由ArrayLis t换为Link edLis t,应该改哪里?A rrayLi st 和Linked List使用上有什么区别?实现上有什么区别?把实例化的语句改为ne w LinkedLi st();ArrayLi st 数组实现查询快增删慢Linked List链表实现查询慢增删快4) 如果要把实现类由ArrayLis t换为V ect or,应该改哪里?A rrayLi st 和V ecto r 使用上有什么区别?实现上有什么区别?ArrayLi st是线程不同步的,轻量级的,线程不安全,速度快V ector是线程同步的,多线程访问比较安全,速度慢3. (List)写出下面程序的运行结果import java.util.*;public classTestLi st{public static void main(String args[]){List list = new ArrayL ist();list.add(“Hello”);list.add(“World”);list.add(“Hello”);list.add(“Learn”);list.remove(“Hello”);list.remove(0);for(int i = 0; i<list.size(); i++){System.out.printl n(list.get(i));}}}HelloLearn4. (Set,List)import java.util.*;public classTestLi stSet{public static void main(String args[]){List list = new ArrayL ist();list.add(“Hello”);list.add(“Learn”);list.add(“Hello”);list.add(“Welcom e”);Set set = new HashSe t();set.addAll(list);System.out.printl n(set.size());}}选择正确答案A.编译不通过B.编译通过,运行时异常C.编译运行都正常,//输出Hash Set中不能放重复值D.编译运行都正常,输出45. (List)已知有一个W o rker类如下:public classWorker {privat e int age;privat e String name;privat e double salary;public Worker (){}public Worker (String name, int age, double salary){ = name;this.age = age;this.salary = salary;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getNam e() {return name;}public void setNam e(String name) { = name;}public double getSal ary(){return salary;}public void setSal ary(double salary){this.salary = salary;}public void work(){System.out.printl n(name+“work”);}}完成下面的要求1) 创建一个Li s t,在List中增加三个工人,基本信息如下:姓名年龄工资zhang3 18 3000li4 25 3500wang522 32002) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资33003) 删除wang5 的信息4) 利用for循环遍历,打印List中所有工人的信息5) 利用迭代遍历,对List中所有的工人调用work 方法。
6泛型与集合6.1单项选择题1.可实现有序对象的操作就是?( )A.HashMapB.HashSetC.TreeMapD.Stack2.不就是迭代器接口(Iterator)所定义的方法就是( )。
A.hasNext()B.next()C.remove()D.nextElement()3.下面说法不正确的就是( )A.列表(List)、集合(Set)与映射(Map)都就是java、util包中的接口。
B.List接口就是可以包含重复元素的有序集合。
C.Set接口就是不包含重复元素的集合。
D.Map接口将键映射到值,键可以重复,但每个键最多只能映射一个值。
4.下面那些方法不就是接口Collection中已声明的方法( )A.添加元素的add(Object obj) 方法B.删除元素的remove(Object obj)方法C.得到元素个数的length()方法D.返回迭代器的iterator()方法,迭代器用于元素遍历5、下列关于容器的描述中,错误的就是( )A.容器就是由若干个组建与容器组成的B.容器就是对图形界面中界面元素的一种管理C.容器就是一种对指定宽与高的矩形范围D.容器都就是可以独立的窗口6、下列界面元素中,不就是容器的就是( )A、ListB、JFrameC、JDialogD、Panel7、应用程序的main方法中有以下语句,则输出的结果就是( )。
Hashtable hashtable=new Hashtable();hashtable、put("100","aaa");hashtable、put("200","bbb");hashtable、put("300","ccc");System、out、println(hashtable、get("300")、toString()+ hashtable、get("200")、toString()+ hashtable、get("100")、toString());A) aaa B) bbb C) ccc D) cccbbbaaa6.2判断题1.Map接口就是自Collection接口继承而来。
题目:深度探讨Java的泛型与集合编程题一、引言Java作为一种广泛使用的编程语言,其泛型与集合是非常重要的特性。
在编写Java程序时,对泛型与集合的理解和应用至关重要。
本文将深入探讨Java的泛型与集合编程题,帮助读者更深入地理解这一主题。
二、泛型的基本概念和用法1. 什么是泛型?泛型是Java语言中一种重要的特性,它允许我们在编写代码时使用参数化类型,从而提高代码的重用性和安全性。
通过泛型,我们可以在编译时检查类型安全,避免在运行时出现类型转换错误。
2. 泛型的基本用法在Java中,我们可以使用泛型来定义类、接口和方法。
定义一个泛型类可以使用以下语法:```javapublic class Box<T> {private T value;public void setValue(T value) {this.value = value;}public T getValue() {return value;}}```在上面的代码中,Box<T>就是一个泛型类,其中的T表示类型参数。
通过使用泛型,我们可以创建具有不同数据类型的Box对象,从而实现通用性和灵活性。
三、集合框架的基本概念和用法1. 什么是集合框架?集合框架是Java中用来存储和操作数据的一组接口和类。
它提供了一系列的数据结构(如List、Set、Map等)和算法。
在Java中,集合框架是非常常用的,我们几乎可以在所有的Java程序中看到它的身影。
2. 集合框架的基本用法我们可以使用集合框架来存储和操作数据。
可以使用List接口来存储一组有序的数据,使用Set接口来存储一组不重复的数据,使用Map接口来存储键值对等。
通过对集合框架的灵活运用,我们能够更加高效地处理数据。
四、深入理解泛型与集合的编程题1. 编程题1:使用泛型实现一个通用的栈要求:实现一个通用的栈类,能够存储任意类型的数据,并实现入栈、出栈等操作。
浙江大学城市学院实验报告课程名称面向对象程序设计实验项目名称集合框架与泛型学生姓名专业班级学号一. 实验目的和要求1. 了解Java集合框架的接口和实现类2. 理解泛型类、泛型接口、泛型方法的特点3. 掌握List<E>接口及其实现类LinkedList<E>、ArrayList<E>4. 了解Set<E>接口及其实现类HashSet<E>、TreeSet<E>5. 了解Map<K,V>及其实现类HashMap<K,V>、TreeMap<K,V>二. 实验内容1. 分析Java集合框架的接口和实现类的组成2. 分析泛型类、泛型接口、泛型方法的特点3. 编程实现:设计学生管理类StudentManager(用List集合管理学生对象)4. 选作-编程实现:设计学生管理类StudentManager(用Set集合管理学生对象)5. 选作-编程实现:设计学生管理类StudentManager(用Map管理学生对象)三. 实验结果与分析(可将程序运行结果截屏,也可分析运行结果)1. 分析Java集合框架的接口和实现类的组成请查阅书籍和Java帮助文档,说明Java集合框架的接口组成以及它们的继承关系,并针对每个接口给出具体的实现类。
答:2. 分析泛型类、泛型接口、泛型方法的特点请查阅书籍和Java帮助文档,举例说明泛型类、泛型接口、泛型方法的特点。
答:3. 编程实现:设计学生管理类StudentManager(用List集合管理学生对象)。
StudentManager类的功能包括添加学生、查询学生、删除学生、统计学生成绩等。
需要设计表示学生对象的Student类,并用LinkedList或ArrayList集合来管理可被数量的学生对象。
另外还需要设计测试类Test来验证StudentManager的功能。
集合框架之泛型详解泛型(Generics)什么是泛型?泛型是在jdk1.5以后出现的新特性,用于解决安全问题,是一个类型安全机制。
泛型格式:通过<>来定义要操作的引用数据类型。
例如以下的例子:import java.util.*;class GenericsDemo{public static void main(String[] args){ArrayList<String> list=new ArrayList<String>();list.add("zhangsan");list.add("lisi");list.add("huangsan");//list.add(new Integer(3));//会出编译时错误for(Iterator<String> it=list.iterator();it.hasNext();){String s=it.next();System.out.println(s);}}}我们可以看到使用泛型有很多好处。
a)将运行时期出现问题ClassCastException,转移到了编译时期。
方便程序员解决问题。
让运行时期问题减少,安全。
b)避免了强制转换的麻烦。
什么时候使用泛型呢?是在使用java提供的API的一些对象时,只要见到<>就要定义泛型,通常在集合框架中很常见。
<>就是用来接受类型的,当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
自定义泛型自定义泛型类自定义泛型有什么好处呢?自定义泛型最大的好处就是扩展性好。
我们看看如下的例子:class GenericsTool<T>{private T t;public T getObject(){return t;}public void setObject(T t){this.t=t;}}class CustomGenericsDemo{public static void main(String[] args){/*Objcet*/ObjectTool ot=new ObjectTool();ot.setObject(new Student());Student stu=(Student)ot.getObject();/*Generics,T也可以是Student*/GenericsTool<Person> gt=new GenericsTool<Person>();gt.setObject(new Person());Person p=gt.getObject();//不需要强制转换}}我们可以看出自定义泛型的可扩展性高。
实验报告_实验7 泛型与集合(学生学号_姓名)一、实验目的1.理解泛型的概念及泛型的简单使用2.掌握集合接口及其实现类的概念;Set接口:HashSet、TreeSet、List接口:ArrayList、LinkedList、VectorMap接口:HashMap、TreeMap、Hashtable3.掌握集合元素的遍历方法;4.熟悉Java中的装箱、拆箱操作。
二、实验步骤3、(基础题)填充VectorTest.java程序所缺代码,编译并运行程序;程序所缺代码:Vector vec = new _____①___Vector__();vec. ②add(number);for(int i = 0; i < vec.____③size()_____; i++){System.out.println(vec.____④_get___(i));4、(基础题)阅读并运行下面代码,比较Set接口、List接口、Map接口的异同点,并回答问题,:问题:如何为程序中的集合指定类型?Set<String> hs = new HashSet<>();ArrayList<String> al = new ArrayList< String> ();Map<Integer,String> hm = new HashMap<Integer,String> ();5、(基础题)下面程序所实现的功能是:Hashtable,LinkedList写入或读取时间的比较:程序所缺代码:import _____①__java.util.*____;for(int i = 0; i < 100000; i++) {table. put②(""+i, new Integer(i));}for(int i = 0; i < 100000; i++){table. ___get_③_____ (""+i);}for(int i = 0; i < 100000; i++){list. ___add_④____ (new Integer(i));}callTime = ____System.currentTimeMillis();___⑤_______for(int i = 0; i < 100000; i++){list.____get_⑥______(i);}问题:在读取数据时, Hashtable与LinkedList相比,哪个效率更高?Hashtable6、(基础题)本程序的功能是:获取系统的系统属性值并输出,请参考课件,填充所缺少代码,并运行程序:程序所缺代码:Properties systemProperties = System. _____①getProperties ______ (); Enumeration enum1 = systemProperties. ②propertyNames(); while(enum1. ____③__ hasMoreElements ___ ()){String key = (String)enum1.nextElement();String pro = systemProperties. ____④_ getProperty ___ (key);System.out.println(key + "=" + pro);}}}。
Java语言程序设计C实验报告集合框架及泛型机制学生姓名专业、班级________________________________________ 指导教师 _______________________________________ 成绩_______________________________计算机与信息工程学院年月日一、实验目的学习课程相关章节知识,通过上机练习,掌握以下知识:1.掌握List 接口下ArrayList 及LinkedList 的使用方法。
2.掌握Map 接口下HashMap 及HashTable 的使用方法3.掌握集合中泛型的使用二、实验内容利用集合完成象数据库那样存储数据,并且可以简单查询,利用map 存储学生信息,字段如下:id ,name,age ,实现步骤:(1)创建类,类图如下:2)在main 方法编写逻辑代码3)运行程序并测试结果package ;public class Student {private String name ;private int age ;private String id ;public String getName() {return namepublic void setName(String name ) {this .name = name ;}public int getAge() {return age ;}public void setAge( int age ) {this .age = age ;}public String getId() {return id ;}public void setId(String id) {this .id = id;}public Student(String name , int age , String id ) { super ();this .name = name ;this .age = age ;this .id = id;}public void sayHi(){System. out .println( "name=" + this .getName()+ "age=" + this .getAge()+ " "+ "id=" + this .getId());}//Databace 类package ;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;public class Databace {private Student a;public Databace() {super ();map = new HashMap<String,Student>();}public Student getA() {return a;}public void setA(Student a) {this .a = a;}HashMap<String,Student> map ;public void delete(){ID" );System. out .println( " 请输入要删除表中元素String id =Test. sc.next();if (map .containsKey( id)){map .remove( id);Collection<Student> c= map .values();IteratorvStude nt> it= c.iterator();while (it .hasNext()){a= it .n ext();a.sayHi();}}else{System. out .println("表中没有该元素");}}public void in sert(){System. out .println("按顺序输入id、age、name");String name =Test. sc.next();int age =Test. sc.n ext In t();String id =Test. sc.next();a= new Student( name ,age ,id );map .put( id , a);System. out .println("成功的插入一条记录”);public void update(){System. out .println("请输入要修改表中元素ID");String id =Test. sc.next();if (map .containsKey( id)){map .remove( id);System. out .println("按顺序输入name,age,id");id =Test. sc.next();String name =Test. sc.next();int age =Test. sc.nextInt();a= new Student( id ,age ,name );map .put( id , a);}else{System. out .println("表中没有该元素");}}public void select()System. out .println("请输入要查询的方式 1.查询单行 2.查询全部"); int i=Test. sc.nextInt();switch (i){case 1:{System. out .println("请输入要查询表中元素ID");String id =Test. sc.next();{a= map .get( id);a.sayHi();}else{System. out .println("表中没有该元素");}}break ;case 2:{Collection<Student> c=map .values();Iterator<Student> it= c.iterator();while (it .hasNext()){a= it .next();a.sayHi();}}break ;}}}//testpackage ;import java.util.*;public class Test {/*** @param args */public static Scanner sc= new Scanner(System. public static void main(String[] args ){// TODO Auto-generated method stuint i=0;Databace d = new Databace();while (i==0){int j=Test. sc.nextInt(); switch (j){case 1:d .insert(); breakcase 2: d .select(); breakcase 3: in);System. out .println( System. out .println( System. out .println( System. out .println( System. out .println( "1.储存学生信息") "2.查询学生信息") "3.修改学生信息") "4.删除学生信息") "退出");d .update(); breakcase 4:d .delete(); break default :i=1;}}}}提示:用id 做map 集合的键部分,用student 对象做map 集合的值部分效果显示:三、实验思想四、实验结果五、实验心得。
package entity;//学生类,属性为:姓名、性别、分数、年龄、班级public class Student {private String name;private String gender;private int score;private int age;private String classes;public Student(String name,String gender, int score,Stringclasses) { = name;this.gender = gender;this.score = score;this.classes = classes;}public Student(String name, String gender, int age, int score){ = name;this.gender = gender;this.age = age;this.score = score;}public Student(String name, int score) { = name;this.score = score;}public Student(String name) { = name;}protected String getName() {return name;}protected void setName(String name) { = name;}protected int getAge() {return age;}protected void setAge(int age) {this.age = age;}protected String getGender() {return gender;}protected void setGender(String gender) { this.gender = gender;}protected int getScore() {return score;}protected void setScore(int score) { this.score = score;}protected String getClasses() {return classes;}protected void setClasses(String classes) { this.classes = classes;}}第二题答案源码及运行效果截图:package entity;import java.util.HashMap;import java.util.Scanner;public class Homework2 {public static void main(String[] args) { HashMap<String,Student> students=new HashMap<String,Student>();Scanner input=new Scanner(System.in);Student stu1=new Student("杨过", 95);Student stu2=new Student("小龙女", 99);Student stu3=new Student("张无忌", 88);Student stu4=new Student("赵敏", 90);students.put("杨过", stu1);students.put("小龙女", stu2);students.put("张无忌", stu3);students.put("赵敏", stu4);System.out.println("请输入学生姓名:");String key=input.next();if(students.containsKey(key)){Student stu= students.get(key);System.out.println(stu.getName()+"的成绩是:"+stu.getScore());}System.out.println("----------所有学生的成绩是-----------");for(Object value:students.values()){Student stu=(Student) value;System.out.println(stu.getName()+"的成绩是:"+stu.getScore());}}}第三题答案源码及运行效果截图:package entity;import java.util.*;public class Homework3 {public static void main(String[] args) {List<Student> list1=new ArrayList<Student>();List<Student> list2=new ArrayList<Student>();List<Student> list3=new ArrayList<Student>();Student stu1=new Student("张三");Student stu2=new Student("李四");Student stu3=new Student("王五");Student stu4=new Student("成龙");Student stu5=new Student("李娜");Student stu6=new Student("张杰");Student stu7=new Student("刘德华");Student stu8=new Student("张学友");Student stu9=new Student("刘亦菲");list1.add(stu1);list1.add(stu2);list1.add(stu3);list2.add(stu4);list2.add(stu5);list2.add(stu6);list3.add(stu7);list3.add(stu8);list3.add(stu9);Map<String,List<Student>> map=new HashMap<String,List<Student>>();map.put("三年级一班", list1);map.put("三年级二班", list2);map.put("三年级三班", list3);System.out.println("输入班级名称:");Scanner input=new Scanner(System.in);String banji=input.next();System.out.println(banji+"学生列表:");List<Student> list=map.get(banji);for(Student stu:list){System.out.println(stu.getName());}}}第四题答案源码及运行效果截图:package entity;import java.util.*;import java.util.Scanner;public class Homework4 {public static void main(String[] args) {ArrayList<Student> list1=newArrayList<Student>();ArrayList<Student> list2=newArrayList<Student>();ArrayList<Student> list3=newArrayList<Student>();Student stu1=new Student("张三","男",20,85);Student stu2=new Student("李四","男",22,80);Student stu3=new Student("王五","男",24,88);Student stu4=new Student("成龙","男",26,95);Student stu5=new Student("李娜","女",24,99);Student stu6=new Student("张杰","男",23,88);Student stu7=new Student("刘德华","男",28,99);Student stu8=new Student("张学友","男",27,87);Student stu9=new Student("刘亦菲","女",24,97);list1.add(stu1);list1.add(stu2);list1.add(stu3);list2.add(stu4);list2.add(stu5);list2.add(stu6);list3.add(stu7);list3.add(stu8);list3.add(stu9);Map<String,ArrayList<Student>> map=newHashMap<String,ArrayList<Student>>();map.put("三年级一班", list1);map.put("三年级二班", list2);map.put("三年级三班", list3);System.out.println("输入班级名称:");Scanner input=new Scanner(System.in);String banji=input.next();System.out.println(banji+"学生列表:");ArrayList<Student> list=map.get(banji);for(Student stu:list){System.out.println(stu.getName()+"\t"+stu.getGender()+"\t"+stu.getAge());}}}。
java 集合框架(习题)集合框架Key Point* Collection 接口、Set 接口、List 接口基本操作* List 接口及其实现类* Set 接口及其实现类* 迭代遍历* Hash 算法与hashCode 方法* Comparable 接口* Map 接口及其实现类* 遍历Map* 泛型练习1. 填空Collection 接口的特点是元素是对象;List 接口的特点是元素有(有|无)顺序,可以(可以|不可以)重复;Set 接口的特点是元素无(有|无)顺序,不可以(可以|不可以)重复;Map 接口的特点是元素是键值对,其中值可以重复,键不可以重复。
2. (List)有如下代码import java.util.*;public class TestList{public static void main(String args[]){List list = new ArrayList();list.add(“Hello”);list.add(“World”);list.add(1, “Learn”);list.add(1, “Java”);printList(list);}public static void printList(List list){for(Object obj:list){String str=(String)obj;System.out.println(obj);}}}要求:1) 把//1 处的代码补充完整,要求输出list 中所有元素的内容2) 写出程序执行的结果Hello java Learn World3) 如果要把实现类由ArrayList 换为LinkedList,应该改哪里?ArrayList 和LinkedList 使用上有什么区别?实现上有什么区别?把实例化的语句改为new LinkedList();ArrayList 数组实现查询快增删慢LinkedList 链表实现查询慢增删快4) 如果要把实现类由ArrayList 换为Vector,应该改哪里?ArrayList 和Vector 使用上有什么区别?实现上有什么区别?ArrayList是线程不同步的,轻量级的,线程不安全,速度快Vector是线程同步的,多线程访问比较安全,速度慢3. (List)写出下面程序的运行结果import java.util.*;public class TestList{public static void main(String args[]){List list = new ArrayList();list.add(“Hello”);list.add(“World”);list.add(“Hello”);list.add(“Learn”);list.remove(“Hello”);list.remove(0);for(int i = 0; i<list.size(); i++){System.out.println(list.get(i));}}}HelloLearn4. (Set,List)import java.util.*;public class TestListSet{public static void main(String args[]){List list = new ArrayList();list.add(“Hello”);list.add(“Learn”);list.add(“Hello”);list.add(“Welcome”);Set set = new HashSet();set.addAll(list);System.out.println(set.size());}}选择正确答案A.编译不通过B.编译通过,运行时异常C.编译运行都正常,//输出HashSet中不能放重复值D.编译运行都正常,输出45. (List)已知有一个Worker 类如下:public class Worker {private int age;private String name;private double salary;public Worker (){}public Worker (String name, int age, double salary){ = name;this.age = age;this.salary = salary;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) { = name;}public double getSalary(){return salary;}public void setSalary(double salary){this.salary = salary;}public void work(){System.out.println(name + “ work”);}}完成下面的要求1) 创建一个List,在List 中增加三个工人,基本信息如下:姓名年龄工资zhang3 18 3000li4 25 3500wang5 22 32002) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资33003) 删除wang5 的信息4) 利用for 循环遍历,打印List 中所有工人的信息5) 利用迭代遍历,对List 中所有的工人调用work 方法。
Java语言程序设计C实验报告集合框架及泛型机制学生姓名专业、班级指导教师成绩计算机与信息工程学院年月日一、实验目的学习课程相关章节知识,通过上机练习,掌握以下知识:1.掌握List接口下ArrayList及LinkedList的使用方法。
2.掌握Map接口下HashMap 及HashTable的使用方法3.掌握集合中泛型的使用二、实验内容利用集合完成象数据库那样存储数据,并且可以简单查询,利用map存储学生信息,字段如下: id ,name,age,实现步骤:(1)创建类,类图如下:(2)在main方法编写逻辑代码(3)运行程序并测试结果package com、cn;public class Student {private String name;private int age;private String id;public String getName() {return name;}public void setName(String name) {this、name = name;}public int getAge() {return age;}public void setAge(int age) {this、age = age;}public String getId() {return id;}public void setId(String id) {this、id = id;}public Student(String name, int age, String id) {super();this、name = name;this、age = age;this、id = id;}public void sayHi(){System、out、println("name="+this、getName()+"age="+this、getAge()+" "+"id="+this、getId());}}//Databace类package com、cn;import java、util、Collection;import java、util、HashMap;import java、util、Iterator;public class Databace {private Student a;public Databace() {super();map=new HashMap<String,Student>();}public Student getA() {return a;}public void setA(Student a) {this、a = a;}HashMap<String,Student> map;public void delete(){System、out、println("请输入要删除表中元素ID");String id=Test、sc、next();if(map、containsKey(id)){map、remove(id);Collection<Student> c=map、values();Iterator<Student> it=c、iterator();while(it、hasNext()){a=it、next();a、sayHi();}}else{System、out、println("表中没有该元素");}}public void insert(){System、out、println("按顺序输入id、age、name");String name=Test、sc、next();int age=Test、sc、nextInt();String id=Test、sc、next();a=new Student(name,age,id);map、put(id, a);System、out、println("成功的插入一条记录");}public void update(){System、out、println("请输入要修改表中元素ID");String id=Test、sc、next();if(map、containsKey(id)){map、remove(id);System、out、println("按顺序输入name,age,id");id=Test、sc、next();String name=Test、sc、next();int age=Test、sc、nextInt();a=new Student(id,age,name);map、put(id, a);}else{System、out、println("表中没有该元素");}}public void select(){System、out、println("请输入要查询的方式1、查询单行2、查询全部");int i=Test、sc、nextInt();switch(i){case 1:{System、out、println("请输入要查询表中元素ID");String id=Test、sc、next();if(map、containsKey(id)){a=map、get(id);a、sayHi();}else{System、out、println("表中没有该元素");}}break;case 2:{Collection<Student> c=map、values();Iterator<Student> it=c、iterator();while(it、hasNext()){a=it、next();a、sayHi();}}break;}}}//testpackage com、cn;import java、util、*;public class Test {/*** @param args*/public static Scanner sc=new Scanner(System、in);public static void main(String[] args){// TODO Auto-generated method stuint i=0;Databace d=new Databace();while(i==0){System、out、println("1、储存学生信息");System、out、println("2、查询学生信息");System、out、println("3、修改学生信息");System、out、println("4、删除学生信息");System、out、println("退出");int j=Test、sc、nextInt();switch(j){case 1:d、insert();break;case 2:d、select();break;case 3:d、update();break;case 4:d、delete();break;default:i=1;}}}}提示:用id做map集合的键部分,用student对象做map集合的值部分效果显示:三、实验思想四、实验结果五、实验心得。
任务一:用LinkedList存放对象1.利用面向对象的思想,创建以下类:●Person类,包含Person的姓名和身份证号码,覆盖Object类的toString()方法,显示“姓名:XXX 身份证号:XXX”。
●Student类,继承Person类,包含学生的语文、数学、英文课的成绩,并覆盖父类的toString()方法,显示“姓名:XXX 身份证号:XXX 语文:XXX 数学:XXX 英文:XXX”。
●Teacher类,继承Person类,包含教师的工资。
并覆盖父类的toString()方法,显示“姓名:XXX 身份证号:XXX 工资:XXX”。
●public class Person implements Comparable{●String name;●String ID;●Person(String s,String i){●name=s;●ID=i; }●public String toString() {●String str="姓名:"+name+" 身份证号码:"+ID;●return str; }●public int compareTo(Object arg0) {●Person p=(Person)arg0;●return pareTo(p.ID); } }●class Student extends Person {●int Chinese;●int Math;●int English;●Student(String n,String i,int c,int m,int e){●super(n,i);●Chinese=c;●Math=m;●English=e; }●public String toString() {●String str;●str=" 语文成绩:"+Chinese+" 数学成绩:"+Math+" 英语成绩:"+English;●return super.toString()+str;●}●}●class Teacher extends Person{●int salary;●Teacher(String n,String i,int s){●super(n,i);●salary=s;●}●public String toString() {●String str=" 工资"+salary;●return super.toString()+str;●} }2.分别为以上三个类创建对象:3.将这三个对象存放在一个LinkedList对象中:LinkedList<Person> list=new LinkedList<Person>();4.运行示例:public class MyList {public static void main(String[] args) {LinkedList<Person> m=new LinkedList<Person>();Person p=new Person("张三","12310000");Student s=new Student("李四","12320000",89,93,94);Teacher t=new Teacher("王五","12330000",3000);m.add(p);m.add(s);m.add(t);Iterator<Person> i = m.iterator();while(i.hasNext()){System.out.println(i.next());}}}5.练习使用LinkedList的其他方法。
集合框架:容器:存东西用的。
数组:也是存东西的。
用数组存东西,访问数据速度最快,但修改速度慢。
并且长度不可变。
另外还有一些像链表、树、二叉树、平衡二叉树、红黑树等数据结构。
集合框架就是在这些数据结构之上,加了一些方法,进行包装。
首先记住几个接口(查看API)Collection、Set、List、Map集合框架结构:简略图:集合及其实现类详细图:Collection接口:List接口:(继承Collection接口)List:元素都是有序的(时间顺序),并且元素可以重复。
List集合代表一个有序集合,集合中每个元素都有其对应的的顺序。
允许有重复元素,可以通过索引来访问指定位置的集合元素。
因为List集合默认按元素的添加顺序设置元素的索引,第一次添加的元素索引为0.数组初始化时需要指定大小,而list不需要指定大小。
(可以指定,但不需要指定,指定了也没用)如果不指定大小,它可一直往里边装内容,除非内存装不开。
ArrayList和vector是List接口的经典实现,完全直接list的全部功能。
List接口的具体实现类:ArrayList:List接口的大小可变数组的实现。
除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
下面是ArrayList类的一些方法实例:(具体的可查看API文档)publicclass TestArrayList {publicstaticvoid main(String[] args) {TestArrayList ta = new TestArrayList();ta.test();}publicvoid test(){ArrayList list = new ArrayList();list.add("a");list.add("c");list.add("e");list.add(3, "h");//指定索引处插入// list.remove(1);//指定索引处删除// list.remove("a");//指定具体指删除boolean flag = list.contains("b");//判断集合中是否包含bSystem.out.println(flag);printList(list);}publicvoid printList(List list){for (int i = 0; i < list.size(); i++) {String s = (String) list.get(i);System.out.println(s);}}}Vector:又叫同步容器。
任务书6:集合、泛型的应用一、任务目的:●掌握集合接口及其实现类的概念。
⏹Set接口:HashSet、TreeSet、⏹List接口:ArrayList、LinedList、Vector(1)Ma a oveFirst 和removeLast, 这些方法没有在任何接口或基类中定义过使得LinedList可以当作堆栈、队列和双向队列使用。
1.〔2〕Set的功能方法Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。
实际上Set就是Collection,只是行为不同。
这是继承与多态思想的典型应用:表现不同的行为。
Set不保存重复的元素至于如何判断元素相同那么较为负责(1)Set : 存入Set的每个元素都必须是唯一的,因为Set 不保存重复元素。
参加Set的元素必须定义equals方法以确保对象的唯一性。
Set与Collection有完全一样的接口。
Set接口不保证维护元素的次序。
(2)HashSet : 为快速查找设计的Set。
存入HashSet的对象必须定义hashCode。
(3)TreeSet : 保存次序的Set, 底层为树结构。
使用它可以从Set中提取有序的序列。
(4)LinedHashSet : 具有HashSet的查询速度,且使用链表维护元素的顺序插入的次序。
于是在使用迭代器遍历Set 时,结果会按元素插入的次序显示。
(1)〔3〕Ma aa ain方法。
(2)在main方法中定义set集合,该集合为HashSet类型的实例化对象。
然后向set集合中添加上述7个字符串元素,最后用两种方式输出集合元素:第一种方式是直接输出〔默认调用toString〔〕方法〕,第二种方式通过迭代器逐个遍历。
(3)同理在main方法中定义list集合,该集合为ArrayList 类型的实例化对象。
然后向list集合中添加上述7个字符串元素,最后用两种方式输出集合元素:第一种方式是直接输出〔默认调用toString〔〕方法〕,第二种方式通过迭代器逐个遍历。
任务一:用LinkedList存放对象1.利用面向对象的思想,创建以下类:●Person类,包含Person的姓名和身份证号码,覆盖Object类的toString()方法,显示“姓名:XXX 身份证号:XXX”。
●Student类,继承Person类,包含学生的语文、数学、英文课的成绩,并覆盖父类的toString()方法,显示“姓名:XXX 身份证号:XXX 语文:XXX 数学:XXX 英文:XXX”。
●Teacher类,继承Person类,包含教师的工资。
并覆盖父类的toString()方法,显示“姓名:XXX 身份证号:XXX 工资:XXX”。
●public class Person implements Comparable{●String name;●String ID;●Person(String s,String i){●name=s;●ID=i; }●public String toString() {●String str="姓名:"+name+" 身份证号码:"+ID;●return str; }●public int compareTo(Object arg0) {●Person p=(Person)arg0;●return pareTo(p.ID); } }●class Student extends Person {●int Chinese;●int Math;●int English;●Student(String n,String i,int c,int m,int e){●super(n,i);●Chinese=c;●Math=m;●English=e; }●public String toString() {●String str;●str=" 语文成绩:"+Chinese+" 数学成绩:"+Math+" 英语成绩:"+English;●return super.toString()+str;●}●}●class Teacher extends Person{●int salary;●Teacher(String n,String i,int s){●super(n,i);●salary=s;●}●public String toString() {●String str=" 工资"+salary;●return super.toString()+str;●} }2.分别为以上三个类创建对象:3.将这三个对象存放在一个LinkedList对象中:LinkedList<Person> list=new LinkedList<Person>();4.运行示例:public class MyList {public static void main(String[] args) {LinkedList<Person> m=new LinkedList<Person>();Person p=new Person("张三","12310000");Student s=new Student("李四","12320000",89,93,94);Teacher t=new Teacher("王五","12330000",3000);m.add(p);m.add(s);m.add(t);Iterator<Person> i = m.iterator();while(i.hasNext()){System.out.println(i.next());}}}5.练习使用LinkedList的其他方法。
将自己的信息添加到链表的开头,以及结尾,然后再删除自己的信息。
返回类型方法名称描述void addFirst()将指定元素插入此列表的开头void addLast()将指定元素添加到此列表的结尾E removeFirst()移除并返回此列表的第一个元素E removeLast()移除并返回此列表的最后一个元素boolean add(Object o)将指定的元素添加到列表中任务二:用SET存放对象1.将以下三个Person类的对象放在一个HashSet中,由于HashSet不能存放重复的元素(姓名和身份证号都不能重复),所以在Person类中,需要覆盖hashCode()方法和equals()方法。
这里给出重写方法的程序:public boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (name == null) {if ( != null)return false;} else if (!name.equals())return false;if (id != other.id)return false;return true;}public int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((name == null) ? 0 :name.hashCode());result = prime * result + id;return result;}再创建一个Person对象:能放入到刚才创建的HashSet中吗?通过这个对象来测试hashCode()方法和equals()方法的编写是否正确。
1.把集合中的元素打印出来(使用迭代器Iterator类)。
2.public class MyHashSet {3. public static void main(String[] args) {4.HashSet<Person> h=new HashSet<Person>();5.Person p=new Person("张三","12310000");6.Person p4=new Person("张三","12310000");7.h.add(p);8.Person p1=new Person("李四","12320000");9.Person p2=new Person("王五","12330000");10.h.add(p1);11.h.add(p2);12.Iterator<Person> i = h.iterator();13.while(i.hasNext()){14.System.out.println(i.next());15.}16.//添加之后17.h.add(p4);18.System.out.println("添加之后");19.Iterator<Person> i1 = h.iterator();20.while(i1.hasNext()){21.System.out.println(i1.next());22.} }}23.用TreeSet存放上面三个人,要求按照身份证号排序,打印出来。
(注意使用TreeSet要实现Comparable接口,并覆盖compareTo()方法)24.import java.util.Iterator;25.import java.util.TreeSet;26.27.public class MYTreeSet {28. public static void main(String[] args) {29.TreeSet<Person> t=new TreeSet<Person>();30.Person p=new Person("张三","12310000");31.Person p1=new Person("李四","12320000");32.Person p2=new Person("王五","12330000");33.Person p4=new Person("王五","12330000");34.t.add(p);35.t.add(p1);36.t.add(p2);37.Iterator<Person> i=t.iterator();38.while(i.hasNext()){39.System.out.println(i.next());40.}41.System.out.println("添加之后:");42.t.add(p4);43.Iterator<Person> i1=t.iterator();44.while(i1.hasNext()){45.System.out.println(i1.next());46.} }}任务三:用Map存放对象设计一个TXT文件,里面存放了10个同学的学号和姓名。
给定学生的学号,问该学生在不在名单中,如果在,给出姓名。
[基本要求] 使用Java API中的Map相关的技术来完成实验任务。
●使用文件操作,读出文件中的学号和姓名;●学号作为KEY,姓名作为VALUE,放到MAP中;●从命令行中输入的学号,作为KEY,在MAP中进行检索。
public class MYMap {public static void main(String[] args) throws IOException {System.out.println("请输入文件的绝对路径");Scanner re=new Scanner(System.in);String wen=re.nextLine();BufferedReader bu=new BufferedReader(new FileReader(wen));HashMap<String, String> m=new HashMap<String,String>();String str;while((str=bu.readLine())!=null){String[]s=str.split(" ");m.put(s[0], s[1]);}String sr;System.out.println("请输入您要查询的学号:");String num=re.nextLine();System.out.println(num);if((sr=m.get(num))!=null){System.out.println(num +" "+sr);}elseSystem.out.println("没有此人");bu.close();}}。