第11章 集合和泛型

合集下载

泛型集合

泛型集合
4/5
static void Main(string[] args) { string content = “I hope you are enjoying your state here!”; Dictionary<char, int> dic = new Dictionary<char, int>(); for(int i = 0; i < content.Length; i++) { if(dic.ContainsKey(content[i])) { dic[content[i]]++; } else { dic.Add(content[i], 1); } } } 注: -> 循环字符串,遍历每一个字符. 判断每个字符是否在集合 dic 中 -> 若果存在,访问该数据 dic[content[i]],并将其自增 -> 若不存在,则将该字符加进去,并设定该字符个数开始为 1,dic.Add(content[i], 1) -> 判断是否存在使用 ContainsKey 方法,返回 bool 表示是否存在 -> 字典集 Dictionary<TKey, TValue>中没有 Contains 方法,只有 ContainsKey 方法 3、遍历集合,将统计的结果打印出来 static void Main(string[] args) { string content = “I hope you are enjoying your state here!”; Dictionary<char, int> dic = new Dictionary<char, int>(); for(int i = 0; i < content.Length; i++) { if(dic.ContainsKey(content[i])) { dic[content[i]]++; } else { dic.Add(content[i], 1); } } foreach(KeyValuePair<char, int> item in dic) { Console.WriteLine(“字符{0}出现{1}次”, item.Key, item.Value); } } 注: -> 遍历使用 foreach 循环,临时变量类型为 KeyValuePair<TKey, TValue> -> 根据集合的类型,临时数据使用 KeyValuePair<char, int> item Dictionary<TKey, TValue>的常见方法 可见 Dictionary<TKey, TValue>的使用与 Hashtabel 几乎相同, 那么学习期使用, 也就剩下 那些常见的方法了. 下面看看 Dictionary<TKey,TValue>的常用方法. 清空数据方法 public void Clear(); 判断数据存在 public bool ContainsValue(TValue value); 移除指定元素 public bool Remove(TKey key); 有了泛型集合以后,ArrayList 与 Hashtable 都可以被之取代,而替换为泛型集合了.

第11章泛型与集合

第11章泛型与集合

Map接口操作
➢ Map接口基本操作: 6.1.1 public V put(K key, V value) public V get(Object key) public V remove(Object key) public void clear() public Set<K> keySet() public Collection<V> values()
用Set对象实现集合操作
➢ 使用Set对象的批量操作方法,可以实现标准集合代数运算。 6.1.1
➢ 假设s1和s2是Set对象,下面的操作可实现相关的集合运算。
s1.addAll(s2):实现集合s1与s2的并运算。 s1.retainAll(s2):实现集合s1与s2的交运算。 s1.removeAll(s2):实现集合s1与s2的差运算。 s1.containAll(s2):如果s2是s1的子集,该方法返回true。
➢ 常用方法如下:
E get(int index)
6.1.1
E set(int index, E element)
void add(int index, E element)
E remove(int index)
int indexOf(Object o)
int lastIndexOf(Object o)
HashSet类
➢ HashSet类用散列方法存储元素,具有最好的存取性能, 6.1.1 但元素没有顺序。
➢ HashSet类的构造方法有: HashSet() 初始容量是16,默认装填因子是0.75。 HashSet(Collection c) HashSet(int initialCapacity)
面向对象程序设计 ——泛型与集合

C#中的泛型和泛型集合

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是⼀个泛型类。

泛型的定义、用法与类型通配符的使用方式

泛型的定义、用法与类型通配符的使用方式

泛型的定义、⽤法与类型通配符的使⽤⽅式泛型是什么?泛型本质是指类型参数化。

意思是允许在定义类、接⼝、⽅法时使⽤类型形参,当使⽤时指定具体类型,所有使⽤该泛型参数的地⽅都被统⼀化,保证类型⼀致。

如果未指定具体类型,默认是Object类型。

集合体系中的所有类都增加了泛型,泛型也主要⽤在集合。

泛型的定义泛型类:public class Demo<T> {} ,T表⽰未知类型。

泛型接⼝:public interface ImplDemo<T,V>{} ,和定义类⼀样(接⼝就是⼀个特殊类)。

泛型⽅法:public <T> void demo1(T name){System.out.println(name);} , public <T> T demo2(T t){ return t;}泛型的好处1. 编译时确定类型,保证类型安全,避免类型转换异常。

2. 避免了强制类型转换。

3. 代码利于重⽤,增加通⽤性。

泛型的限制和规则泛型的类型参数只能是引⽤类型,不能使⽤值类型。

泛型的类型参数可以有多个。

泛型类不是真正存在的类,不能使⽤instanceof运算符。

泛型类的类型参数不能⽤在静态申明。

如果定义了泛型,不指定具体类型,泛型默认指定为Ojbect类型。

泛型使⽤?作为类型通配符,表⽰未知类型,可以匹配任何类型。

因为是未知,所以⽆法添加元素。

类型通配符上限:<? extends T>,?代表是T类型本⾝或者是T的⼦类型。

常⽤于泛型⽅法,避免类型转换。

类型通配符下限。

<? super T>,?代表T类型本⾝或者是T的⽗类型。

除了通配符可以实现限制,类、接⼝和⽅法中定义的泛型参数也能限制上限和下限。

泛型代码实例接下来,使⽤代码来演⽰泛型的⽤途,建议使⽤⽬录查看具体内容。

集合类演⽰泛型//未指定泛型TreeSet ts = new TreeSet();ts.add(10);ts.add(25);ts.add("30");System.out.println(ts);//运⾏时报错,类型转换异常//mode 2TreeSet<Integer> ts2 = new TreeSet<>();ts2.add(10);ts2.add(25);ts2.add("30"); //编译器提⽰报错,⽆法添加⾮Integer类型未使⽤泛型时,可以添加任意元素,因为TreeSet会⽐较每⼀个元素,所以运⾏时会引发类型转换异常。

集合与泛型

集合与泛型

第一个问题:怎么才能了解JAVA集合类?集合类是什么?数组是集合的一种,是集合的一个子集,你理解了数组就理解了集合.理解集合类集合类存放于java.util包中。

集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。

集合类型主要有3种:set(集)、list(列表)和map(映射)。

(1)集集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。

对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象。

集也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。

它实现的是SortedSet接口,也就是加入了对象比较的方法。

通过对集中的对象迭代,我们可以得到一个升序的对象集合。

(2)列表列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。

列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。

关于实现列表的集合类,是我们日常工作中经常用到的,将在后边的笔记详细介绍。

(3)映射映射与集或列表有明显区别,映射中每个项都是成对的。

映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。

关键字应该是唯一的。

关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。

理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。

集合类简介java.util中共有13个类可用于管理集合对象,它们支持集、列表或映射等集合,以下是这些类的简单介绍集:1. HashSet:使用HashMap的一个集的实现。

训练师脚本:如何使用集合和泛型集合

训练师脚本:如何使用集合和泛型集合

脚本_ 如何使用集合和泛型集合第1页PPT(训练师站在演讲台正中央,精神饱满,声音洪亮)大家好,今天我们来学习ArrayList和Hashtable 。

(切换PPT)第2页PPT数组有哪些局限呢,数组是固定大小的,不能伸缩。

虽然System.Array.Resize这个泛型方法可以重置数组大小,但是该方法是重新创建新设置大小的数组,用的是旧数组的元素初始化。

随后以前的数组就废弃!而集合却是可变长的。

数组要声明元素的类型,集合类的元素类型却是object。

数组可读可写不能声明只读数组。

集合类可以提供ReadOnly方法以只读方式使用集合。

数组要有整数下标才能访问特定的元素,然而很多时候这样的下标并不是很有用。

集合也是数据列表却不使用下标访问。

很多时候集合有定制的下标类型,对于队列和栈根本就不支持下标访问!(切换PPT)第3页PPT能否维护一个动态维护长度的集合呢?我们今天学习新的对象ArrayListList,在新增元素操作时,ArrayList的容量可以根据需要自动扩充,它的索引会根据你的扩展而重新进行分配和调整。

所有我们说ArrayList是动态的数组,可以动态的增加数组的长度,对应保存未知个数的一系列数据使用ArrayList非常方便。

(切换PPT)第4页PPTArrayList非常类似于数组,常有人称之为数组列表,其类来自于System.Collections 命名空间。

由于数组的容量是固定的,这样当我们想添加新的元素时,需要对数组重新进行定义。

为了避免这样的麻烦,我们提出了ArrayList。

(切换PPT)如何在ArrayList中添加元素呢,首先实例化对象,然后使用Add方法添加元素。

具体添加的方法ArrayList对象。

在调用对应的Add方法。

代码演示MySchool,讲解添加元素的方法。

(切换PPT)第6页PPT如何访问ArrayList的元素呢,通过指定索引下标,来取得对象,ArrayList第一个对象的索引是0,但是取到ArrayList里存放的数据后,不能直接赋值给Student对象,需要牵制进行类型转换。

Java程序员认证考试题

Java程序员认证考试题

●第一章Java入门●第二章数据类型和运算符●第三章流程控制与数组●第四章封装●第五章继承●第六章抽象类与接口●第七章多态●第八章异常●第九章多线程机制●第十章输入输出流●第十一章使用泛型和集合框架●第十二章基于Swing的图形用户界面(GUI)设计●第十三章Java事件驱动编程第一章练习题(Java入门)1.下列哪项不是JDK所包含的内容?(选一项)A.Java编程语言B.工具及工具的APIC.Java EE扩展APID.Java平台虚拟机2.下列关于JDK、JRE和JVM的描述。

哪项正确?A.JDK中包含了JRE,JVM中包含了JREB.JRE中包含了JDK,JDK中包含了JVMC.JRE中包含了JDK,JVM中包含了JRED.JDK中包含了JRE,JRE中包含了JVM3.下列哪个工具可以编译java源文件?A.javacB.jdbC.javadocD.junit4.JDK工具javadoc的作用是哪项?A.生成Java文档B.编译Java源文件C.执行Java类文件D.测试Java代码5.以下哪些包是Java标准库中常用的包?(选三项)A.java.langB.javax.servlet .httpC.j ava. ioD.java.sql6.使用JDK工具生成的Java文档的文件格式是?A.XML格式B.自定义格式c.二进制格式D.HTML格式7.以下关于JVM的叙述,哪项正确?(选两项)A.JVM运行于操作系统之上,它依赖于操作系统B.JVM运行于操作系统之上,它与操作系统无关C.JVM支持Java程序运行,它能够直接运行Java字节码文件D.JVM支持Java程序运行,它能够直接运行Java源代码文件8.以下关于支持Java运行平台的叙述,哪项错误?A.Java可在Solaris平台上运行B.Java可在Windows平台上运行C.Java语言与平台无关。

Java程序的运行结果依赖于操作系统D.Java语言与平台无关。

集合框架之泛型详解

集合框架之泛型详解

集合框架之泛型详解泛型(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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[Part] 复习题
1. BDF 2. C 3. B 4. C 5. B 6. D 7. D 8. D 9. D 10. BE 11. A 12. BC 13. E 14. C 15. AC
public static void main(String[] args){ List a1=new ArrayList(); a1.add("1"); a1.add("2"); a1.add("2"); a1.add("3"); System.out.println(a1);
} } 上述程序执行后的输出是哪项? </pre>
[Part] 复习题
1. <pre> [第十一章第15题]现有: import java.util.*;
class FindStuff{ public static void main(Sring[] args){ //insert code here c.put("x",123); }
} 分别插入到第5行,那三行允许代码编译?(选三项) <pre>
public static void main(String[] args) { TreeSet<String> t = new TreeSet<String>(); if (t.add("one ")) if (t.add("two ")) if (t.add("three ")) t.add("four "); for (String s : t) System.out.print(s);
(A) [1,2,3] (B) [1,2,3,3] (C) [1,2,2,3] (D) [2,1,3,2] 15. [第十一章第5题]下列哪些是泛型的优点?(选两项) [A] 不用向下强制类型转换 [B] 代码内容编写 [C] 类型安全 [D] 运行速度快
==========Key Answers==========
} } 哪一行插入到第9行将导Байду номын сангаас输出“abc”? <pre>
(A) for(Iterator o:list.iterator();o.hasNext();) (B) for(Iterator o:list) (C) for(Object o:list.iterator()) (D) for(Object o:list) 9. [第十一章第3题]表示键值对概念的接口是哪项? (A) Set (B) List (C) Collection (D) Map 10. <pre> [第十一章第11题]现有:
}
} 结果为: <pre>
(A) one (B) one three two (C) ont two three (D) ont two three four (E) four one three two (F) 编译失败 14. <pre> [第十一章第7题]现有 public class Demo{
-list是一个合法的集合引用 -getCollection()返回一个合法集合的引用 那两个是合法的?(选两项) <pre>
[A] for(Object o;list) [B] for(Object o: getCollection()) [C] for(Object o:list.iterator()) [D] for(Iterator i;list.iterator();i.hasnext()) [E] for(Iterator i=list.iterator();i.hasNext();) 11. <pre> [第十一章第13题]现有: import java.util.*; class AddStuff{
(A) s2 (B) s1 (C) s2和s3 (D) s2和s4 (E) s2、s3和s4 (F) s1、s2、s3和s4 12. [第十一章第10题]哪两个是同步的?(选两项) [A] java.util.TreeSet [B] java.util.Hashtable [C] java.util.Vector [D] jaba.util.LinkdeList 13. <pre> [第十一章第9题]现有: import java.util.*; class AssStuff2{
static List list = new ArrayList();
static List getList() { return list;
}
public static void main(String[] args) { list.add("a"); list.add("b"); list.add("c"); // insert code here System.out.print(o);
d-java.util.SortedSet 和定义: 1- 使用本接口,允许用户控制集合中每个元素的插入位置。 2- 使用本集合,确保用户可以按照递增或元素的自然顺序遍历集合。 3- 本具体类型允许空元素及基于索引的访问。 4- 本集合是同步的。 哪一组匹配是对的? <pre>
(A) 2描述d;3描述b。 (B) 1描述d;3描述c。 (C) 3描述a;4描述b。 (D) 4描述a;2描述c。 6. [第十一章第1题]集合API中Set接口的特点是哪项? (A) 不允许重复元素,元素有顺序 (B) 允许重复元素,元素无顺序 (C) 允许重复元素,元素有顺序 (D) 不允许重复元素,元素无顺序 7. <pre> [第十一章第14题]现有: import java.util.*; class ForInTest{
static List list=new ArrayList();
public static void main(String[] args){ list.add("a"); list.add("b"); list.add("c"); //insert code here System.out.print(o);
[A] Map c=new SortedMap(); [B] HashMap c=new HashMap(); [C] HashMap c=new Hashtable(); [D] SortedMap c=new TreeMap(); [E] ArrayList c=new ArrayList(); [F] Map c=new LinkedHashMap(); 2. [第十一章第4题]List接口的特点是哪项? (A) 不允许重复元素,元素有顺序 (B) 不允许重复元素,元素无顺序 (C) 允许重复元素,元素有顺序 (D) 允许重复元素,元素无顺序 3. [第十一章第6题]创建一个只能存放String的泛型ArrayList的语句是哪 项? (A) ArrayList&lt;int> a1=new ArrayList&lt;int>(); (B) ArrayList&lt;String> a1=new ArrayList&lt;String>(); (C) ArrayList a1=new ArrayList&lt;String>(); (D) ArrayList&lt;String> a1=new List&lt;String>(); 4. [第十一章第2题]实现了Set接口的类是哪项? (A) ArrayList (B) HashTable (C) HashSet (D) Collection 5. <pre> [第十一章第12题]现有如下类型: a-java.util.Hashtable b-java.util.List c-java.util.ArrayList
public static void main(String[] args){ TreeSet<String> s=new TreeSet<String>(); s.add("one"); s.add("two"); // ①insert code here for(String s2:sorted) System.out.print(s2+" "); } } 和四个代码片段: s1. SortedSet sorted=s.tailSet(s.first()); s2. SortedSet<String> sorted=s.tailSet(s.first()); s3. SortedSet sorted=(SortedSet)s.tailSet(s.first()); s4. SortedSet sorted=(SortedSet<String>)s.tailSet(s.first()); 分别插入到第7行(①处),哪项可以编译? <pre>
} } 第9行插入那一项将输出abc? <pre>
(A) for(char o:list) (B) for(Object o:o.getList()) (C) for(Object o:getList();)
(D) for(Object o:getList()) (E) for(Object o:o.getList();) 8. <pre> [第十一章第8题]现有: import java.util.*; class ForInTest{
相关文档
最新文档