实验十 泛型与集合框架
Java面向对象程序设计第2版第13章_泛型与集合框架

2020/8/24
9
§13.2.2 常用方法
◆ LinkedList<E>泛型类实现Lis<E>泛型接口中的一些常用方法。
public boolean add(E element) 向链表末尾添加一个新的节点,该节点中的
数据是参数elememt指定的数据。
◆ 当用户需要遍历集合中的对象时,应当使用该集合提供的迭
代器,而不是让集合本身来遍历其中的对象。由于迭代器遍历集 合的方法在找到集合中的一个对象的同时,也得到待遍历的后继 对象的引用,因此迭代器可以快速地遍历集合。
◆链表对象可以使用iterator()方法获取一个Iterator对象,
该对象就是针对当前链表的迭代器。 例题13-3
◆ JDK1.5 之 前 没 有 泛 型 的 LinkedList 类 , 可 以 用 普 通 的
LinkedList创建一个链表对象,如LinkedList mylist=new LinkedList(); Java泛型的主要目的是可以建立具有类型安全的集合框架,优
点就是:在使用这些泛型类建立的数据结构时,不必进行强制类 型转换,即不要求进行运行时类型检查。
2020/8/24
3
§13.1 泛型
泛型(Generics)是在JDK1.5中推出的,其 主要目的是可以建立具有类型安全的集合框架, 如链表、散列映射等数据结构。
2020/8/24
4
§13.1.1 泛型类声明
可以使用“class 名称<泛型列表>”声明一个类,为 了和普通的类有所区别,这样声明的类称作泛型类,如:
2020/8/24
8
§13.2.1 LinkedList<E>泛型类
实验十泛型程序设计技术

实验⼗泛型程序设计技术实验⼗泛型程序设计技术实验时间 2018-11-1基础知识:1 什么是泛型程序设计?. JDK 5.0 中增加的泛型类型,是Java 语⾔中类型安全的⼀次重要改进。
. 泛型:也称参数化类型(parameterized type),就是在定义类、接⼝和⽅法时,通过类型参数指⽰将要处理的对象类型。
(如ArrayList类). 泛型程序设计(Generic programming):编写代码可以被很多不同类型的对象所重⽤。
2 泛型类的定义:⼀个泛型类(generic class)就是具有⼀个或多个类型变量的类,即创建⽤类型作为参数的类。
如⼀个泛型类定义格式如下:class Generics<K,V>其中的K和V是类中的可变类型参数。
Pair类引⼊了⼀个类型变量T,⽤尖括号(<>)括起来,并放在类名的后⾯。
泛型类可以有多个类型变量。
例如:public class Pair<T, U> { … }类定义中的类型变量⽤于指定⽅法的返回类型以及域、局部变量的类型。
3 泛型⽅法的声明:除了泛型类外,还可以只单独定义⼀个⽅法作为泛型⽅法,⽤于指定⽅法参数或者返回值为泛型类型,留待⽅法调⽤时确定。
– 泛型⽅法可以声明在泛型类中,也可以声明在普通类中。
4 泛型变量的限定:public class NumberGeneric< T extends Number>泛型变量上界的说明,上述声明规定了NumberGeneric类所能处理的泛型变量类型需和Number有继承关系;extends关键字所声明的上界既可以是⼀个类,也可以是⼀个接⼝;List<? super CashCard> cards = new ArrayList<T>();泛型变量下界的说明,通过使⽤super关键字可以固定泛型参数的类型为某种类型或者其超类,当程序希望为⼀个⽅法的参数限定类型时,通常可以使⽤下限通配符。
学号姓名--集合框架与泛型实验报告

浙江大学城市学院实验报告课程名称面向对象程序设计实验项目名称集合框架与泛型学生姓名专业班级学号一. 实验目的和要求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的功能。
JAVA实验报告材料-集合框架及泛型机制

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 集合的值部分效果显示:三、实验思想四、实验结果五、实验心得。
Java面向对象程序设计第9章 泛型与集合框架

public class PointTest3{ public static void show(Point<T> p){//无法确定T System.out.println( "("+p.x+","+p.y+")"); } public static void main(String[] args){ Point<Integer> p=new Point<Integer>(1,1); show(p); //实参是p,不是Integer } }
public class PointTest1{ public static void main(String[] args){ Point p=new Point(1,2.0); int x =(Integer)p.x; //Point忘记了y坐标的类型,编译通过,执行出错 int y =(Integer)p.y; System.out.println("("+x+","+y+")"); } }
9.1 泛型
9.1.1 为什么需要泛型
在《数据结构》课程中常以int型的数据域为例 来定义各种数据结构。当需要其他类型的数据 域时,需要重新定义数据域的类型,这样就产 生多个同构的数据结构。 Java世界中一切皆对象,根类是Object类,有 一般性意义。可以将数据域定义为Object类型。 事实上,早期的Java语言类库提供了一个链表 类LinkedList,其数据域类型正是使用Object 类型来解决这个问题。
将元素加入集合中后,集合中的元素都将丢失其 数据类型,统一为Object类型。
第10章 集合与泛型

10.1.3
List接口及实现类
2. 集合操作 • List接口的操作与Collection接口类似,但也有些不同 。例如,remove()方法总是从线性表中删除指定的首 次出现的元素;add()和addAll()方法总是将元素添 加到线性表的末尾。 • 下面的代码可以实现连接两个线性表: list1.addAll(list2); • 如果不想破坏原来的线性表,可以如下实现: List<Type> list3 = new ArrayList<>(list1); List3.addAll(list2); • 对于两个线性表对象的比较,如果它们包含相同的元 素并且顺序相同,则两个线性表相等。
List
ArrayList
Vector
LinkedList
Stack
图10.2 List接口及实现类
10.1.3
List接口及实现类
List接口的定义如下: public interface List<E> extends Collection<E> { // 定位访问 E get(int index); // 返回指定下标处的元素 E set(int index, E element); // 设置指定下标处的 元素 boolean add(E element); // 将指定元素添加到列 表的末尾 void add(int index, E element); // 将指定元素添加到 指定下标处 E remove(int index); // 删除指定下标处的元素 abstract boolean addAll(int index, Collection<? extends E> c);
10.1.3
Java程序设计实战案例教程 第22章 集合框架和泛型

在列表的开头插入指定元素,该方法从JDK1.6开始是Deque接口中的 方法
缺点:空间是连续的,删除或插入元素,需要大量移动元素
4
该类是JDbKo1o.l2e版an,线off程er不La同st步(E的e,) 在多将线指程定操元作素时添,加会到提列表高的访末问尾效,率作,用但与会ad降d(低E 程e)序方的法的安功全能性相同,
ListIterator接口的产生 在使用迭代器对象遍历集合时,使用 集合的添加方法,试图在遍历的过程中添 加无素,则会出现并发修改异常 解决方案:使用迭代器对象遍历集合, 使用迭代器对象添加元素
示例
泛型
为什么需要使用泛型
在向集合中添加元素时进行了向上类型转换转成了Object类型 在进行元素的遍历时,强制进行了向下类型转换,转成了String类型 结论:编译正常,但在运行时,就会产生类型转换异常 解决方案:像数组一样在创建对象时,就明确规则集合中所存储的元素的类型,
方法
描述
List接口常用的实现类
1 ArrayList void addFirst(E e)
在列表的开头插入指定元素
2
继承AbstvroaicdtLiasdtd类Las实t(现E Lei)st接口 将指定元素添加到列表的末尾
3
增底 优加层点数:据遍b结历oo构和le是根an数据组索off引er访Fi问rs效t(率E 高e)
一次性删除集合中的全部对象
8
boolean
removeAll(Collection<?> c) 将两个集合中相同的对象删除
9
boolean
retainAll(Collection<?> c) 将两个集合中不相同的对象删除
JAVA实验报告-集合框架及泛型机制

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集合的值部分效果显示:三、实验思想四、实验结果五、实验心得。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十泛型与集合框架1.实验目的1、掌握LinkedList<E>类和Collections类提供的用于排序和查找链表中的数据的方法2、掌握用散列映射来存储数据3、掌握TreeSet<E>类的使用2.实验内容1、根据附录里的源代码,按照注释要求,完成代码填空,使程序能够运行得出结果。
1)实验1 按身高排序2)实验2 英汉小字典3)实验3 演出节目单4)实验4输出args[]中的单词2、设计编写程序完成以下任务。
1)仿照实验1编写TV类,要求通过实现Comparable接口规定该类的对象的大小关系,按price值得大小确定大小关系,即电视机按其价格确定之间的大小关系。
2)从控制台输入若干个单词(输入回车结束)放入集合中,将这些单词排序后(忽略大小写)打印出来。
知识点:List接口的实现类、String常用方法3)请使用LinkedList来模拟一个队列(先进先出的特性):(1)拥有放入对象的方法void put(Object o)(2)取出对象的方法Object get()(3)判断队列当中是否为空的方法boolean isEmpty();并且,编写测试代码,验证你的队列是否正确。
知识点:List接口的实现类LinkedList常用方法4)在一个列表中存储以下元素:apple,grape,banana,pear(1)返回集合中的最大的和最小的元素(2)将集合进行排序,并将排序后的结果打印在控制台上知识点:Collections类中的方法3.实验步骤略4.评分标准1.A——内容功能完善,编程风格好,人机接口界面好;2.B——内容功能完善,编程风格良好,人机接口界面良好;3.C——完成必做内容;4.D——能完成必做内容;5.E——未按时完成必做内容,或者抄袭(雷同者全部为E).参照书上实验按模版要求,将【代码】替换为Java程序代码,编写好完整的程序文档,最后运行得到的相关文件,把实验所得文件一起打包上交。
(压缩包的文件名为:学号后三位和名字开头字母,如109zhh.RAR|ZIP)附录:实验1 按身高排序模板代码Student.javapublic class Student implements Comparable<Student>{int height=0;String name;Student(String n,int h){name=n;height=h;}public int compareTo(Student b){return (this.height-b.height);}}FindStudent.javaimport java.util.*;public class FindStudent {public static void main(String[] args) {List<Student> list=new LinkedList<Student>();list.add(new Student("张三",188));list.add(new Student("李四",178));list.add(new Student("王五",198));Iterator<Student> iter=list.iterator();System.out.println("排序前,链表中的数据");while(iter.hasNext()){Student stu=iter.next();System.out.println(+"身高:"+stu.height);}Collections.sort(list);System.out.println("排序后,链表中的数据");iter=list.iterator();while(iter.hasNext()){Student stu=iter.next();System.out.println(+"身高:"+stu.height);}Student zhaolin=new Student("zhao xiao lin",178);int index=Collections.binarySearch(list,zhaolin,null);if(index>=0){System.out.println(+"和链表中"+list.get(index).name+"身高相同");}}}实验2 英汉小字典模板代码Dictionary.javapublic class Dictionary {public static void main(String[] args) {WindowWord win = new WindowWord();win.setTitle("英汉小字典");}}WindowWord.javaimport java.awt.*;import javax.swing.*;public class WindowWord extends JFrame{JTextField inputText,showText;WordPolice police;WindowWord(){setLayout(new FlowLayout());inputText=new JTextField(6);showText=new JTextField(6);add(inputText);add(showText);police=new WordPolice();police.setJTextField(showText);inputText.addActionListener(police);setBounds(100,100,400,280);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}WordPolice.javaimport java.awt.event.*;import javax.swing.*;import java.io.*;import java.util.*;public class WordPolice implements ActionListener {JTextField showText;HashMap<String,String> hashtable;File file=new File("word.txt");Scanner sc=null;WordPolice(){hashtable=new HashMap<String,String>();try{sc=new Scanner(file);while(sc.hasNext()){String englishWord=sc.next();String chineseWord=sc.next();hashtable.put(englishWord, chineseWord);}}catch(Exception e){System.out.print(e.toString());} }public void setJTextField(JTextField showText){this.showText=showText;}public void actionPerformed(ActionEvent e){String englishWord=e.getActionCommand();if(hashtable.containsKey(englishWord)){String chineseWord=hashtable.get(englishWord);showText.setText(chineseWord);}else{showText.setText("没有此单词");}}}实验3 演出节目单模板代码Outer.javaPerform.javapublic class Perform {public static void main(String[] args) {new ShowFrame();}}Program.javaimport java.util.*;public class Program implements Comparable<Program> {Date time=null;String name;Program(String s,int year,int month,int day,int hour,int minute,int second){ name=s;Calendar calendar=Calendar.getInstance();calendar.set(year,month-1,day,hour,minute,second);long n=calendar.getTimeInMillis();time=new Date(n);}public int compareTo(Program b) {int m=0;if(time.equals(b.getDate())){m=0;}else if(time.after(b.getDate())){m=1;}else if(time.before(b.getDate())){m=-1;}return m;}public String getName(){return name;}public Date getDate(){return time;}}ShowFrame.javaimport java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;import java.text.SimpleDateFormat;public class ShowFrame extends JFrame implements ActionListener {JTextArea showArea;JTextField inputName,inputTime;JButton button;TreeSet<Program> treeSet;ShowFrame(){treeSet=new TreeSet<Program>();showArea=new JTextArea();showArea.setFont(new Font("",Font.BOLD,20));inputName=new JTextField(5);inputTime=new JTextField(10);button=new JButton("确定");button.addActionListener(this);JPanel pNorth=new JPanel();pNorth.add(new JLabel("节目名称"));pNorth.add(inputName);pNorth.add(new JLabel("时间(yyyy/mm/dd/hh:mm:ss)"));pNorth.add(inputTime);pNorth.add(button);add(pNorth,BorderLayout.NORTH);add(new JScrollPane(showArea),BorderLayout.CENTER);setSize(500,320);setVisible(true);setDefaultCloseOperation(DISPOSE_ON_CLOSE);validate();}public void actionPerformed(ActionEvent e) {String name=inputName.getText();String time=inputTime.getText();StringTokenizer jiexi=new StringTokenizer(time,"/:");int year=Integer.parseInt(jiexi.nextToken());int month=Integer.parseInt(jiexi.nextToken());int day=Integer.parseInt(jiexi.nextToken());int hour=Integer.parseInt(jiexi.nextToken());int minute=Integer.parseInt(jiexi.nextToken());int second=Integer.parseInt(jiexi.nextToken());Program program=new Program(name,year,month,day,hour,minute,second);treeSet.add(program);show(treeSet);}public void show(TreeSet tree){showArea.setText(null);Iterator<Program> te=treeSet.iterator();while(te.hasNext()){Program pro=te.next();Date date=pro.getDate();SimpleDateFormat matter1=new SimpleDateFormat("yyyy/MM/dd/HH:mm:ss");String time=matter1.format(date);showArea.append(pro.getName()+"(演出时间)"+time+"\n");}}}实验4 输出args[]中的单词模板代码TestArgsWords.javaimport java.util.*;public class TestArgsWords {private static final int ONE = 1;public static void main(String args[]) {Map<String, Integer> m = new HashMap<String, Integer>();for (int i = 0; i < args.length; i++) {if(!m.containsKey(args[i])) {m.put(args[i], ONE);}else {int freq = m.get(args[i]);m.put(args[i], freq + 1);}}System.out.println(m.size() + " distinct words detected:");System.out.println(m);}}。