c#之站在IL语言角度彻底搞定HashTable输出的值和插入的时候顺序不一样
2017-11-07 15:01
288 查看
我贴出代码让大家上机测试:支持上机
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 基本功修炼
{
}
我先上图
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/03/e410e9f5c7ba4494bd21a3870e43cd34)
不知道大家发现了什么:我们输出的value是按照插入的顺序先后输出的,也就是那个先进先出,那么我在来改变下key的值在看图是不是还是一样呢
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/03/6d0c457d88378f3f0b496c8e02f0e2c0)
大家发现没输出顺序不对了,第一个不在是我们想像的张三。 我们在仔细观察上面那个-843…的数字,比下大小。
我们会发现这个hashCode值越大越最后输出,我们是不是想到了数组索引0,1,2越来越多,有没有发现像遍历数组。
没有错,其实hashTable存数据的时候是会把key,value以及通过key生成的hashCode存入一个结构做为一个整体。然后通过hashCode值作为数组索引把这个结构存入数组。
其实我们也发现了这个hashCode是根据key对应的公式计算的。具体怎么InitHashCode这个方法我们就细看,想看的话我建议你们通过反编译看iL中间代码。会比较详细。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 基本功修炼
{
class Program { static void Main(string[] args) { Hashtable ht = new Hashtable(); ht.Add("1", "张三"); ht.Add("2", "张四"); ht.Add("3", "王五"); ht.Add("4", "四"); ht.Add("5", "五"); foreach (var item in ht.Keys) { Console.WriteLine(item + " hashCode =" + item.GetHashCode()); } foreach (var item in ht.Values) { Console.WriteLine(item); } } }
}
我先上图
不知道大家发现了什么:我们输出的value是按照插入的顺序先后输出的,也就是那个先进先出,那么我在来改变下key的值在看图是不是还是一样呢
大家发现没输出顺序不对了,第一个不在是我们想像的张三。 我们在仔细观察上面那个-843…的数字,比下大小。
我们会发现这个hashCode值越大越最后输出,我们是不是想到了数组索引0,1,2越来越多,有没有发现像遍历数组。
没有错,其实hashTable存数据的时候是会把key,value以及通过key生成的hashCode存入一个结构做为一个整体。然后通过hashCode值作为数组索引把这个结构存入数组。
其实我们也发现了这个hashCode是根据key对应的公式计算的。具体怎么InitHashCode这个方法我们就细看,想看的话我建议你们通过反编译看iL中间代码。会比较详细。
相关文章推荐
- SQL Server 第三堂课,学习数据库函数。跟C#语言异曲同工,同样是由输入参数,输出参数,函数体,返回值四要素组成,不同的是语法和写法。掌握知识的关键在与学好C#语言的函数
- 编程菜鸟的日记-初学尝试编程-顺序表的类定义及其基本操作算法(创建表、元素插入、元素删除、顺序查找、测表空、求表长、输出等)
- 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
- C#中CLR(公共语言运行时)与IL(中间代码)
- 插入一个数字后按顺序输出
- C语言,输入一个正整数,按由大到小的顺序输出它的所有质数的因子(如180=5*3*3*2*2)
- 彻底搞定C语言指针详解-完整版-时候初学者-必备
- 数据结构:线性表(顺序存储)顺序表类(实现顺序表的创建,输出,插入,删除功能)
- 选择某种Map集合保存学号从1到15的学员的学号(键)和姓名(值),学号用字符串表示,输入的时候要以学号乱序的方式存入Map集合,然后按照学号从大到小的顺序将Map集合中的元素输出打印。需要自定义Ma
- 彻底搞定C语言指针详解-完整版-时候初学者-必备
- 彻底搞定C语言指针详解-完整版-时候初学者-必备
- listbox控件有个 很奇怪的一点,就是用addstring插入的顺序和显示的顺序不一样
- C#语言-输入三角形或者长方形边长,计算其周长和面积并输出
- 编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。
- “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
- 《数据结构与算法C#语言描述》笔记10_散列和Hashtable类
- sql语句中查询用in的时候,按in的顺序来输出
- 实验1-顺序结构 —— C语言实验——格式化输出(常量练习)(1111)
- 初读 c# IL中间语言
- C语言实验——单个字符输入和输出(顺序结构)(sdut oj)