首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《Effective-Ruby》读书笔记

(permission) end end # 版本1.0:使用 Hash 替代 Array Role 类: # 这样做基于两处权衡,首先,因为哈希只存储,所以数组任何重复在转换成哈希过程中都会丢失...# 每个迭代 reduce 都使用符号作为消息名称发送消息给累加器,同时将当前元素作为参数 def sum (enum) enum.reduce(0, :+) end # 考虑一下把一个数组全部转换为哈希...我从没有改变哈希对象,当我插入一个元素之后,哈希么有改变,但是默认改变了 # 这也是 keys 方法提示这个哈希是空但是访问不存在时却反悔了最近修改原因 # 如果你真想插入一个元素设置一个...# 传给 Hash::new 块可以有选择地接受两个参数:哈希本身和将要访问 # 这意味着我们如果想去改变哈希也是可,那么当访问一个不存在时,为什么不将其对应设置为一个新数组呢?...:每当访问不存在时,块不仅会在哈希中创建新实体,同时还会创建一个新数组 # 重申一遍:访问一个不存在会将这个存入哈希,这暴露了默认存在通用问题: # 正确检查一个哈希是否包含某个方式是使用

4K60

Redis 中数据结构

字典 4.1 字典结构实现 Redis Hash 类型使用以下两种数据结构作为底层实现: 字典; 压缩列表 因为压缩列表比字典更节省内存,所以程序在创建新 Hash 时,默认使用压缩列表作为底层...:当多个不同拥有相同哈希时,哈希表用一个链表将这些连接起来。...——字典进行迭代实际上就是字典所使用哈希表进行迭代迭代器首先迭代字典第一个哈希表,然后,如果 rehash 正在进行的话,就继续第二 个哈希表进行迭代。...unsigned int span; } level[]; } zskiplistNode; 为了适应 Redis 需要,原生跳跃表做了修改: 允许重复 score :多个不同...进行对比操作时,不仅要检查 score ,还要检查 member :当 score 可以重复时, 单靠 score 无法判断一个元素身份,所以需要连 member 域都一检查才行。

67030
您找到你想要的搜索结果了吗?
是的
没有找到

红袖添香,绝代妖娆,Ruby语言基础入门教程之Ruby3基础数据类型(data types)EP02

需要注意是,符号是不可变对象。    哈希(Hash)     哈希是一种非常有用且广泛使用复合容器对象,可用于存储其他对象。我们通过(key)来查找哈希(value)。...声明哈希: H = {}     可以单独key和value进行赋值操作: H[:a] = "123" puts H[:a]     也可以通过使用=>将分配给来创建哈希,用逗号分隔多个键值,...也可以使用fetch方法,他和[]方法一样都可以查找某一个,但是如果对应不存在,会抛出异常。    ...: H = {} H[:a] = "123" puts H.keys()     也可以通过values返回一个带有哈希所有数组: H = {} H[:a] = "123" H["123"]...结语     字符、数字、布尔是不可变对象,而字符串、数组哈希是可变对象,Ruby3中所有不可变对象多个同对象,都会指向同一个对象内存地址。

1.5K20

Redis系列(一):深入了解Redis数据类型和底层数据结构

Redis有以下几种常用数据类型: redis数据是如何组织 为了实现从快速访问,Redis 使用了一个哈希表来保存所有键值。...如何使用 RedisSet是一种无序、不重复元素数据结构,类似于数学上集合。它支持添加、删除和查询元素,并且能够多个集合进行交集、集、差集等操作。...散列函数(Hash Function): 在哈希表中,通过散列函数计算得到一个哈希(hash),这个哈希被用作数组(桶)索引。...Redis使用MurmurHash2等散列函数来均匀地将分散到不同桶中。 2. 桶数组哈希表底层维护了一个桶数组,每个桶中存储了一个或多个键值。...获取所有键值: 使用 HGETALL 命令可以获取哈希表中所有的键值。 HGETALL user:id123 5. 增加或更新: 使用 HINCRBY 命令可以为增加一个整数。

1.3K10

【Java】一文囊括Java集合,随用随看,快速上手。

(扩容机制:元素个数 >= 数组长度 * 0.75 后,长度扩容为原本两倍 ) 新增元素时,根据元素哈希以及数组长度计算出相应位置:int index = (数组长度 - 1) & 哈希;...双列集合 双列集合特点: ①双列集合一次需要存储一数据,分别为不能重复可以重复是一一,每一个只能找到自己对应。...(扩容机制:键值个数 >= 数组长度 * 0.75 后,长度扩容为原本两倍 ) 使用put()新增数据时,底层创建Entry对象存储 ,根据哈希以及数组长度计算出相应位置:int index...如果不为null,通过equals()比较一致会进行覆盖(键值旧value被新value覆盖),属性不一致时,存入索引位置,形成链表。...---- ④LinkedHashMap集合 LinkedHashMap特点: 由决定:存取有序,不重复,无索引 原理:底层数据结构依旧是哈希表(参考HashMap),只是每个元素又额外多了一个双链表机制来记录存储顺序

17440

java学习与应用(3.2)--数据结构相关

同样可变长数组。 Set接口 Set接口,不包含重复元素,没有索引,不能使用for遍历。 HashSet集合,哈希表结构(查询快),无序,不同步,使用迭代器或增强for遍历。...java1.8以后,哈希表使用数组,链表和红黑树提高查询速度。 数组结构:把元素进行了分组(相同哈希元素是一组,链表/红黑树结构把相同哈希元素连接到一起。每组数量大于8则将链表变成红黑树。...()(双列集合,一一应,键值不能重复)。...keySet方法,返回key会放到Set集合中,使用迭代器或增强for进行遍历key,,进行遍历。...HashTable都不为空,同步单线程,双列集合(区别于HashMap允许空等)。 哈希优点和利用在于其快速查找,配合Map可以快速统计。

1.1K10

Redis 概览

SSCAN 命令用于迭代集合元素。 HSCAN 命令用于迭代哈希键值。 ZSCAN 命令用于迭代有序集合中元素(包括元素成员和元素分值)。...从上面的示例可以看到, SCAN 命令回复是一个包含两个元素数组, 第一个数组元素是用于进行下一次迭代新游标, 而第二个数组元素则是一个数组, 这个数组中包含了所有被迭代元素。...在迭代一个足够大、由哈希表实现数据库、集合哈希或者有序集合时, 如果用户没有使用 MATCH 选项, 那么命令返回元素数量通常和 COUNT 选项指定一样, 或者比 COUNT 选项指定数量稍多一些...在迭代一个编码为整数集合(intset,一个只由整数值构成小集合)、 或者编码为压缩列表(ziplist,由不同构成一个小哈希或者一个小有序集合)时, 增量式迭代命令通常会无视 COUNT 选项指定...SCAN 命令返回每个元素都是一个数据库。 SSCAN 命令返回每个元素都是一个集合成员。 HSCAN 命令返回每个元素都是一个键值,一个键值由一个和一个组成。

52920

聊聊它数据结构

key和val指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希相同键值链接在一起,由此来解决哈希冲突问题(链地址法)。...Hash对象只有同时满足下面两个条件时,才会使用ziplist(压缩列表):1.哈希中元素数量小于512个;2.哈希中所有键值字符串长度都小于64字节。...; 上面源码可以简化成如下结构: 这个结构类似于JDK7以前HashMap,当有两个或以上被分配到哈希数组同一个索引上时,会产生哈希冲突。...Redis也使用链地址法来解决冲突。即每个哈希表节点都有一个next指针,多个哈希表节点用next指针构成一个单项链表,链地址法就是将相同hash对象组织成一个链表放在hash对应槽位。...Redis中字典使用hashtable作为底层实现的话,每个字典会带有两个哈希表,一个平时使用,另一个仅在rehash(重新散列)时使用。随着哈希操作,会逐渐增多或减少。

92620

Java基础——集合

通过链表结构可以保证元素存取顺序一致;通过哈希表结构可以保证唯一、不重复,需要重写hashCode()方法、equals()方法。...Map集合存储元素是键值成对出现,Map集合是唯一是可重复。...Entry键值对对象 我们已经知道,Map中存放是两种对象,一种称为key(),一种称为value(),它们在在Map中是一一应关系,这一对象又称做Map中一个Entry(项)。...Entry将键值对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值(Entry)对象中获取对应与对应。...既然Entry表示了一,那么也同样提供了获取对应和对应值得方法: public K getKey():获取Entry对象中

57020

从数据存储角度分析Redis为何这么快?

,里面有着key和val指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希相同键值链接在一起,由此来解决哈希冲突问题(链地址法)。...4.2 ziplist(压缩列表) 当一个列表只包含少量列表项,且是小整数值或长度比较短字符串时,那么redis就使用ziplist(压缩列表)来做列表底层实现。...Hash对象只有同时满足下面两个条件时,才会使用ziplist(压缩列表):1.哈希中元素数量小于512个;2.哈希中所有键值字符串长度都小于64字节。...Redis也使用链地址法来解决冲突。即每个哈希表节点都有一个next指针,多个哈希表节点用next指针构成一个单项链表,链地址法就是将相同hash对象组织成一个链表放在hash对应槽位。...Redis中字典使用hashtable作为底层实现的话,每个字典会带有两个哈希表,一个平时使用,另一个仅在rehash(重新散列)时使用。随着哈希操作,会逐渐增多或减少。

78610

Redis 为什么这么快?

dictEntry:Redis给每个key-value键值对分配一个dictEntry,里面有着key和val指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希相同键值链接在一起...4.2 ziplist(压缩列表) 当一个列表只包含少量列表项,且是小整数值或长度比较短字符串时,那么redis就使用ziplist(压缩列表)来做列表底层实现。 ?...Hash对象只有同时满足下面两个条件时,才会使用ziplist(压缩列表):1.哈希中元素数量小于512个;2.哈希中所有键值字符串长度都小于64字节。...这个结构类似于JDK7以前HashMap,当有两个或以上被分配到哈希数组同一个索引上时,会产生哈希冲突。 Redis也使用链地址法来解决冲突。...Redis中字典使用hashtable作为底层实现的话,每个字典会带有两个哈希表,一个平时使用,另一个仅在rehash(重新散列)时使用。随着哈希操作,会逐渐增多或减少。

96230

Redis为何这么快--数据存储角度

dictEntry:Redis给每个key-value键值对分配一个dictEntry,里面有着key和val指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希相同键值链接在一起...4.2  ziplist(压缩列表)       当一个列表只包含少量列表项,且是小整数值或长度比较短字符串时,那么redis就使用ziplist(压缩列表)来做列表底层实现。 ?...Hash对象只有同时满足下面两个条件时,才会使用ziplist(压缩列表):1.哈希中元素数量小于512个;2.哈希中所有键值字符串长度都小于64字节。...这个结构类似于JDK7以前HashMap,当有两个或以上被分配到哈希数组同一个索引上时,会产生哈希冲突。Redis也使用链地址法来解决冲突。...Redis中字典使用hashtable作为底层实现的话,每个字典会带有两个哈希表,一个平时使用,另一个仅在rehash(重新散列)时使用。随着哈希操作,会逐渐增多或减少。

58220

Redis这么快你知道吗?

dictEntry:Redis给每个key-value键值对分配一个dictEntry,里面有着key和val指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希相同键值链接在一起...Hash对象只有同时满足下面两个条件时,才会使用ziplist(压缩列表):1.哈希中元素数量小于512个;2.哈希中所有键值字符串长度都小于64字节。...这个结构类似于JDK7以前HashMap,当有两个或以上被分配到哈希数组同一个索引上时,会产生哈希冲突。Redis也使用链地址法来解决冲突。...Redis中字典使用hashtable作为底层实现的话,每个字典会带有两个哈希表,一个平时使用,另一个仅在rehash(重新散列)时使用。随着哈希操作,会逐渐增多或减少。...---O(N) slen:intsetlen ---O(1) intset底层实现为有序,无重复数组保存集合元素。

61140

聊聊它数据结构~

dictEntry:Redis给每个key-value键值对分配一个dictEntry,里面有着key和val指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希相同键值链接在一起...4.2 ziplist(压缩列表) 当一个列表只包含少量列表项,且是小整数值或长度比较短字符串时,那么redis就使用ziplist(压缩列表)来做列表底层实现。 ?...Hash对象只有同时满足下面两个条件时,才会使用ziplist(压缩列表):1.哈希中元素数量小于512个;2.哈希中所有键值字符串长度都小于64字节。...这个结构类似于JDK7以前HashMap,当有两个或以上被分配到哈希数组同一个索引上时,会产生哈希冲突。Redis也使用链地址法来解决冲突。...Redis中字典使用hashtable作为底层实现的话,每个字典会带有两个哈希表,一个平时使用,另一个仅在rehash(重新散列)时使用。随着哈希操作,会逐渐增多或减少。

61820

你知道 Redis 为何这么快吗?

dictEntry:Redis给每个key-value键值对分配一个dictEntry,里面有着key和val指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希相同键值链接在一起...4.2 ziplist(压缩列表) 当一个列表只包含少量列表项,且是小整数值或长度比较短字符串时,那么redis就使用ziplist(压缩列表)来做列表底层实现。 ?...Hash对象只有同时满足下面两个条件时,才会使用ziplist(压缩列表):1.哈希中元素数量小于512个;2.哈希中所有键值字符串长度都小于64字节。...这个结构类似于JDK7以前HashMap,当有两个或以上被分配到哈希数组同一个索引上时,会产生哈希冲突。Redis也使用链地址法来解决冲突。...Redis中字典使用hashtable作为底层实现的话,每个字典会带有两个哈希表,一个平时使用,另一个仅在rehash(重新散列)时使用。随着哈希操作,会逐渐增多或减少。

43010

Redis为何这么快--关键在于它数据结构

dictEntry:Redis给每个key-value键值对分配一个dictEntry,里面有着key和val指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希相同键值链接在一起...4.2 ziplist(压缩列表) 当一个列表只包含少量列表项,且是小整数值或长度比较短字符串时,那么redis就使用ziplist(压缩列表)来做列表底层实现。 ?...Hash对象只有同时满足下面两个条件时,才会使用ziplist(压缩列表):1.哈希中元素数量小于512个;2.哈希中所有键值字符串长度都小于64字节。...这个结构类似于JDK7以前HashMap,当有两个或以上被分配到哈希数组同一个索引上时,会产生哈希冲突。Redis也使用链地址法来解决冲突。...Redis中字典使用hashtable作为底层实现的话,每个字典会带有两个哈希表,一个平时使用,另一个仅在rehash(重新散列)时使用。随着哈希操作,会逐渐增多或减少。

49420

Map集合和List集合总结

此实现提供所有可选映射操作,允许使用 null 和 null 。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)...特点: 无序,唯一,类似于Set集合 有序,可重复,类似于List 底层数据结构是哈希表,保证唯一 允许为null,为null HashMap和Hashtable区别 HashMap...是不安全不同步效率高 允许null和null Hashtable是安全同步效率低 不允许null和null 底层都是哈希表结构 LinkedHashMap集合 Map 接口哈希表和链接列表实现...特点: 有序,唯一, 有序,可重复,类似于List 底层数据结构是哈希表和链表,哈希表保证唯一,链表保证有序 TreeMap集合 基于红黑树 (red-black tree) 数据结构实现...但是如果你不清楚,只能通过迭代内部全部元素然后进行条件判断查找,那么List就要慢多,因为他要从头到尾一个个元素去查,直到找到满足你要求那个元素,而Map则不需要迭代,因为Map有,直接取对应

58720

Java基础教程(11)-Java中集合类

(元素);Map 是一种-映射表,当我们调用 put(K key, V value) 方法时,就把 key 和 value 做了映射放入 Map 。...HashMap 中,null 可以作为,这样只有一个;可以有一个或多个所对应为 null。...哈希使用不同 : HashTable 直接使用对象 hashCode。HashMap 重新计算 hash 。...这种转换是一种压缩映射,也就是,散列空间通常远小于输入空间,不同输入可能会散列成相同输出,所以不可能从散列来唯一的确定输入。...简单说就是一种将任意长度消息压缩到某一固定长度消息摘要函数。所有散列函数都有如下一个基本特性:根据同一散列函数计算出散列如果不同,那么输入肯定也不同。

7210

SHA-256感到好奇?这个项目教你如何可视化哈希函数工作原理

在输入数据完全不同情况下,输出哈希有可能是相同,这种少数特殊情况称为“哈希冲突”。 ? 同时,哈希是不可逆,也就是说,通过哈希不可能反向推算出原本数据。...我们重点来看哈希函数压缩函数,这也是其核心功能。 对于消息调度中每个词,我们都使用 “状态寄存器” 中的当前来计算两个新临时词(设为 T_1 和 T_2)。 ?...在计算了两个临时词之后,将状态寄存器中移至下一个位置,更新寄存器: 状态寄存器中第一个变为 T_1 + T_2,同时状态寄存器中第五个已添加了 T_1。...这即是一轮压缩,对于信息调度中每个词该过程都会重复一次。 在压缩了整个消息调度之后,我们将得到哈希添加到初始哈希中,由此得出消息块最终哈希。...但如果还有其他消息块要处理,则将当前哈希在下一次压缩中用作初始哈希。如下图所示: ?

1.2K20

Java学习笔记——Set接口和Map接口

一个映射不能包含重复;每个最多只能映射到一个。...2.3 Map常用实现类  2.3.1 HashMap  基于哈希Map接口实现。此实现提供所有可选映射操作,允许使用null和null。此类不保证映射顺序。...存储特点:     相对无序存储,元素以键值形式存在,不可以重复可以重复,元素整体排重,可以快速通过查找到所对应,通过哈希表实现集合。...2.3.3 Hashtable  此类实现一个哈希表,该哈希表将映射到相应。任何非null对象都可以用作。 存储特点:     相对无序存储,元素排重,通过哈希表实现集合。...Comparator:比较器,compare( o1, o2){  }  如果返回为0 重复元素 Map 特点:存储键值不能重复,一个对应一个可以重复  ----HashMap:存储结构

80130
领券