第11章 集合、泛型(理论)
- 格式:ppt
- 大小:371.50 KB
- 文档页数:30
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是⼀个泛型类。
∙使用Hashtable集合对象存储电脑信息∙员工数据输入第一部分练习1:使用Hashtable对象存储数据项问题编写一个电脑信息类:包括电脑的型号、价格和出厂日期。
程序应根据用户输入的型号来显示相应的电脑信息。
要求使用Hashtable对象存储电脑信息,并且按照型号排列输出,可以输入一个型号,程序检查判断集合中是否存在该型号的电脑,如果存在则显示具体信息。
分析指导教师分析解题思路可以创建一个包含电脑型号、价格和出厂日期的类Computer,电脑的详细信息再作为一个元素存在Hashtable集合中排列输出可以通过下面这种方式输出:(1)创建一个基于控制台的C#应用程序,命名为“HashtableExm”。
(2)创建Computer类。
(3)完整的代码如下:(4)通过从菜单中选择“生成”→“生成解决方案”,来生成该解决方案。
(5)通过从菜单中选择“调试”→“开始执行(不调试)”选项来执行此应用程序。
程序运行效果图指导教师检查学生进度练习2:员工数据输入问题在一个公司的员工管理系统中,通常会通过窗体输入员工的信息,包括员工的编号,姓名,部门,工资等情况。
现不使用数据库技术,使用SortedLis t来存储不同员工的信息,并且,录入的员工都显示在一个列表框中,还可以删除列表框中的员工,但是同时要删除SortedList对象中的员工,因此SortedLis t对象中的数据要与类表框的数据同步。
界面要求如图:员工信息输入在左边的文本框中输入数据以后,单击“添加”按钮可以把数据添加到SortedList对象中,同时姓名添加到右边列表框中;在右边的列表框中选择一个姓名信息,单击下方的“删除”按钮,可以把该员工删除,同时,SortedList对象中的员工信息也被删除。
推荐步骤:(1)先创建一个员工类Employee来保存员工属性。
(2)创建一个窗体,对照界面,添加相应的控件及其事件。
(3)窗体类完整的代码如下:(4)生成和执行此应用程序,效果如下图所示:程序运行结果图。
第一个问题:怎么才能了解JAVA集合类?集合类是什么?数组是集合的一种,是集合的一个子集,你理解了数组就理解了集合.理解集合类集合类存放于java.util包中。
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
集合类型主要有3种:set(集)、list(列表)和map(映射)。
(1)集集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。
对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象。
集也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。
它实现的是SortedSet接口,也就是加入了对象比较的方法。
通过对集中的对象迭代,我们可以得到一个升序的对象集合。
(2)列表列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。
列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。
关于实现列表的集合类,是我们日常工作中经常用到的,将在后边的笔记详细介绍。
(3)映射映射与集或列表有明显区别,映射中每个项都是成对的。
映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。
关键字应该是唯一的。
关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。
理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。
集合类简介java.util中共有13个类可用于管理集合对象,它们支持集、列表或映射等集合,以下是这些类的简单介绍集:1. HashSet:使用HashMap的一个集的实现。
泛型知识点总结泛型是Java语言中的一项重要特性,它允许我们在编写代码时使用一种通用的数据类型来代替具体的数据类型,从而提高代码的复用性、可读性和安全性。
本文将重点总结泛型在Java中的基本概念、用法和注意事项,帮助读者深入理解并合理运用泛型。
1.泛型的基本概念泛型是一种在编译时检查和验证数据类型的技术,它可以让我们在编写代码时使用一种通用的数据类型来代替具体的数据类型。
泛型的引入使得编写更加通用且类型安全的代码成为可能,从而提高了代码的可读性和可维护性。
泛型的基本概念主要涉及以下几个方面:1)泛型类(Generic Class):使用泛型定义的类,其成员变量、方法参数和返回值均可以使用泛型类型。
例如:`ArrayList<T>`、`Map<K, V>`等。
2)泛型接口(Generic Interface):使用泛型定义的接口,其方法参数和返回值均可以使用泛型类型。
例如:`Comparable<T>`、`List<E>`等。
3)泛型方法(Generic Method):在普通类或非泛型类中定义的使用泛型的方法。
例如:`public <T> T get(int index)`。
4)泛型通配符(Generic Wildcard):用于表示未知类型的通配符,包括`<? extends T>`、`<? super T>`等。
例如:`List<? extends Number>`。
2.泛型的用法泛型在Java中的用法主要有以下几种:1)定义泛型类泛型类是使用泛型定义的类,其中的成员变量、方法参数和返回值均可以使用泛型类型。
定义泛型类的语法如下:```javapublic class MyClass<T> {private T data;public T getData() {return data;}public void setData(T data) {this.data = data;}}```2)定义泛型接口泛型接口是使用泛型定义的接口,其中的方法参数和返回值均可以使用泛型类型。
集合框架之泛型详解泛型(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();//不需要强制转换}}我们可以看出自定义泛型的可扩展性高。