11-泛型集合
- 格式:ppt
- 大小:1.17 MB
- 文档页数:35
泛型在集合中的作用泛型是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. 泛型类和泛型方法除了在集合中使用泛型,我们还可以定义泛型类和泛型方法。
泛型类是指具有泛型类型参数的类,可以在类中使用这个类型参数。
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#语⾔和公共语⾔运⾏库(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集合: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# 泛型集合之⾮泛型集合类与泛型集合类的对应: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.程序可读性提高:泛型代码可以提高程序的可读性和可维护性,因为代码中的类型信息更明确。
二、使用泛型1.声明泛型类在 Java 中,我们可以通过在类名后面使用尖括号插入类型参数来声明泛型类。
例如:```public class GenericClass<T>private T value;public T getValureturn value;}public void setValue(T value)this.value = value;}```上面的代码中,`GenericClass` 是一个泛型类,`<T>` 表示类型参数,可以在类的其他成员中使用这个类型参数。
2.使用泛型类使用泛型类时,需要通过实际类型替换类型参数。
例如:```GenericClass<Integer> genericClass = new GenericClass<>(;genericClass.setValue(10);System.out.println(genericClass.getValue(); // 输出 10```在上面的代码中,`GenericClass<Integer>` 表示实际的类型参数是`Integer`,所以 `setValue` 方法只接受 `Integer` 类型的参数。
java笔记⼗三——集合的遍历及泛型⼀、Collections类Collections类是单列集合Collection的⼯具类,Collections⼯具类为集合提供了许多静态⽅法,常⽤⽅法如下⼆、迭代器Iterator在对集合进⾏迭代的过程中,不要进⾏增删操作对ArrayList集合中的元素进⾏修改或删除时,先遍历找到对应元素的索引,遍历结束以后根据索引进⾏修改或删除迭代器Iterator是⽤来遍历Collection集合的,Map集合不能直接使⽤Iterator迭代器遍历集合元素。
⾃定义对象并迭代测试类:public static void main(String[] args) {Person p1 = new Person("张三", 20);Person p2 = new Person("李四", 21);Person p3 = new Person("王五", 22);Person p4 = new Person("赵六", 23);ArrayList<Person> list = new ArrayList<>();list.add(p1);list.add(p2);list.add(p3);list.add(p4);Iterator<Person> iterator = list.iterator();while (iterator.hasNext()) {Person per = iterator.next();System.out.println(per);}}Person.javapublic class Person {private String name;private int age;public Person() {}public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person(String name, int age) { = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}}三、Map集合的遍历3.1 keySet()遍历实现思想:1、Map接⼝定义了⽅法 keySet() ,可以利⽤这个⽅法获取Map集合中所有键的Set集合。
泛型集合的序列化和反序列化1.泛型集合的序列化⽐较简单,和普通对象没有两样,但是.net FrameWork⾥⾯没有提供现成的API,这是⼀个我⾃⼰封装的⼀个⽅法,采⽤了object作为被序列化对象的参数类型,亦即可以接受任意类型的对象,并通过调⽤GetType⽅法获得被序列化对象的转换前的类型(或者说是被序列化对象的真正类型,object在c#⾥是所有对象的基类),牺牲了⼀点点类型转换带来的性能损失,但是带来了很好的封装性,易⽤性。
我简单了做了个对⽐测试,写了⼀个以具体类型作为参数的序列化⽅法,(⽅法内代码⼀模⼀样),序列化⼀个简单对象,重复执⾏1万次,相差⼤概10毫秒级,只要你对性能要求不是特别苛刻,我觉得都适合采⽤。
///<summary>///序列化成xml字符串///</summary>///<param name="obj"></param>///<returns>序列化后的字符串</returns>public string Serialize(object obj){XmlSerializer xs = new XmlSerializer(obj.GetType());using (MemoryStream ms = new MemoryStream()){System.Xml.XmlTextWriter xtw = new System.Xml.XmlTextWriter(ms, System.Text.Encoding.UTF8);xtw.Formatting = System.Xml.Formatting.Indented;xs.Serialize(xtw, obj);ms.Seek(0, SeekOrigin.Begin);using (StreamReader sr = new StreamReader(ms)){string str = sr.ReadToEnd();xtw.Close();ms.Close();return str;}}}调⽤代码举例如下:public class classA{public string name { get; set; }public string address { get; set; }}…List<classA> list = new List<classA>() { new classA() { name = "1", address = "2" }, new classA { name = "2", address = "3" } };string s = Serialize(list);s = Serialize(new classA() { name = "1", address = "2" });2.现在重点来说说集合对象的反序列化。
List泛型集合对元素的类型有了确切的定义,跟数组类似,在声明集合的时候就已经确定了⾥⾯元素的类型泛型集合的各种⽅法跟ArrayList等集合的⽤法是⼀样的//创建泛型集合对象List<int> list = new List<int>();using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace List泛型集合{class Program{static void Main(string[] args){//创建泛型集合对象List<int> list = new List<int>();list.Add(1);list.Add(2);list.Add(3);list.AddRange(new int[] { 1, 2, 3, 4, 5, 65, 7, 8 });list.AddRange(list);//这⾥⼜添加了⾃⼰,我说怎么重复两遍呢//list泛型集合可以转换成数组int[] nums = list.ToArray();List<int> list2= nums.ToList();List<string> str = new List<string>();string[] str2 = str.ToArray();//创建⼀个泛型集合,类型string,可以转换成string类型的数组,⽤⼀个字符串数组来接收char[] chs = new char[] { '1', '2', '4', '5' };List<char> chs2= chs.ToList();//⽤⼀个char类型的list集合来接收经过转换的char类型数组for (int i = 0; i < chs2.Count ; i++){Console.WriteLine(chs2[i]);}for (int i = 0; i < list.Count ; i++){Console.WriteLine(list[i]);}Console.ReadKey();}}}。
Java泛型集合所谓泛型就是允许在定义类、接⼝时指定类型形参,这个类型形参将在声明变量、创建对象时确定。
增加了泛型⽀持后的集合,完全可以记住集合中元素的类型,并可以在编译时检查集合中元素的类型。
即解决⼀些安全问题,同时还可以让代码变得更加简洁。
⼀、使⽤泛型泛型的格式:通过<>来定义要操作的引⽤数据类型创建⼀个只存放字符串的对象,代码如下:package com.csu.test1;import java.util.ArrayList;import java.util.List;public class GenericDemo {public static void main(String[] args) {//创建⼀个只能保存字符串的ArrayList集合List<String> strList=new ArrayList<String>();//如果存放其他类型的对象时会出现编译错误strList.add("chaofn");System.out.println(strList);}}使⽤泛型的好处:1、将运⾏时期出现的ClassCastExcpetion , 转移到了编译时期。
⽅便于程序员解决问题,让运⾏时期问题减少。
2、避免了强制转换的⿇烦。
如下代码可以解释这⼀点:package com.csu.test1;import java.util.ArrayList;import java.util.Iterator;import java.util.List;class StringDemo {String name;public StringDemo(String name){=name;}}public class GenericDemo {public static void main(String[] args) {//创建⼀个只能保存字符串的ArrayList集合List ls=new ArrayList();//如果存放其他类型的对象时会出现编译错误ls.add(new StringDemo("chaofn01"));ls.add(new StringDemo("chaofn02"));ls.add(new StringDemo("chaofn03"));ls.add(new StringDemo("chaofn04"));ls.add(1000);MyIterator(ls);}public static void MyIterator(List ls){Iterator it=ls.iterator();while(it.hasNext()){StringDemo s=(StringDemo) it.next();System.out.println();}}}运⾏结果:chaofn01chaofn02Exception in thread "main" ng.ClassCastException: ng.Integer cannot be cast to com.csu.test1.StringDemoat com.csu.test1.GenericDemo.MyIterator(GenericDemo.java:34)at com.csu.test1.GenericDemo.main(GenericDemo.java:27)chaofn03chaofn04在调⽤MyIterator(List ls) ⽅法时会发⽣ClassCastException 异常。