C#之数据结构(下)

哈希表:

Hashtable. (也叫散列表)无序.

哈希表(Hashtable)  HashSet.

由一对(key , value) 类型的元素组成的集合.

所有元素的 key 必须唯一.

key ->value 是一对一的映射,即根据key就可以立刻在集合中找到所需元素.

Hashtable方法:

Add(key, value)

根据key而不是根据索引查找,因此速度很快

例子:

为哈希表追加不重复的100个值,且每个值都是1-100之间的随机数, 问哪个数字重复的次数最多,重复了多少次?


集合的迭代器


迭代器提供了对集合统一的遍历方案

foreach的本质:

注意:1.禁止在迭代中修改迭代变量!!!

 2.禁止在迭代中修改集合!!!

数组和集合的比较:

1.数组声明了元素类型,但集合没有,因为集合中所用元素都存储为对象。

2.数组的大小是固定的,不能增加和减少;而集合类可根据需要动态调整大小

检索元素的方式不同。

装箱和拆箱:

1. 装箱在值类型向引用类型转换时发生

object obj = 1;这行语句将整型常量1赋给object类型的变量obj; 众所周知常量1是值类型,值类型是要放在栈上的,而object是引用类型,它需要放在堆上;要把值类型放在堆上就需要执行一次装箱操作。

以上就是装箱所要执行的操作了,执行装箱操作时不可避免的要在堆上申请内存空间,并将堆栈上的值类型数据复制到申请的堆内存空间上,这肯定是要消耗内存和cpu资源的。

2. 拆箱在引用类型向值类型转换时发生

object objValue = 4;

int value = (int)objValue;

上面的两行代码会执行一次装箱操作将整形数字常量4装箱成引用类型object变量objValue;然后又执行一次拆箱操作,将存储到堆上的引用变量objValue存储到局部整形值类型变量value中。

拆箱操作的执行过程和装箱操作过程正好相反,是将存储在堆上的引用类型值转换为值类型并给值类型变量。

装箱操作和拆箱操作是要额外耗费cpu和内存资源的,所以在c# 2.0之后引入了泛型来减少装箱操作和拆箱操作消耗。

泛型集合:




上面的情况是不带泛型的集合,我们可以看到,这种集合对象存储不易控制,类型转换容易出错。

下面的是带泛型的集合:


从上面两种情况我们可看出:

泛型集合可以约束集合内的元素类型.

编译时检查类型约束.

无需装箱拆箱操作.

加上using System.Collections.Generic;

List<T>,Dictionary<K,V> /<T>、<K,V>表示该泛型集合中的元素类型.

List<Student> students = new List<Student>();

利用List<Student>存储班级集合.


面试题:

请简述 ArrayList 和 List<Int>的主要区别:

1.ArrayList 不带泛型 数据类型丢失.

2.List<T> 带泛型 数据类型不丢失.

3.ArrayList需要装箱拆箱 List<T>不需要.


Dictionary<K,V>具有List<T>相同的特性

<K,V>约束集合中元素类型

编译时检查类型约束

无需装箱拆箱操作

与哈希表类似存储Key和Value的集合


泛型集合与传统集合相比类型更安全.

泛型集合无需装箱拆箱操作.

泛型的重要性:

1.解决了很多需要繁琐操作的问题.

2.提供了更好的类型安全性.

例子:

假定书籍的种类有5种,设计何种的数据结构可以达到快速查询某类所有书籍的功能(提示:用Dictionary<K,V>)


判断一篇英文文章出现了哪些字母,以及每个字母出现的个数


链表:

LinkedList<T>

生成和追加   LinkedList<string> linked = new LinkedList<string>();

linked.AddLast("cat");

linked.AddLast("dog");

linked.AddLast("man");

linked.AddFirst("first");

查找和插入  LinkedListNode<T>

LinkedListNode<string> node = linked.Find("one");

linked.AddAfter(node, "inserted");

例子:


集合的排序:

集合中全部为对象类型.

所以集合需要排序的时候则必须两个对象需要有可比性.

IComparable与IComparer接口

为了能够对数据项进行排序,就要确定两个数据项在列表中的相对顺序,也就是要确定两个对象的“大小”关系。一般来说,可以通过如下两种方式来定义大小关系。

第一种方式是针对对象本身。为了使对象自己能够执行比较操作,该对象必须实现IComparable接口,即至少具有一个CompareTo()成员。

System.IComparable接口中有如下方法:

int CompareTo(object obj);

它根据当前对象与要比较的对象的“大小”返回一个正数、0或一个负数。

第二种方式是提供一个外部比较器,能够比较对象的大小,并实现IComparer接口。

System.Collections.IComparer接口中有如下方法:

int Compare(object obj1, object obj2);

它根据第一个对象与第二个对象的“大小”返回一个正数、0或一个负数。

许多类在进行排序和查找时,都要求提供这样的外部比较器。

例子:

1.通过 IComparable 来进行排序

实现接口


2. 通过IComparer来进行排序


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 数据结构 一般将数据结构分为两大类: 线性数据结构和非线性数据结构。 线性数据结构有: 线性表、栈、队列、串、数组...
    沉麟阅读 879评论 0 0
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,362评论 0 4
  • - 只收集不整理 - 只收集不分类 分类的意义: - 认知世界的方式。 - 透过现象,对本质的把握。 - 分类就是...
    风筝_云游四海阅读 1,279评论 0 3
  • 狮子滩的林荫 1 时光如沙漏,漏下来斑驳的色彩,有点泛黄,有些生锈。 就连狮子滩的那片林荫大道,眉宇间都是怀旧的表...
    重庆风铃阅读 212评论 0 2
  • 早起已经是习惯了,把抄经书也当成生活中的一部分,这段时间抄的是【心经】,光抄写不懂里面的意思,打开喜马拉雅收听法师...
    鄢瑜含阅读 513评论 6 3