9个回答
展开全部
泛型。即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型是在C#2.0引入的。泛型(Genericity)的字面意思是指具有在多种数据类型上皆可操作的含意,与模板有些相似。
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。
优点:
泛型方法可以出现在泛型或非泛型类型上。需要注意的是,并不是只要方法属于泛型类型,或者甚至是方法的形参的类型是封闭类型的泛型参数,就可以说方法是泛型方法。只有当方法具有它自己的类型参数列表时,才能称其为泛型方法。在下面的代码中,只有方法 G 是泛型方法。
展开全部
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName("java.lang.String");
泛型还有接口、方法等等,内容很多,需要花费一番功夫才能理解掌握并熟练应用。
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName("java.lang.String");
泛型还有接口、方法等等,内容很多,需要花费一番功夫才能理解掌握并熟练应用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在使用ArrayList这样的非泛型集合的过程中,要进行装箱和拆箱操作,会有比较大的性能损失,
而使用泛型集合就没有这样的问题。
现做一简单测试如下:
//用来记录开始和结束的时间
DateTime startTime = new DateTime();
DateTime endTime = new DateTime();
//定义集合类型ArrayList的一个实例
ArrayList list = new ArrayList();
//取得当前时间
startTime = DateTime.Now;
//★★★★★★★★①使用ArrayList类★★★★★★★★
//ArrayList的add方法的参数是Object型,
//当我们把int型作为参数传入的时候需要做装箱操作
//装箱操作将值类型转化为Object类型
for (int i = 0; i < 1000000; i++)
{
list.Add(i);
}
int iCount = 0;
//当我们使用int型的时候需要做拆箱操作操作
//拆箱操作将应用类型转化为Object类型,拆箱过程要做大量的工作
foreach (int i in list)
{
iCount += 1;
}
Console.WriteLine("使用ArrayList的结果 : {0}", iCount.ToString());
//取得结束时间并计算差值
endTime = DateTime.Now;
TimeSpan ts = endTime - startTime;
Console.WriteLine("使用ArrayList的耗时 :" + ts.TotalMilliseconds);
//★★★★★★★★②使用泛型类★★★★★★★★
//使用List的泛型定义List<T>,int类型在编译器动态生成的类中本替换为int型
//执行过程中不再执行装箱拆箱操作
List<int> list2 = new List<int>();
startTime = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
list2.Add(i);
}
iCount = 0;
foreach (int i in list2)
{
iCount += 1;
}
Console.WriteLine("使用泛型的结果 : {0}", iCount.ToString());
endTime = DateTime.Now;
ts = endTime - startTime;
Console.WriteLine("使用泛型的耗时 :" + ts.TotalMilliseconds);
//显示三次结果如下
/* 第一次
* 使用ArrayList的耗时 :92
* 使用泛型的耗时 :25
*
* 第二次
* 使用ArrayList的耗时 :96
* 使用泛型的耗时 :22
*
* 第三次
* 使用ArrayList的耗时 :90
* 使用泛型的耗时 :22
*
* 由此可以明显看出两者的差别
* 这里仅仅是时间上的,并不包括对内存消耗的统计
*
* ※但是也要注意到差别的单位是毫秒,
* 我这里只想说明用泛型是有好处的,
* 但也不可过分追求程序的孰优孰劣,
* 总之要把握好这个度,适合自己的才是最好的
* O(∩_∩)O~
*/
Console.Read();
而使用泛型集合就没有这样的问题。
现做一简单测试如下:
//用来记录开始和结束的时间
DateTime startTime = new DateTime();
DateTime endTime = new DateTime();
//定义集合类型ArrayList的一个实例
ArrayList list = new ArrayList();
//取得当前时间
startTime = DateTime.Now;
//★★★★★★★★①使用ArrayList类★★★★★★★★
//ArrayList的add方法的参数是Object型,
//当我们把int型作为参数传入的时候需要做装箱操作
//装箱操作将值类型转化为Object类型
for (int i = 0; i < 1000000; i++)
{
list.Add(i);
}
int iCount = 0;
//当我们使用int型的时候需要做拆箱操作操作
//拆箱操作将应用类型转化为Object类型,拆箱过程要做大量的工作
foreach (int i in list)
{
iCount += 1;
}
Console.WriteLine("使用ArrayList的结果 : {0}", iCount.ToString());
//取得结束时间并计算差值
endTime = DateTime.Now;
TimeSpan ts = endTime - startTime;
Console.WriteLine("使用ArrayList的耗时 :" + ts.TotalMilliseconds);
//★★★★★★★★②使用泛型类★★★★★★★★
//使用List的泛型定义List<T>,int类型在编译器动态生成的类中本替换为int型
//执行过程中不再执行装箱拆箱操作
List<int> list2 = new List<int>();
startTime = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
list2.Add(i);
}
iCount = 0;
foreach (int i in list2)
{
iCount += 1;
}
Console.WriteLine("使用泛型的结果 : {0}", iCount.ToString());
endTime = DateTime.Now;
ts = endTime - startTime;
Console.WriteLine("使用泛型的耗时 :" + ts.TotalMilliseconds);
//显示三次结果如下
/* 第一次
* 使用ArrayList的耗时 :92
* 使用泛型的耗时 :25
*
* 第二次
* 使用ArrayList的耗时 :96
* 使用泛型的耗时 :22
*
* 第三次
* 使用ArrayList的耗时 :90
* 使用泛型的耗时 :22
*
* 由此可以明显看出两者的差别
* 这里仅仅是时间上的,并不包括对内存消耗的统计
*
* ※但是也要注意到差别的单位是毫秒,
* 我这里只想说明用泛型是有好处的,
* 但也不可过分追求程序的孰优孰劣,
* 总之要把握好这个度,适合自己的才是最好的
* O(∩_∩)O~
*/
Console.Read();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1 : 非泛型类容器来说,该容器的元素类型是 object ,使用方便,无须指定具体的元素类型。但是这种使用上的方便带来了惨重的性能上的损失,因为,我们每次插入一个元素就要经过一次 “ 装箱 ” 操作,每次访问一个元素就要经过一次 “ 拆箱 ” 操作。
ArrayList , Hashtable , Queue , Stack , SortedList , CollectionBase , ReadOnlyCollectionBase 。
2 : “ 泛型 ” 容器就不一样了,这种类型的容器和 C++ 里的容器 ( 比如 vector 、 map 、 list 等 ) 一样,在使用的时候都要指定元素类型,并且在 “ 编译阶段 ” 完成类型制定,而且也避免了 “ 装箱、拆箱、类型转换 ” 等无谓的性能损失。
ArrayList , Hashtable , Queue , Stack , SortedList , CollectionBase , ReadOnlyCollectionBase 。
2 : “ 泛型 ” 容器就不一样了,这种类型的容器和 C++ 里的容器 ( 比如 vector 、 map 、 list 等 ) 一样,在使用的时候都要指定元素类型,并且在 “ 编译阶段 ” 完成类型制定,而且也避免了 “ 装箱、拆箱、类型转换 ” 等无谓的性能损失。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个就别管代码了,直接从语义上讲。
“型”------就是指类型。
而“泛”--相对宽泛。比如泛太平洋敌区。也就说不是那么严格意义上的东西
所以两个字和起来就是“不那么严格类型定义”
我们知道c#是强类型语言。每个操作都有严格的类型规定。但是东西太严格了,难免教条和僵硬。所以在net2 就引入了泛型。
为啥要引入泛型?道理很简单,因为我们要复用一些抽象逻辑。OO虽然有继承,多态,重载,甚至还有接口,但是所有操作都必须在同一个谱系里面。如果是要复用不同体系的逻辑,非泛型就显得死板很多了。
这个我可以举个列子,“排序”
排序是一个可复用的逻辑。我们在c#里可以用Array.sort()排序,也可以用linq 的orderby
net1.0 时候Array.sort 就是一个非泛型的排序,用他排序就要求列表必须处于具有可排序接口这个谱系下的对象,假设对象不在这个谱系下,你必须临时扩展一个带有可排序接口的比较对象出来,这方法才能正常运作
而net3.0后出的linq.orderby 则是一个泛型排序方法。用这个方法排序,并不要求对象必须具有那个排序接口。int可以排序,string可以排序,人可以比较身高也可比较美丑。
“型”------就是指类型。
而“泛”--相对宽泛。比如泛太平洋敌区。也就说不是那么严格意义上的东西
所以两个字和起来就是“不那么严格类型定义”
我们知道c#是强类型语言。每个操作都有严格的类型规定。但是东西太严格了,难免教条和僵硬。所以在net2 就引入了泛型。
为啥要引入泛型?道理很简单,因为我们要复用一些抽象逻辑。OO虽然有继承,多态,重载,甚至还有接口,但是所有操作都必须在同一个谱系里面。如果是要复用不同体系的逻辑,非泛型就显得死板很多了。
这个我可以举个列子,“排序”
排序是一个可复用的逻辑。我们在c#里可以用Array.sort()排序,也可以用linq 的orderby
net1.0 时候Array.sort 就是一个非泛型的排序,用他排序就要求列表必须处于具有可排序接口这个谱系下的对象,假设对象不在这个谱系下,你必须临时扩展一个带有可排序接口的比较对象出来,这方法才能正常运作
而net3.0后出的linq.orderby 则是一个泛型排序方法。用这个方法排序,并不要求对象必须具有那个排序接口。int可以排序,string可以排序,人可以比较身高也可比较美丑。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询