实验11泛型与集合
如何使用泛型与泛型集合

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, "越狱狱");
集合与泛型

12-1 集合與陣列的比較 12-2 Collection介面與Collections類別 12-3 泛型 12-4 各種集合的特色
12-5 Map的功能與架構
第12章 集合與泛型 - 2
12-1 集合與陣列的比較
集合 空間 大小 不必指定集合大小。無論 將元素存入或移除,集合 都會動態調整空間以符合 需求。 陣列 必須指定陣列大小,之後無 法改變。元素存取時,不可 超過索引上限。
第12章 集合與泛型 - 10
泛型的進階設定 泛型的設定也可以使用「?」搭配「extends」或 「super」來增加設定上的彈性。
第12章 集合與泛型 - 11
輸出結果 書籍定價為:580 範例說明 • 第3行:T的類型可以是Number或其子類別。 • 第10行:指定T的類型是Integer。 • 第12行:book物件其泛型T的設定是Integer,符合第3行規定,所以可以呼 叫第3行的show()方法。
資料 類型
可存放物件,放入的物件 可存放物件或基本類型,但 會自動轉型成Object類型, 必須符合陣列的資料類型。 搭配泛型功能就可限制元 素的資料類型。
要將元素取出,可使用: 1.for-each。 2.Iterator物件功能。 要將元素取出,可使用: 1.for迴圈並搭配索引。 2.for-each。
第12章 集合與泛型 - 21
Comparable介面
要讓物件加入至SortedSet集合內之後有排序性,該物件所屬類別
必頇實作Comparable介面的compareTo()方法。假設SortedSet集 合內已有1個物件o1,並準備新增另一個物件o2,
會自動執行「pareTo(o2);」,有3種回傳值:
集合、泛型

HandsOn
3
Collection 接口 1-1
Collection对象是将多个元素组成一个单元的 对象
集合用于存储、检索和操纵数据
集合框架是用于表示和操纵集合的统一体系结 构
HandsOn
4
Collection 接口 1-2
集合框架包含三个组件
接口
是表示集合的 抽象数据类型
实现
是接口的实际实现
HandsOn
12
Vector 类 3-1
Vector 类
它具有类似数组的数据 结构,而且是动态的
可以存放一定 数量的元素
容量可以递增
HandsOn
13
Vector 类 3-2
构造方法
Vector()
创建一个空 Vector
说明
创建一个空 Vector ,其初始大小由 initialCap 指 定,容量增量 为 0
HandsOn
25Leabharlann HandsOn23
泛型接口和类的定义(绪)
定义泛型接口或类时,其中的参数化类型可以带 有限制条件:
class MyList<E extends Number>{ ...... }
HandsOn
24
泛型方法的定义
泛型方法是指带有参数化类型的方法:
public static<T> void fromArrayToCollection( T[] a,Collection<T> c) { for() { c.add(o); } }
集合、泛型
HandsOn
教学目标
了解集合框架的接口以及实现类。 掌握ArrayList、Vector以及HashMap等 常见集合实现类的用法。 了解如何利用泛型存取数据。
泛型在集合中的作用

泛型在集合中的作用泛型是Java中一种重要的特性,它在集合中起着重要的作用。
本文将探讨泛型在集合中的作用和优势,并介绍一些常见的泛型用法。
一、泛型的作用泛型的作用是为了在编译时期提供类型安全检查,并减少类型转换的错误。
在集合中,泛型可以帮助我们在编译时期捕获一些类型错误,避免在运行时期出现ClassCastException等异常。
二、泛型的优势使用泛型的主要优势是增加了代码的可读性和可维护性。
通过指定集合中元素的类型,我们可以清晰地知道集合中存储的是什么类型的对象,从而更好地理解代码的含义。
此外,泛型还能提供编译时期的类型检查,避免了一些潜在的错误。
三、泛型用法1. 声明泛型集合在声明集合变量时,可以使用泛型来指定集合中元素的类型。
例如,可以声明一个ArrayList来存储整数类型的元素:```javaArrayList<Integer> list = new ArrayList<>();```这样,我们就可以确保list集合中只能存储整数类型的对象,如果尝试存储其他类型的对象,编译器会报错。
2. 使用通配符通配符是一种特殊的泛型类型,用来表示未知的类型。
在一些情况下,我们可能需要操作集合中的元素,但对其类型并不关心,这时可以使用通配符来表示未知类型。
例如,我们可以定义一个方法,接受任意类型的集合作为参数:```javapublic void printList(List<?> list) {for (Object obj : list) {System.out.println(obj);}}```在这个方法中,我们使用了通配符"?"来表示未知类型,这样就可以接受任意类型的集合作为参数。
在方法内部,我们可以通过Object 类来操作集合中的元素。
3. 泛型类和泛型方法除了在集合中使用泛型,我们还可以定义泛型类和泛型方法。
泛型类是指具有泛型类型参数的类,可以在类中使用这个类型参数。
第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)
面向对象程序设计 ——泛型与集合
C#中的泛型和泛型集合

C#中的泛型和泛型集合⼀、什么是泛型?泛型是C#语⾔和公共语⾔运⾏库(CLR)中的⼀个新功能,它将类型参数的概念引⼊.NET Framework。
类型参数使得设计某些类和⽅法成为可能,例如,通过使⽤泛型类型参数T,可以⼤⼤简化类型之间的强制转换或装箱操作的过程(下⼀篇将说明如何解决装箱、拆箱问题)。
说⽩了,泛型就是通过参数化类型来实现在同⼀份代码上操作多种数据类型,利⽤“参数化类型”将类型抽象化,从⽽实现灵活的复⽤。
使⽤泛型给代码带来的5点好处:1、可以做⼤限度的重⽤代码、保护类型的安全以及提⾼性能。
2、可以创建集合类。
3、可以创建⾃⼰的泛型接⼝、泛型⽅法、泛型类、泛型事件和泛型委托。
4、可以对泛型类进⾏约束,以访问特定数据类型的⽅法。
5、关于泛型数据类型中使⽤的类型的信息,可在运⾏时通过反射获取。
例⼦:using System;namespace ConsoleApp{class Program{class Test<T>{public T obj;public Test(T obj){this.obj = obj;}}static void Main(string[] args){int obj1 = 2;var test = new Test<int>(obj1);Console.WriteLine("int:" + test.obj);string obj2 = "hello world";var test1 = new Test<string>(obj2);Console.WriteLine("String:" + test1.obj);Console.ReadKey();}}} 输出结果是: int:2 String:hello world 分析: 1、 Test是⼀个泛型类。
集合与泛型

第一个问题:怎么才能了解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// 把⾃⼰的内容塞给输⼊参数,类似于让输⼊参数做消费。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验内容:
(1) 定义一个泛型类Instrument<E 〉,其中包括一个泛型方法void pla y(E x)。
定义两种乐器类:Cello、Violin 可以进行演奏。
定义一个测试类进行测试.
package ex111;
public class Violin{
publicString toString()
{
System、out、println("violin、、、、、、、、、");
return ””;
}
}
package ex111;
public class Test_Main{
public staticvoid main(String[]args){
instrument〈Cello>model = new instrument〈Cello〉();
instrument<Violin〉model1 = new instrument〈Violin〉();
Cello cello= newCello();
Violin violin= new Violin();
model、play(cello);
model1、play(violin);
}
}
packageex111;
classinstrument〈E〉{//泛型类
void play(E x)
{
x、toString();
}
}
package ex111;
publicclass Cello {
public String toString(){
System、out、println("cello、、、、、、、、、");
ﻩreturn ”";
}
}
(2) 输入10 个数字保存到List 中,并按倒序显示出来。
packageex112;
import java、util、ArrayList;
importjava、util、Collections;
import java、util、List;
importjava、util、Scanner;
public class Test{
public static void main(final String[]args) {
ﻩfinal List〈Integer> integers = new ArrayList<Integer>();
ﻩfinal Scanner scanner= newScanner(System、in);
for (inti= 1;i <= 3;i++){
ﻩtry {
ﻩSystem、out、println("输入第" + i + ”个数吧");
final intinput= Integer、parseInt(scanner、next());
integers、add(input);
}
catch(finalThrowable e) {
ﻩSystem、err、println("这不就是个数字,我可就是超级程序");
ﻩi-—;
continue;
}
ﻩ}
//Collections、sort(integers);// 自然排
Collections、reverse(integers);// 倒排
ﻩfor(final Integer integer :integers) {
ﻩSystem、out、println(integer);
ﻩ}
ﻩ}
} System、out、println(integer);
ﻩ}
ﻩ}
}
package ex113;
import java、util、HashMap;
importjava、util、Map;
publicclass Test{
public static void main(String[]args){
Map〈String,Integer〉map=new HashMap<String,Integer>();
Sort s=new Sort();
s、creatMap(map);
s、Sort(map);
}
}
(3) 编写一个程序,把学生名与考试分数录入到Map中,并按分数显示前三名学生得名字。
要求定义Student 类,封装学生名与考试分数2个属性及方法.、TreeMap、TreeSet;
package ex113;
importjava、util、ArrayList;
import java、util、Collection;
import java、util、Collections;
importjava、util、HashSet;
import java、util、List;
import java、util、Map;
import java、util、Set;
public class Student{
private String name;
private int score;
public Student(){
}
public Student(Stringname,intscore){
this、name=name;
this、score=score;
}
public String getName(){
return name;
}
publicvoid setName(String name){
this、name= name;
}
public intgetScore(){
return score;
}
publicvoidsetScore(int score){
this、score=score;
}
}
package ex113;
import java、util、ArrayList;
import java、util、Collection;
import java、util、Collections;
importjava、util、HashSet;
import java、util、List;
import java、util、Map;
importjava、util、Scanner;
import java、util、Set;
publicclass Sort {
public voidcreatMap(Map〈String,Integer>map){
Scanner input=new Scanner(System、in);
System、out、println("请输入学生人数");
intnumber=input、nextInt();
System、out、println("请输入学生姓名与分数:");
for(inti=0;i〈number;i++){
Studentstu=new Student(input、next(),input、nextInt());
map、put(stu、getName(),stu、getScore());
}
}
public voidSort(Map〈String,Integer>map){
Collection<Integer〉score =map、values();
Set〈Integer> set=new HashSet<Integer>();
for(Integers:score)
set、add(s);
List<Integer〉list=new ArrayList(set);
Collections、sort(list);
Collections、reverse(list);
Set<String〉name= map、keySet();
System、out、println("前三名学生得姓名就是:”);
int m=0;
for(Integeri:list){
m++;
if(m<=3){
for(Strings:name)
{
if(i==map、get(s))
System、out、println(”第”+m+”名:"+s);
}
}
}
}
}。