泛型

自学Java之day13_Collection、泛型

老子叫甜甜 提交于 2019-12-30 00:16:52
Collection集合 集合概述 集合 :集合是java中提供的一种容器,可以用来存储多个数据 集合和数组的区别 数组的长度是固定的。集合的长度是可变的。 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储 。 集合框架 JAVASE提供了满足各种需求的API,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活应用。 集合按照其存储结构可以分为两大类,分别是单列集合 java.util.Collection 和双列集合 java.util.Map。 Collection: 单列集合类的根接口 用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List 和 java.util.Set 。其中, List 的特点是元素有序、元素可重复。 Set 的特点是元素无序,而且不可重复。 List 接口的主要实现类有 java.util.ArrayList 和 java.util.LinkedList , Set 接口 的主要实现类有 java.util.HashSet 和 java.util.TreeSet 。从上面的描述可以看出JDK中提供了丰富的集合类库,为了便于初学者进行系统地学习

泛型的定义以及set map接口

此生再无相见时 提交于 2019-12-29 14:48:47
泛型 ( generic ) 泛型的概念 泛型允许开发者在强类型程序设计语言( java )编写代码时定义一些可变部分,这些部分在使用前必须作出指明。 泛型 的擦除 泛型 在运行时已经被擦除了 。 泛型 的 应用 泛型类 当 一个类中 属性 的数据类型不确定时, 具体 是什么类型由使用 者 来确定时,使用泛型。 泛型 类的形式 泛型 方法 当 一个方法的参数 类型 不确定时, 具体 是什么类型由使用 者 来确定 , 可以考虑使用泛型方法。 形式 : public <T> void xxx(T a) { System. out .println(a); } 泛型 方法在调用时确定 ( 指明 ) 类型 。 泛型 方法在一定程度上优化了 方法 重载。 多个 同类型的泛型 / 多个同类型的泛型 /*public <A> void print(A a) { System.out.println(a); } public <A> void print(A a,A b) { System.out.println(a); System.out.println(b); }*/ public <A> void print(A... a ) { System. out .println(a); } A… a 表示方法 可以接受多个参数。 当调用 方法传递多个参数 时 ,多个参数被放到 a 数组中 ,a

C#泛型方法解析

元气小坏坏 提交于 2019-12-29 10:31:48
C#2.0引入了泛型这个特性,由于泛型的引入,在一定程度上极大的增强了C#的生命力,可以完成C#1.0时需要编写复杂代码才可以完成的一些功能。但是作为开发者,对于泛型可谓是又爱又恨,爱的是其强大的功能,以及该特性带来的效率的提升,恨的是泛型在复杂的时候,会呈现相当复杂的语法结构。这种复杂不仅是对于初学者,对于一些有开发经验的.NET开发者,也是一个不那么容易掌握的特性。 接下来我们来了解一下C#2.0加入的特性:泛型。 一.泛型的基本特性概述: 在实际项目开发中,任何API只要将object作为参数类型和返回类型使用,就可能在某个时候涉及强类型转换。提到强类型转换,估计很多开发者第一反应就是“效率”这个次,对于强类型的利弊主要看使用者使用的环境,天底下没有绝对的坏事,也没有绝对的好事,有关强类型的问题不是本次的重点,不做重点介绍。 泛型是CLR和C#提供的一种特殊机制,支持另一种形式的代码重用,即“算法重用”。泛型实现了类型和方法的参数化,泛型类型和方法也可以让参数告诉使用者使用什么类型。 泛型所带来的好处:更好的编译时检查,更多在代码中能直接表现的信息,更多的IDE支持,更好的性能。可能有人会疑问,为什么泛型会带来这么多好处,使用一个不能区分不同类型的常规API,相当于在一个动态环境中访问那个API。 CLR允许创建泛型引用和泛型值类型,但是不允许创建泛型枚举

跟小静读CLR via C#(16)--泛型

旧时模样 提交于 2019-12-29 10:31:31
泛型就像是一个模板,常常定义一些通用的算法,具体调用时再替换成实际的数据类型,提高了代码的可重用性。 一、初识泛型 1. 简单实例 以最常用的FCL中的泛型List<T >为例: static void Main(string[] args) { List<int> num = new List<int>(); num.Add(1); num.Add(3); int num1 = num[0]; int num2 = num[1]; } 尖括号中的T是不确定的数据类型,叫做 类型参数 ,一般规定以字母T开头,可以是TKey, TValue都可以。而调用时指定的具体类型叫做 类型实参 。 查看一下IL代码: 类型名List是以“`”加数字结尾的。数字表示类型的 元数 ,也就是需要指定具体类型的参数个数。 泛型是类型安全的。如果用“num.Add("a");”会发生编译错误; 泛型可以提高算法的可重用性,而且从例子中看出int类型并没有进行装箱拆箱操作,相比将所有类型转换为Object的方式而言,提高了程序的性能。 为泛型变量设置默认值时常使用 default 关键字进行,T temp=default(T)。如果T为引用类型,则temp为null;如果T为值类型,则temp设为0值. 2. 开放类型与封闭类型: 开放类型 :具有泛型参数的类型是开放类型,如List<T>

C#泛型详解

余生颓废 提交于 2019-12-29 10:31:18
这篇文章主要讲解C#中的泛型,泛型在C#中有很重要的地位,尤其是在搭建项目框架的时候。 一、什么是泛型 泛型是C#2.0推出的新语法,不是语法糖,而是2.0由框架升级提供的功能。 我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样。但我们没有办法,只能分别写多个方法来处理不同的数据类型。这个时候,那么问题来了,有没有一种办法,用同一个方法来处理传入不同种类型参数的办法呢?泛型的出现就是专门来解决这个问题的。 二、为什么使用泛型 先来看下面一个例子: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MyGeneric { public class CommonMethod { /// <summary> /// 打印个int值 /// /// 因为方法声明的时候,写死了参数类型 /// 已婚的男人 Eleven San /// </summary> /// <param name="iParameter"></param> public static void ShowInt(int iParameter) { Console.WriteLine("This

泛型类(C# 编程指南)

亡梦爱人 提交于 2019-12-29 02:37:00
泛型类(C# 编程指南) 泛型类封装不是特定于具体数据类型的操作。泛型类最常用于集合,如链接列表、哈希表、堆栈、队列、树等,其中,像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关。 对于大多数需要集合类的方案,推荐的方法是使用 .NET Framework 2.0 类库中所提供的类。有关使用这些类的更多信息,请参见 .NET Framework 类库中的泛型(C# 编程指南) 。 一般情况下,创建泛型类的过程为:从一个现有的具体类开始,逐一将每个类型更改为类型参数,直至达到通用化和可用性的最佳平衡。创建您自己的泛型类时,需要特别注意以下事项: 将哪些类型通用化为类型参数。 一般规则是,能够参数化的类型越多,代码就会变得越灵活,重用性就越好。但是,太多的通用化会使其他开发人员难以阅读或理解代码。 如果存在约束,应对类型参数应用什么约束(请参见 类型参数的约束(C# 编程指南) )。 一个有用的规则是,应用尽可能最多的约束,但仍使您能够处理需要处理的类型。例如,如果您知道您的泛型类仅用于引用类型,则应用类约束。这可以防止您的类被意外地用于值类型,并允许您对 T 使用 as 运算符以及检查空值。 是否将泛型行为分解为基类和子类。 由于泛型类可以作为基类使用,此处适用的设计注意事项与非泛型类相同。有关从泛型基类继承的规则,请参见下面的内容。

详解C#泛型(二)

我是研究僧i 提交于 2019-12-29 02:36:48
  一、前面两篇文章分别介绍了定义泛型类型、泛型委托、泛型接口以及声明泛型方法:    详解C#泛型(一)    详解C#泛型(二)   首先回顾下如何构建泛型类: public class MyClass<T> { public void MyFunc() { //… } }   其中,尖括号<>中的T代表的是该泛型类的类型参数,在使用时可以指定其类型,例如,指定类型参数为整数类型,创建封闭式构造类MyClass<int>: MyClass<int> myObj = new MyClass<int>();   二、这一篇我们了解一下泛型的作用机制,泛型是运行时起作用的一套机制,根据运行时类型参数被指定为值类型还是引用类型其使用方式有所不同:   1.当类型参数被指定为值类型时,会在第一次指定该特定值类型的类型时创建该类型唯一的专用化泛型类型,泛型类型中的类型参数会被替换为相应的值类型;   ※此时,运行时会创建不同封闭式构造类型的类型信息对象,它们的类型句柄指向不同的类型信息对象,不同封闭式构造类型的方法句柄也指向不同的方法信息对象;   2.当类型参数被指定为引用类型时,会在第一次指定任意引用类型时创建一个通用化泛型类型,泛型类型中的类型参数会被替换为该引用类型,并在之后每次指定为引用类型时重用该泛型类型并修改其中类型参数的类型;造成这种差异的原因可能在于所有的引用大小相同;

C# 泛型

南笙酒味 提交于 2019-12-29 02:36:31
泛型(generic)是C#语言.0和通用语言运行时(CLR)的一个新特性。泛型为.NET框架引入了类型参数(type parameters)的概念。类型参数使得设计类和方法时,不必确定一个或多个具体参数,具体参数可延迟到客户代码中声明、实现。这意味着使用泛型的类型参数T, 写一个类MyList<T>,客户代码可以这样调用:MyList<int>, MyList<string>或 MyList<MyClass> 。这避免了运行时类型转换或装箱操作的代价和风险。 ++++++++++++++++++++++++++++++++++++ + 概述: 泛型类和泛型方法兼复用性、类型安全和高效率于一身,是与之对应的非泛型的类和方法所不及。 泛型广泛用于 容器(collections) 和对容器操作的方法中。 .NET框架.0的类库提供一个新的命名空间System.Collections.Generic,其中包含了一些新的基于泛型的容器类。要查找新的泛型容器类(collection classes)的示例代码,请参见基础类库中的泛型。 当然,你也可以创建自己的泛型类和方法,以提供你自己的泛化的方案和设计模式,这是类型安全且高效的。下面的示例代码以一个简单的泛型链表类作为示范。(多数情况下,推荐使用由.NET框架类库提供的List<T>类,而不是创建自己的表。)类型参数T在多处使用

运行库中的泛型

≯℡__Kan透↙ 提交于 2019-12-29 02:36:09
将泛型类型或方法编译为 Microsoft 中间语言 (MSIL) 时,它包含将其标识为具有类型参数的元数据。泛型类型的 MSIL 的使用因所提供的类型参数是值类型还是引用类型而不同。 第一次用值类型作为参数来构造泛型类型时,运行库会创建专用泛型类型,将提供的参数代入到 MSIL 中的适当位置。对于每个用作参数的唯一值类型,都会创建一次专用泛型类型。 例如,假设您的程序代码声明了一个由整数构造的堆栈,如下所示: Stack < int > stack; 在此位置,运行库生成 Stack <T> 类的专用版本,并相应地用整数替换其参数。现在,只要程序代码使用整数堆栈,运行库就会重用生成的专用 Stack<T> 类。在下面的示例中,创建了整数堆栈的两个实例,它们共享 Stack<int> 代码的单个实例: Stack < int > stackOne = new Stack < int > (); Stack < int > stackTwo = new Stack < int > (); 但是,如果在程序代码中的其他位置创建了另一个 Stack<T> 类,这次使用不同的值类型(如 long 或用户定义的结构)作为其参数,则运行库会生成泛型类型的另一版本(这次将在 MSIL 中的适当位置代入 long )。由于每个专用泛型类本身就包含值类型,因此不再需要转换。 对于引用类型

Java语言与C++语言的差异总结

为君一笑 提交于 2019-12-28 19:38:43
Java的设计者曾说过,设计这门语言的灵感主要来自于C++。 世上先有C++,然后才有Java,整个Java语言的发展历史就是一部对C++的填坑史。所以在Java语言学习过程中,将其与C++语言对比是一件有意义的事情。通过这些对比,我们能够了解到Java语言相对于C++语言有哪些改进,能带给我们哪些进步,这样对于更加深入理解这两种语言是大有裨益的。 下面我总结一下Java语言与C++语言的各种差异。 1、Java用来操纵对象的引用可以先初始化再指向对象,而C++的引用必须在初始化时就指向对象。 2、Java类除static和final外其他函数定义默认是虚函数,而C++用virtual关键字定义定义函数才是虚函数。 3、Java有一套继承自object类型的单根继承结构,而C++没有标准库内置的类继承体系。 4、Java只能通过new在堆上创建对象,基本类型除外,而C++除了new还是可以创建全局对象或者栈对象。 5、Java有自带垃圾回收机制,不用关心对象的内存释放,而C++需要手动释放通过new创建的对象。 6、Java数组成员能初始化默认值null,提供未初始化的访问和越界访问保护,而C++不提供这个机制。 7、Java局部作用域定义的变量不能隐藏更大作用域定义的变量,而C++可以隐藏。 8、Java类的基本类型成员变量可以自动初始化为默认值