实验11 泛型与集合
集合与泛型

第2章集合与泛型2.1 集合概述所谓集合是特殊元素们的一种聚合。
集合的元素被称为是成员。
集合有两个最重要的属性,一个是集合成员都是无序的,另一个则是集合的成员不会出现超过一次。
在计算机科学领域内集合扮演着非常重要的角色,但是不把集合包含作为C#语言的一种数据结构。
2.1.1 集合的定义人们把集合定义成相关成员的无序聚集,而且集合中的成员不会出现超过一次。
集合书写成用一对闭合大括号包裹成员列表的形式,例如{0,1,2,3,4,5,6,7,8,9}。
只要全部成员只书写一次,就可以按照任意顺序书写集合,所以此前的集合实例还可以写成{9,8,7,6,5,4,3,2,1,0}或其他任意成员组合的形式。
为了使用集合需要知道一些有关集合的定义。
1. 不包含任何成员的集合称为空集合。
全域是所有可能成员的集合。
2. 如果两个集合包含完全一样的成员,那么就认为这两个集合相等。
3. 如果第一个集合的全部成员都包含在第二个集合内,就认为第一个集合是第二个集合的子集。
2.1.2 集合的操作下面描述了在集合上执行的基本操作。
1. 联合:由第一个集合中的所有成员和第二个集合中不包含在第一个集合的成员组成的新集合。
2. 交叉:由既属于第一个集合又属于第二个集合的成员组成的新集合。
3. 差异:由属于第一个集合但不属于第二个集合的成员组成的新集合。
2.2 集合类ArrayList是与数组相当的集合类。
还有其他类型的集合:队列、栈、有序表和哈希表,如下所示:●ArrayList 动态数组●Queue 队列●Stack 栈●BitArray 位数组●Hashtable 散列表●SortedList 有序表集合类位于System.Collections命名空间,集合类可以组合为集合,存储Object类型的元素。
2.3 集合的一种实现HashTable类是.NET框架类库中较为有效的数据结构之一,它的存取速度较其它类而2.1 泛型概述泛型(Generic Type)是.NET Framework 2.0的一大特性。
如何使用泛型与泛型集合

students.Remove("周杰杰"); 通过key删除元素 …
演示示例5:MySchool
哈希表的遍历
如何遍历一个哈希表?
不能遍历整个对象,而 是遍历Values
foreach (Object stuo in students.Values) {
Student stu = (Student)stuo; Console.WriteLine(); }
给哈希表添加元素
使用哈希表
students.Add( , scofield);
添加元素
Key
获取哈希表的元素
Value
…
Student stu2 = (Student)students["周杰杰"];
stu2.SayHi();
…
需要类型转换
通过key获取元素
删除哈希表的元素
int Add(Object value) //添加一个对象到集合的末尾 返回索引
建立班级学员的集合
ArrayList students = new ArrayList();
Student scofield = new Student("Scofield", Genders.Male, 28, "越狱狱");
第11章泛型与集合

Map接口操作
➢ Map接口基本操作: 6.1.1 public V put(K key, V value) public V get(Object key) public V remove(Object key) public void clear() public Set<K> keySet() public Collection<V> values()
用Set对象实现集合操作
➢ 使用Set对象的批量操作方法,可以实现标准集合代数运算。 6.1.1
➢ 假设s1和s2是Set对象,下面的操作可实现相关的集合运算。
s1.addAll(s2):实现集合s1与s2的并运算。 s1.retainAll(s2):实现集合s1与s2的交运算。 s1.removeAll(s2):实现集合s1与s2的差运算。 s1.containAll(s2):如果s2是s1的子集,该方法返回true。
➢ 常用方法如下:
E get(int index)
6.1.1
E set(int index, E element)
void add(int index, E element)
E remove(int index)
int indexOf(Object o)
int lastIndexOf(Object o)
HashSet类
➢ HashSet类用散列方法存储元素,具有最好的存取性能, 6.1.1 但元素没有顺序。
➢ HashSet类的构造方法有: HashSet() 初始容量是16,默认装填因子是0.75。 HashSet(Collection c) HashSet(int initialCapacity)
面向对象程序设计 ——泛型与集合
集合与泛型

第一个问题:怎么才能了解JAVA集合类?集合类是什么?数组是集合的一种,是集合的一个子集,你理解了数组就理解了集合.理解集合类集合类存放于java.util包中。
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
集合类型主要有3种:set(集)、list(列表)和map(映射)。
(1)集集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。
对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象。
集也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。
它实现的是SortedSet接口,也就是加入了对象比较的方法。
通过对集中的对象迭代,我们可以得到一个升序的对象集合。
(2)列表列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。
列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。
关于实现列表的集合类,是我们日常工作中经常用到的,将在后边的笔记详细介绍。
(3)映射映射与集或列表有明显区别,映射中每个项都是成对的。
映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。
关键字应该是唯一的。
关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。
理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。
集合类简介java.util中共有13个类可用于管理集合对象,它们支持集、列表或映射等集合,以下是这些类的简单介绍集:1. HashSet:使用HashMap的一个集的实现。
泛型与集合的注意事项

泛型与集合的注意事项⼀.List,List<Object>,List<?>三者区别1.List(1)List可以接受任意泛型赋值List list = new ArrayList();List list1 = new ArrayList<Object>();List list2 = new ArrayList<Integer>();(2)List可以赋值给任意类型注意遍历时可能会出现类型转换异常,这是由于list中可能存放不同类型数据导致转换不了List list = new ArrayList();list.add(111);list.add(222);List<Integer> list1 = list;list1.forEach(System.out::println);将 list.add(222) 改为 list.add("222") 再执⾏就会出错Exception in thread "main" ng.ClassCastException: ng.String cannot be cast to ng.Integerat java.util.ArrayList.forEach(ArrayList.java:1249)at code.TestDemo.main(TestDemo.java:16)2.List<Object>(1)List<Object>可以接受List赋值List list = new ArrayList();List<Object> list2 = list;(2)确定类型的集合是不可以相互赋值的List<Object>不可以赋值给List<Integer>,同时List<Integer>也不可以赋值给List<Object> 3.List<?>List<?>在接受了其他泛型赋值之后,可以删除和清除元素 list2.remove(0); , list2.clear();List<?>在接受了其他泛型赋值之后,不可以添加元素 list2.add(1); 但可以添加null元素 list2.add(null);List<?>可以获取元素但必须使⽤Object来接收,需要修改内部数据需判断之后强制类型转换再修改List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);List<?> list2 = list;list2.remove(0);list2.clear();1 List<?> list2 = new ArrayList<T>() {2 {3 add(new T(1));4 add(new T(2));5 add(new T(3));6 }7 };89 list2.add(null); //可以添加null元素10 Object obj = list2.get(1);1112if (obj instanceof T) { //强制类型装换后可以改变内部数据13 T t = (T) obj;14 System.out.println(t.i);15 t.i = 3;16 }1718 obj = list2.get(1);19if (obj instanceof T) {20 System.out.println(((T) obj).i);21 }⼆.<? extends T>和<? super T>1.<? extends T>(1)只允许接受T类型或T类型的⼦类赋值List<Integer> list1 = new ArrayList<>();List<Number> list2 = new ArrayList<>();List<? extends Number> list = list1;list = list2;(2)不能使⽤add⽅法添加新元素,只能添加null不能 list.add(1);List<Integer> list1 = new ArrayList<>();list1.add(1);list1.add(2);List<? extends Number> list = list1;list.add(null);(3)取出元素只能使⽤T类型以及T类型的⽗类接收List<Integer> list1 = new ArrayList<>();list1.add(1);list1.add(2);List<? extends Number> list = list1;Number number = list.get(0);Object number1 = list.get(0);2.<? super T>(1)只允许接受T类型或T类型的⽗类赋值List<Integer> list1 = new ArrayList<>();List<Number> list2 = new ArrayList<>();List<? super Integer> list = list1;list = list2;(2)只能使⽤add⽅法添加T类型元素或T类型的⼦类型元素List<Integer> list1 = new ArrayList<>();List<? super Integer> list = list1;list.add(new Integer(1));(3)取出类型只能使⽤Object类型接收List<Object> list1 = new ArrayList<>();list1.add(new Animal());list1.add(new Person());list1.add(new Man());List<? super Man> list = list1;Object obj = list1.get(1);三.注意事项1.List<Parent> 与 List<Child>没有⽗⼦关系也不是同⼀个关系1 List<Number> list = new ArrayList<Integer>(); //报错1public static class MyList<T> {2 List<T> list = new ArrayList<>();34// 把输⼊参数塞给⾃⼰,类似于⽣产操作5public void pushList(List<T> t) {6 list.addAll(t);7 }89// 把⾃⼰的内容塞给输⼊参数,类似于让输⼊参数做消费。
实验11泛型与集合

}
}
} System.out.println(integer);
}
}
}
package ex113;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
import java.util.Set;
public class Student {
private String name;
private int score;
public Student(){
}
public Student(String name,int score) {
=name;
package ex113;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
return "";
}
}
(2)输入10个数字保存到List中,并按倒序显示出来。
package ex112;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
泛型 集合 方法

泛型集合方法
嘿,朋友们!今天咱来聊聊“泛型”“集合”还有“方法”这些超厉害的东西!
就比如说泛型吧,你可以把它想象成一个超级灵活的盒子!哇塞,啥都能往里装!比如说,你要创建一个可以放各种不同类型东西的容器,这时候泛型就派上大用场啦!“为啥不直接指定类型呢?”你可能会问。
嘿嘿,那可不一样哦!就好比你有个盒子,今天你可能想装苹果,明天也许就想装橙子啦,泛型就让你的代码变得像孙悟空一样神通广大,能应对各种不同的情况!
再来说说集合。
集合就像是一个大部队,里面有好多好多成员呢!想象一下,你有一堆玩具,把它们放在一个箱子里,这箱子就是集合呀!可以轻松地对这些成员进行各种操作,增删改查,易如反掌!比如你有一群朋友的名单,你就可以用集合来管理他们,多方便!
还有方法呢,方法就像是一个个小魔法!当你需要做一件事情的时候,就调用对应的方法。
好比你饿了,就调用“做饭”这个方法,嘿,马上就能有吃的啦!
有一次,我和小伙伴在写代码的时候,就为了用泛型还是不用泛型争论起来。
我就觉得泛型简直太棒了,那么灵活,以后修改也方便呀!他还不太理解,我就给他详细解释,最后他恍然大悟!“原来泛型这么好啊!”他惊叹道。
总之,泛型、集合和方法,它们就像是代码世界里的黄金搭档,相互配合,让我们的编程之路变得更加精彩!它们能让我们的代码更简洁、更强大、更高效!这难道还不让人兴奋吗?所以呀,大家一定要好好掌握它们,让它们为我们的代码增光添彩!。
学号姓名--集合框架与泛型实验报告

浙江大学城市学院实验报告课程名称面向对象程序设计实验项目名称集合框架与泛型学生姓名专业班级学号一. 实验目的和要求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的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验11泛型与集合
实验目的及要求:
(1)熟悉泛型的概念及用法;
(2)熟悉java的集合框架原理;
(3)掌握常用的集合及泛型类的用法:LinkedList<E>、HashSet<E>、HashMap<K,V>、TreeMap<K,V>、 TreeSet<E>;
实验内容:
(1)定义一个泛型类Instrument<E >,其中包括一个泛型方法void play(E x)。
定义两种乐器类:Cello、Violin可以进行演奏。
定义一个测试类进行测试。
(2)输入10个数字保存到List中,并按倒序显示出来。
(3)编写一个程序,把学生名和考试分数录入到Map中,并按分数显示前三名学生的名字。
要求定义Student类,封装学生名和考试分数2个属性及方法。