11-泛型集合
泛型集合

什么是泛型集合
Teacher对象 对象
Student对象 对象
允许添加
List<Student>
不允许添加 无需转换类型
Student对象 对象
泛型最常见的用途是创建集合类 泛型集合可以约束集合内的元素类型 典型泛型集合List<T>,Dictionary<K,V> 典型泛型集合 ,
<T>、<K,V>表示该泛型集合中的元素类型 、 表示该泛型集合中的元素类型
使用泛型集合List<T> 使用泛型集合
List<T>的访问方式与 的访问方式与ArrayList相同 的访问方式与 相同
Student stu1 = students[2]; stu1.SayHi(); Students.RemoveAt(0);
使用索引访问, 使用索引访问,无需类型转换 利用索引删除
与哈希表类似存储Key和Value的集合 和 与哈希表类似存储 的集合 利用Dictionary<K,V>存储学员集合 存储学员集合 利用
Dictionary<string,Student> students = new Dictionary<string,Student>(); Key存储 存储String类型 存储 类型 value存储 存储 Student类型 类型
泛型集合无需装箱拆箱操作
泛型的重要性
泛型是未来五年的主流技术之一 解决了很多需要繁琐操作的问题 提供了更好的类型安全性 CLR 支持泛型 后续课程学习泛型接口
Thank you
是否有哈希表那样存储Key和Value形式的泛型集合呢? 形式的泛型集合呢? 是否有哈希表那样存储 哈希表那样存储 和 形式的泛型集合呢
泛型在集合中的作用

泛型在集合中的作用泛型是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. 泛型类和泛型方法除了在集合中使用泛型,我们还可以定义泛型类和泛型方法。
泛型类是指具有泛型类型参数的类,可以在类中使用这个类型参数。
java第10章 集合、泛型、反射和标注

10.2.3 ArrayList类 ArrayList类的定义形式: public class ArrayList<E>
extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable
【例10.8】ArrayList类的使用。Example10_08.java
10.1.2 声明泛型类
泛型类是带有类型参数的类,类中有域和行为。泛型类的定义形式:
class 泛型类名<类型参数表列> {
//类体 }
10.1.2 声明泛型类 定义泛型类的对象:
泛型类名[<实际类型表列>] 对象名=new 泛型类名[<实际类型表列>]([形参表]); 或
泛型类名[<实际类型表列>] 对象名=new 泛型类名[<>]([形参表]);
也可以用“?”代替“实际参数表列”
10.1.2 声明泛型类
【例10.1】设计一个数组类,该类的对象能表示任何类型的对象数组。 Example10_1.java
如果使用泛型,则可以保证每一个数组类对象中的元素都是同一 类型。
【例10.2】定义一个泛型数组类,并创建数组类的对象。 Example10_2.java
10.3.1 反射
2. Constructor类
类型 Class Class
方法 getDeclaringClass() getDeclaringClass()
Class [] getParameterTypes()
反射可以实现程序的动态效果。通过反射,可以在程序运行过程 中知道程序中使用了哪些类及类中的属性和方法。
C#2010 泛型集合

C#2010 泛型集合
泛型集合是System.Collections.Generic命名空间提供的各种成员类实现的集合。
在学习泛型集合时,需要首先了解集合的基本接口,以及System.Collections.Generic 命名空间中包含的集合类型、公共属性和公共方法。
1.泛型集合的类型
在传统的集合中,包含的集合大多只能存储固定数据类型的数据,其主要包括ArrayList、Stack、Queue、Hashtable、BitArray、SortedList以及Dictionary等7种集合。
泛型集合对以上7种集合进行了发展,其主要包括以下几种集合,如表5-1所示。
表5-1 泛型集合的类型
2.泛型集合的分类
在上一小节中介绍了泛型集合的所有类型,其包括了13种集合。
根据这些集合的功能,可以将其分为三大类,如下所示。
●普通集合
普通集合主要用于存储非指定顺序数据的集合,其包括绝大多数集合种类,例如Dictionary、HashSet、KeyedByTypeCollection、LinkedList、List、Queue和Stack 等集合。
●有序集合
有序集合是指根据特殊的顺序进行排序存储的集合,其主要包括SortedDictionary、SortedList和SortedSet等三种集合。
●线程安全集合
线程安全集合的特点是允许开发者在这些集合中安全高效地添加或移除项,而无需在代码中实现同步,其主要包括SynchronizedCollection、SynchronizedKeyedCollection和SynchronizedReadOnlyCollection等三种集合。
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是⼀个泛型类。
数组、集合和泛型

4.1 数组的概念
数组具有以下属性: (1)数组可以是一维、多维或交错的。 (2)数值数组元素的默认值设置为零,而引用元
素的默认值设置为 null。 (3)交错数组是数组的数组,因此,它的元素是
引用类型,初始化为 null。 (4)数组的索引(序号)从零开始:具有 n 个元
素的数组的索引是从 0 到 n-1。 (5)数组元素可以是任何类型,包括数组类型。
第4章 数组、集.4 4.5 4.6 4.7 4.8 4.9
数组的概念 声明、创建数组 初始化数组变量 遍历数组元素 多维数组 交错数组 隐式类型数组 集合与集合接口 泛型集合
27 五月 2020
4.1 数组的概念
在程序设计过程中,经常出现同一种类型的数
数组的遍历一般通过循环实现,利用元素序号的有 规律变化,访问到数组中的每一个元素。
27 五月 2020
4.4 遍历数组元素
数组的遍历除了可以用for形式的循环实现外,还可 以通过while或do while形式的循环完成,此外,还可以 使用foreach形式完成,foreach语句提供一种简单、明 了的方法来循环访问数组的元素。与for相比,foreach只
门课程的多维数组代码为: float[,] studentsGrades = new float[35, 5];
27 五月 2020
4.2 声明、创建数组
对于交错数组,则可以在第一次创建过程中指定外层 数组元素的个数,每个数组元素所对应的数组中所包含元 素的个数可以在后继代码中指定,如以下示例。
", "赵六", "丁七" };
此数组中元素值分别为“张三”、“李四”、“王五”、“赵六 ”和“丁七”,同时,由于在初始化时,只提供了5个元素,所 以数组的大小被确定为5。
泛型 集合 方法
泛型集合方法
嘿,朋友们!今天咱来聊聊“泛型”“集合”还有“方法”这些超厉害的东西!
就比如说泛型吧,你可以把它想象成一个超级灵活的盒子!哇塞,啥都能往里装!比如说,你要创建一个可以放各种不同类型东西的容器,这时候泛型就派上大用场啦!“为啥不直接指定类型呢?”你可能会问。
嘿嘿,那可不一样哦!就好比你有个盒子,今天你可能想装苹果,明天也许就想装橙子啦,泛型就让你的代码变得像孙悟空一样神通广大,能应对各种不同的情况!
再来说说集合。
集合就像是一个大部队,里面有好多好多成员呢!想象一下,你有一堆玩具,把它们放在一个箱子里,这箱子就是集合呀!可以轻松地对这些成员进行各种操作,增删改查,易如反掌!比如你有一群朋友的名单,你就可以用集合来管理他们,多方便!
还有方法呢,方法就像是一个个小魔法!当你需要做一件事情的时候,就调用对应的方法。
好比你饿了,就调用“做饭”这个方法,嘿,马上就能有吃的啦!
有一次,我和小伙伴在写代码的时候,就为了用泛型还是不用泛型争论起来。
我就觉得泛型简直太棒了,那么灵活,以后修改也方便呀!他还不太理解,我就给他详细解释,最后他恍然大悟!“原来泛型这么好啊!”他惊叹道。
总之,泛型、集合和方法,它们就像是代码世界里的黄金搭档,相互配合,让我们的编程之路变得更加精彩!它们能让我们的代码更简洁、更强大、更高效!这难道还不让人兴奋吗?所以呀,大家一定要好好掌握它们,让它们为我们的代码增光添彩!。
Java集合:Collection、List、Set、Map、泛型
Java集合:Collection、List、Set、Map、泛型0.集合的学习思路层⾯1:应⽤层⾯ √可以掌握重点的集合类的使⽤步骤层⾯2:理解层⾯【⾯试前掌握】理解ArrayList的源码理解HashMap的源码掌握:Collection和Map的对⽐List和Set的对⽐ArrayList和Vector的对⽐ArrayList和LinkedList的对⽐HashMap和Hashtable的对⽐Collections和Collection的对⽐⼀、集合的理解和好处1.理解集合:就是⼀种容器,都是⽤于保存⼀组元素2.集合和数组的对⽐:数组的不⾜:数组的长度必须提前指定,⽽且⼀旦指定不能更改数组只能保存相同类型的元素集合:集合在使⽤时,长度不⽤指定,⽽且可以实现⾃动扩容或截断集合没有指定泛型之前,默认保存的是任意类型的元素(Object类型)指定泛型之后,可以保存对应类型的元素⽰例代码:// 使⽤数组--------------------Animal[] animals = new Animal[3];animals[0] = new Animal();animals[1] = new Animal();animals[2] = new Animal();Animal[] newAni = new Animal[animals.length+1];//复制数组//添加新元素animals=newAni;// 使⽤集合--------------------List list= new ArrayList();list.add(new Animal());①创建时如果不指定容量初始值,Hashtable 默认的初始⼤⼩为11,之后每次扩充,容量变为原来的2n+1。
HashMap 默认的初始化⼤⼩为16。
之后每次扩充,容量变为原来的2倍。
②创建时如果给定了容量初始值,那么 Hashtable 会直接使⽤你给定的⼤⼩,⽽ HashMap 会将其扩充为2的幂次⽅⼤⼩(HashMap 中的tableSizeFor()⽅法保证,下⾯给出了源代码)。
C#非泛型集合和泛型集合的超级详解
C#⾮泛型集合和泛型集合的超级详解C# 泛型集合之⾮泛型集合类与泛型集合类的对应:ArrayList对应ListHashTable对应DictionaryQueue对应QueueStack对应StackSortedList对应SortedList第⼀: ArrayList(⾮泛型集合) 与List(泛型集合)ArrayList 是数组的复杂版本。
ArrayList 类提供在⼤多数 Collections 类中提供但不在 Array 类中提供的⼀些功能:1.Array 的容量是固定的,⽽ ArrayList 的容量是根据需要⾃动扩展的。
2.ArrayList 提供添加、插⼊或移除某⼀范围元素的⽅法。
在 Array 中,您只能⼀次获取或设置⼀个元素的值。
3.使⽤ Synchronized ⽅法可以很容易地创建 ArrayList 的同步版本。
⽽ Array 将⼀直保持它直到⽤户实现同步为⽌。
4.ArrayList 提供将只读和固定⼤⼩包装返回到集合的⽅法。
⽽ Array 不提供。
5.Array 提供 ArrayList 所不具有的某些灵活性:a.可以设置 Array 的下限,但 ArrayList 的下限始终为零。
b.Array 可以具有多个维度,⽽ ArrayList 始终只是⼀维的。
c.特定类型(不包括 Object)的 Array 的性能⽐ ArrayList 好,这是因为 ArrayList 的元素属于 Object 类型,所以在存储或检索值类型时通常发⽣装箱和取消装箱。
d.要求⼀个数组的⼤多数情况也可以代之以使⽤ ArrayList。
它更易于使⽤,并且通常具有与 Object 类型的数组类似的性能。
6.Array 位于 System 命名空间中;ArrayList 位于 System.Collections 命名空间中。
ArrayList类对象⽅法:1:Add()向数组中添加⼀个元素,2:Remove()删除数组中的⼀个元素3:(int i)删除数组中索引值为i的元素4:Reverse()反转数组的元素5:Sort()以从⼩到⼤的顺序排列数组的元素6:Clone()复制⼀个数组⼀:ArrayList:ArrayList可以不⽤指定维数可动态赋值赋不同类型值ArrayList arrayList1 = new ArrayList();arrayList1.arrayList1.Add("a");arrayList1.Add(1);arrayList1.Add("b");Response.Write(arrayList1[1]);⼆:Array:Array的容量是固定的先指定⼤⼩在赋值Array arrayList2 = Array.CreateInstance(typeof(string), 6);arrayList2.SetValue("a", 0);arrayList2.SetValue("b", 1);Response.Write(arrayList2.GetValue(1));List泛型集合:泛型集合List<T> 泛型最重要的应⽤就是集合操作,使⽤泛型集合可以提⾼代码重⽤性,类型安全和更佳的性能。
集合框架之泛型详解
集合框架之泛型详解泛型(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();//不需要强制转换}}我们可以看出自定义泛型的可扩展性高。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0
1 0
object
object object object object
可删除元素
2 1
3 2 4 3
通过索引 访问 索引(下标)
可访问单个元素
5
11.1.1 ArrayList的初始化
引入System.Collections命名空间 实例化ArrayList对象
2012-12-30 20
什么是泛型集合
Student对象 Teacher对象 List<Stude nt>
允许添加
不允许添加 无需转换类型
Student对象
泛型最常见的用途是创建集合类 泛型集合可以约束集合内的元素类型 典型泛型集合List<T>,Dictionary<K,V>
<T>、<K,V>表示该泛型集合中的元素类型
21
11.2 何时使用泛型集合
通常情况下,建议您使用泛型集合,因为这样可以获得 类型安全的直接优点而不需要从基集合类型派生并实现 类型特定的成员。此外,如果集合元素为值类型,泛型 集合类型的性能通常优于对应的非泛型集合类型(并优 于从非泛型基集合类型派生的类型),因为使用泛型时 不必对元素进行装箱。 也就说前面提到的非泛型集合都将尽量少用,而使用相 对应的泛型集合
15
0 1 2 3 …
索引
键
Key Key Key
Valu e Value Value
值
键和值一一对应
Key
Key
Value
Value
11.1.2 使用哈希表
students.Add( , scofield); Key Value 添加元素
获取哈希表的元素
… Student stu2 = (Student)students[“周杰杰"]; stu2.SayHi(); 通过key获取元素 需要类型转换 …
ArrayList第一个 对象的索引是0
8
ArrayList.Remove(对象名) //删除指定对象名的对象 ArrayList.RemoveAt(index) //删除指定索引的对象 ArrayList.Clear() //清除集合内的所有元素
students.RemoveAt(0);通过索引删除对象
{ Student stuFor = (Student)students[i]; Console.WriteLine(); } 输出结果
Scofiel d 张靓靓 周杰杰
foreach 方式
通过对象遍历 //遍历 foreach (Object stuo in students) { 类型转换 Student stuForeach = (Student)stuo; Console.WriteLine(); 打印对象的Name属 } 性
通过指定对象删除 students.Remove(zhang); Student leave = (Student)students[0]; 取得删除后的第一个对象 leave.SayHi(); 只剩一个对象 剩余的元素会自动调整索引
9
11.1.1 ArrayList 的遍历
可以使用和数组类似的方 式 for (int i = 0; i < students.Count; i++)
7
ArrayList.Count 获取元素数目
Байду номын сангаас
11.1.1 访问ArrayList元素
(类型) ArrayList[index] //按指定索引(下标)取 得对象 需要类型转换 Student stu1 = (Student)students[0]; 按索引取值 stu1.SayHi(); …
转换为学员对象
2012-12-30
22
11.2 何时使用泛型集合
结构是值类型
13
11.1.2为什么使用HashTable
ArrayList通过索引获取对象
Student stu1 = (Student)Students[0];
索引器通过关键字获取对象
Students[“周杰杰"].SayHi();
能否象索引器那样通过关键字获取该对象呢?
动态可维护长度 C#提供一种集合 可通过关键字检索
10
11.1.1 常见错误
//… students.Add(scofield); students.Add(zhang); students.Add(jay); students.RemoveAt(0); students.RemoveAt(1); students.RemoveAt(2);
索引会自动调整删除 两个元素后,不再有 索引“2“
int Add(Object value) //添加一个对象到集合的 末尾 返回索引
建立班级学员的集合
ArrayList students = new ArrayList(); Student scofield = new Student("Scofield", Genders.Male, 28, "越狱"); 创建学员对象 添加学员 … students.Add(scofield); 连续添加三个学员对象 并获取集合元素的数目
运行这段代码会发生错误?
11
Student scofield = new Student("Scofield", Genders.Male, 28, "越狱狱"); … Student stu2 = new Student("Scofield", Genders.Male, 28, " 定义一个对象与前面的值相同 越狱狱"); //打印集合数目 … students.Remove(stu2); //打印集合数目 … 如果Remove(stu2),能否删除scofield对象? 两次的结果都是3,没有删除,为什么? 在多态章节中我们将试图改变这一现象
11.1 非泛型集合
ArrayList类 Hashtable 类 SortedList类 Queue类 Stack类
使用上面所有类之前,应该首先引入命名空间: using System.Collections;
2012-12-30 4
11.1.1ArrayList是一个可动态维护长度的 集合
18
11.1.4 Queue
public static void Main() { Queue myQ = new Queue(); myQ.Enqueue("Hello"); myQ.Enqueue("World"); myQ.Enqueue("!"); Console.WriteLine("myQ"); Console.WriteLine("\tCount: {0}", myQ.Count); Console.Write("\tValues:"); foreach (Object obj in myQ) Console.Write(" {0}", obj); }
2012-12-30 19
11.1.5 Stack
public static void Main() { Stack myStack = new Stack(); myStack.Push("Hello"); myStack.Push("World"); myStack.Push("!"); Console.WriteLine("myStack"); Console.WriteLine("\tCount: {0}", myStack.Count); Console.Write("\tValues:"); foreach (Object obj in myStack) Console.Write(" {0}", obj); }
12
定义一个学员结构 使用ArrayList存储学员 遍历修改年龄
遍历显示年龄结果是多少?
static void Main(string[] args) public struct Student { Student stu1 = new Student("张三",20); …//初始化代码将对象加入ArrayList集合 { Student stu2 = new Student("李四", 20); Student stu3 = new Student("王五", 20); foreach (Student stu in students)int age public Student(string name, {{ Name = name; Age = age; } ArrayList students = new ArrayList(); Student myStudent public string Name; = (Student)stu; students.Add(stu1); = 60; myStudent.Age public int Age; students.Add(stu2); } } students.Add(stu3); in students) foreach (Student stu { Console.WriteLine(stu.Age); } }
删除哈希表的元素
students.Remove(“周杰杰"); 通过key删除元素 …
16
如何遍历一个哈希表?
不能遍历整个对象,而 是遍历Values
foreach (Object stuo in students.Values) { Student stu = (Student)stuo; Console.WriteLine(); } foreach (string name in students.Keys) { Console.WriteLine(name); } 可以遍历Keys