第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 都可以被之取代,而替换为泛型集合了.

泛型在集合中的作用

泛型在集合中的作用

泛型在集合中的作用泛型是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#中的泛型和泛型集合

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

集合与泛型上机练习的PPT

集合与泛型上机练习的PPT

∙使用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程序员认证考试题

●第一章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语言与平台无关。

集合类和泛型

集合类和泛型

集合类和泛型⼀、集合类集合类和数组同是容器,有何不同?1.数组的长度是固定的,集合类的长度不固定2.数组存储基本类型,集合类存储对象,集合中不能存基本数据类型。

集合容器因为内部数据结构不同,有多种具体容器。

不断向上抽取,就形成了集合框架。

框架的顶层为Collection接⼝。

(⼀)LIst有序的Collection,此处有序是指数据存⼊的顺序。

特点:1.有序,存⼊和取出的顺序⼀致2.所有元素有⾓标(素引)LIst常见的特有⽅法有⼀个共同的特点,就是可以操作⾓标。

List list=new ArrayList();list.add("a1");list.add("a2");Iterator it=list.Iterator();while(it.hasNext()){Object obj=it.Next();if (obj.equals("a2")){list.add("a3");}}上述代码在执⾏时是错误的,因为List类的迭代器在使⽤时容器长度是固定的,不能在迭代时修改容器的长度。

要修改上述错误,我们不能在迭代时修改容器的长度,但是我们可以修改迭代器的长度。

可以使⽤Iterator接⼝的⼦接⼝ListIterator来实现。

代码如下:List list=new ArrayList();list.add("a1");list.add("a2");Iterator it=list.listIterator(); //使⽤列表迭代器while(it.hasNext()){Object obj=it.Next();if (obj.equals("a2")){it.add("a3"); //使⽤迭代器的插⼊⽅法}}List接⼝的有三种:(⼀般除了Vector外,都是不同步的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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)
面向对象程序设计 ——泛型与集合
主要内容
1 泛型介绍 2 集合框架 3 List接口及实现类 4 Set接口及实现类
56.1.1 Queue接口及实现类 6 Map接口及实现类 7 Collections类 8 Stream API介绍
6.1.1
泛型介绍
泛型类型
➢ 泛型(generics)是带一个或多个类型参数(type parameter)的类或接口。6.1.1
集合框架
➢➢基数 流批本组(量操S操tr作作eam)操作
6.1.1
bOpbouobobojelleiecata[dnn]etaafodadAuddrl(tArEaSlylet((C)r)eoalmlec<tEio>n<st?reeaxmte(n) ds E> c)
b<pbouToob>olleieTcaa[dn]netrorfeeaAmumrlrotoavSvyeet(rT(AOe[]lalb(maCje)o<cltEle>oc)tpioanra<le?>llSctr)eam()
操作类型 插入元素 删除元素 返回元素
队首元素操作 addFirst(e) offerFirst(e) removeFirst() pollFirst getFirst() peekFirst()
队尾元素操作 addLast(e) offerLast(e) removeLast() pollLast() getLast() peekLast()
类型擦除
➢ 当实例化泛型类型时,编译器使用一种叫类型擦除(type erasure)的技术转换这些6类.1.1型。在编译时,编译器将清除 类和方法中所有与类型参数有关的信息。
➢ 例如,Node<Integer>被转换成Node,它称为源类型 (raw type)。源类型是不带任何类型参数的泛型类或接 口名。这说明在运行时找不到泛型类使用的是什么类型。
boolean hasNext()
是否有下一个元素
E next()
返回下一个元素
void remove()
删除下一个元素
双向迭代器
➢ List还提供了listIterator()方法返回ListIterator对象。它可以 从前后两个方向遍历线性表6.1.中1 元素。
➢ ListIterator接口定义了多个方法。 boolean hasNext() ,E next(),void remove() boolean hasPrevious(),E previous() int nextIndex(),int previousIndex() void set(E o) void add(E o)
void clear()
6.1.1
List接口及实现类
List接口及实现类
➢ List接口实现一种对象列表的结构。存放在 List中的元素 有一个下标(从0开始),6.1可.1 通过下标访问List中的元素。 List中可以包含重复元素。
bigCities 北京 0
上海 1
广州 2
List基本操作
遍历集合元素
➢ 有多种方法遍历集合中的元素: 6.1.1 • 用简单的for循环 • 用增强的for循环 • 用Iterator和ListIterator迭代器对象
使用迭代器对象
➢ 调用集合对象的iterator()方法可以得到Iterator对象,它称 6.1.1 为迭代器对象。
➢ Iterator接口定义了3个方法。
通配符(?)的使用
➢ 泛型类型本身是一个Java类型,为泛型类型传递不同的类 型参数会产生不同的类型。6.1.1
ArrayList<Object> list1 = new ArrayList<Object>(); ArrayList<String> list2 = new ArrayList<String>();
TreeSet类
➢ TreeSet实现一种树集合,6它.1.1使用红-黑树算法为元素排序。 ➢ 添加到TreeSet中的元素必须是可比较的,即元素的类必须
实现Comparable<T>接口。
➢ 构造方法如下。 TreeSet() TreeSet(Collection c) TreeSet(Comparator c)
List<E> subList(int from, int to)
ArrayList类
➢ ArrayList类实际上实现了一个变长的对象数组,其元素可 6.1.1 以动态地增加和删除。它的定位访问时间是常量时间。
➢ ArrayList的构造方法如下: ArrayList() ArrayList(Collection c) ArrayList(int initialCapacity)
bdoeofaleualtnbcooonlteaainsr(eOmbojevcetIfo(P) redicate<? super E> filter)
bboooolleeaannicsEomntpatiny(s)All(Collection<?> c)
ibnot osilzeea(n) retainAll(Collection<?> c)
ArrayDeque和LinkedList类
➢ ArrayDeque类和LinkedList类是Deque的实现类,前者是可 6.1.1 变数组的实现,后者是线性链表的实现。
6.1.1
Map接口及实现类
Map接口操作
➢ Map是用来存储“键/值”对的对象。在Map中存储的关键字 6.1.1 和值都必须是对象,并要求关键字是唯一的,而值可以重 复。
➢ 尽管String是Object的子类,但ArrayList<String>并不是 ArrayList<Object>的子类型。
通配符(?)的使用
➢ 把一个List<String>对象传递给一个需要List<Object>对象 6.1.1 的方法,将会产生一个编译错误。
public static void printList(List<?> list){ for(Object element : list){ System.out.println(element); }
数组转换为List对象
➢ java.util.Arrays类提供了一个asList()方法,它将数组转 6.1.1 换成List对象,定义如下: public static <T> List<T> asList(T… a)
6.1.口的常用实现类有:HashSet类、TreeSet类。 6.1.1
➢ 例如,如果要在Node对象中存放Integer对象,就需要在 创建Node对象时为其传递Integer类型参数。
➢ 要实例化泛型类对象,也使用new运算符,但在类名后面 需加上要传递的具体类型。
Node<Integer> intNode = new Node<Integer>();
泛型方法
➢ 泛型方法(generic method)是带类型参数的方法。类 的成员方法和构造方法都6可.1.1以定义为泛型方法。
E element()
操作失败抛出异常
boolean offer(E e) E poll() E peek()
操作失败不抛出异常
Queue接口和Deque接口
➢ Deque接口实现双端队列,它支持从两端插入和删除元素, 它同时实现了Stack和Queu6.e1.的1 功能。
➢基本操作方法,如下表所示。
Map实现类
➢ HashMap、TreeMap和Hashtable类。 6.1.1
➢ HashMap类以散列方法存放“键/值”对 HashMap() HashMap(int initialCapacity) HashMap(Map m)
➢ TreeMap类保证Map中的“键/值”对按关键字升序排序。 TreeMap() TreeMap(Comparator c)
相关文档
最新文档