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

如果我手动创建一个>8个键的映射,为什么Clojure (1.8)创建一个HashMap,但是如果我使用zipmap创建>8个键的映射,为什么创建一个ArrayMap?

Clojure是一门运行在Java虚拟机上的函数式编程语言,它的数据结构中包含了HashMap和ArrayMap两种类型。

当我们手动创建一个包含超过8个键的映射时,Clojure 1.8版本会默认使用HashMap数据结构来存储这个映射。HashMap是一个无序的键值对集合,它通过计算键的哈希值来实现高效的查找和插入操作。在HashMap中,键的顺序是不确定的。

然而,如果我们使用zipmap函数来创建一个包含超过8个键的映射时,Clojure会选择使用ArrayMap数据结构。ArrayMap是Clojure中的一种持久化数据结构,它是一个有序的键值对集合,键值对按照插入的顺序排列。ArrayMap通过数组来实现,并且在数据量较小时,性能优于HashMap。

创建ArrayMap而不是HashMap的原因在于性能的考虑。在小规模数据的情况下,ArrayMap相比于HashMap具有更快的查询和插入操作。而对于大规模数据,HashMap则具有更好的性能。

在Clojure中,使用HashMap还是ArrayMap取决于具体的使用场景和需求。如果需要保持键值对的插入顺序,或者处理的数据量较小,可以使用ArrayMap。如果不关心插入顺序,或者处理的数据量较大,可以使用HashMap。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云原生产品:https://cloud.tencent.com/product/cloud-native
  • 腾讯云服务器(云服务器Elastic Cloud Server):https://cloud.tencent.com/product/cvm
  • 腾讯云数据库产品:https://cloud.tencent.com/product/cdb
  • 腾讯云人工智能产品:https://cloud.tencent.com/product/ai
  • 腾讯云物联网产品:https://cloud.tencent.com/product/iot
  • 腾讯云移动开发产品:https://cloud.tencent.com/product/mgs
  • 腾讯云存储产品:https://cloud.tencent.com/product/cos
  • 腾讯云区块链产品:https://cloud.tencent.com/product/bc
  • 腾讯云元宇宙产品:https://cloud.tencent.com/product/magellanic
相关搜索:为什么我的对象键,值对被覆盖而不是创建一个新的键,值对?为什么我的数据不能创建一个表(使用BootsrapVue)?为什么我不能使用Smarty创建一个正确的URL?为什么我不能创建一个在SpawnActor()函数中使用的TSubclassOf<>?为什么我可以用字符串字面值创建一个对象,但是如果泛型出现了,我就不能?通过数据映射和创建输入字段,但是为什么我可以输入所有这些字段,只有一个除外?为什么我从另一个使用for循环的字典创建的字典更小?如果我使用CSS网格,我是否应该为每个HTML页面创建一个新的CSS文件?为什么我不能使用vue-konva为太多的形状创建一个层?我使用tailwindCSS创建了一个简单的html站点,但是在netlify上的部署不起作用,为什么?我试着为createUser创建一个可调用的函数,但是在我运行它的时候遇到了一个错误,我不知道为什么使用javascript创建一个可点击的圆圈10次,如果我点击它,它会在中心显示我点击的次数是否可以使用java stream api根据值对象中的字段对映射进行分组,然后创建一个以字段为键、以原始键为值的新映射?在R数据框中,为什么我不能在条件中使用新创建的变量来创建另一个变量如何在postgresql中创建映射表?我使用的是从0到5的整数值,映射需要在另一个表中我刚刚开始学习使用C++的链表。我正在尝试使用一个向量创建一个链表。为什么这段代码会有问题?为什么我声明的随机变量不变,即使我已经使用randint函数为它创建了一个对象我正在尝试使用AVQueuePlayer来创建一个无缝的音频循环,然而,我不知道为什么循环之间会有一个小的静默停顿?如果我的div是使用百分比定位的,我如何创建一个单页面网站(有两个单独的页面)?我已经使用python创建了一个wordcloud,我想查看wordcloud中的单词,如果需要的话,将它们从图像中删除。
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Redis选13亿个Key,4个field还是1亿个Key,13亿*4个field?

Redis中哈希散列类型与Java中HashMap相似,都是一组键值对集合,并且支持单独对其中一个进行增删改查操作。 ? 为什么哈希更适合存储对象呢? ?...Redis中哈希散列是一个string类型field和value映射表,它增删操作复杂度平均为O(1)。为什么平均是O(1)呢?因为哈希内部结构包含zipmap和hash两种。...但是域字段field数量不多,所以说平均是O(1)。那么,为什么会占用更好内存呢?因为对象刚开始使用zipmap存储。...在新建一个哈希时候,使用zipmap又称为small hash存储。这个zipmap实际上不是我们哈希表。但是这个zipmap相比正常哈希实现,节省很多哈希自身所需要元数据存储开销。...Redis中hset命令用于为哈希表中字段赋值,如果哈希表不存在则创建并进行字段赋值,否则原字段值将被新字段值所覆盖。

3.6K21

Android面试题:App性能优化之Java和Kotlin常见数据结构优化

,查找和修改耗时 HashMap 1.7之前是数组+链表;1.8之后是数组+链表+红黑树 计算key位置时用位运算:h & (length-1),位运算更快 HashMap对应key、value是一一对应唯一...,初始化时候要设置HashMap大小,会自动计算到最接近2次幂 HashMap真正初始化时候是在put时候,节约内存 为什么是2次幂,是为了计算index:h & (length-1),后面是...,这样不用arraycopy,下次再put就是一个赋值操作,提升性能 会越用越快,缺点是key只能是int ArrayMap 原理是HashMap+SparseArray,也是2个数组,key数组和value...() 创建不可变映射。...Mutable Maps: 使用 mutableMapOf() 创建可变映射。 Destructuring: 优化遍历和解构键值对。

13010
  • Java中HashMap和HashTable到底哪不同?

    这样就可以得出结论,HashMap/HashTable内部用Entry数组实现哈希表,而对于映射到同一个哈希桶(数组一个位置)键值对,使用Entry链表来存储(解决hash冲突)。 ?...还有没列出代码一点,就是如果创建时给定了初始化大小,那么HashTable会直接使用你给定大小,而HashMap会将其扩充为2幂次方大小。 也就是说HashTable会尽量使用素数、奇数。...但是由于引入hash冲突加剧问题,HashMap在调用了对象hashCode方法之后,又做了一些位运算在打散数据。关于这些位计算为什么可以打散数据问题,本文不再展开了。...因为这是两个类相同一点。事实上,这个优化在JDK 1.8中已经去掉了,因为JDK 1.8中,映射到同一个哈希桶(数组位置)Entry对象,使用了红黑树来存储,从而大大加速了其查找效率。 5....简单来说就是,如果你不需要线程安全,那么使用HashMap如果需要线程安全,那么使用ConcurrentHashMap。HashTable已经被淘汰了,不要在新代码中再使用它。 8.

    64720

    HashMap、LRU、散列表

    get对key hash,找到数组角标(indexfor()) 如果hash相同key相同就找到了 如果hash相同key不相同,找链表一个(通过值找) 其他问题 1.7 和 1.8 数据结构有什么不同...为了减少频繁地创建和回收Map对象,ArrayMap采用了两个大小为10缓存队列来分别保存大小为4和8Map对象。...此实现提供所有可选映射操作,并允许使用null值和null。此类不保证映射顺序,特别是它不保证该顺序恒久不变。...可以说,如果没有数组,就没有散列表。 其中,参赛选手编号我们叫作(key)或者关键字。我们用它来标识一个选手。...总结了三点散列函数设计基本要求: 散列函数计算得到散列值是一个非负整数; 如果 key1 = key2,那 hash(key1) == hash(key2); 如果 key1 ≠ key2,那 hash

    1.1K51

    Java 集合(List、Set、Map 等)相关问答归纳再整理

    大家一个 Star 都是对鼓励 !希望大家能喜欢。 注:所有涉及图片未使用网络图床,文章等均开源提供给大家。...Java 集合框架概述 1.1 什么是集合框架 如果一个程序只包含固定数量且其生命周期都是已知对象,那么这是一个非常简单程序。 通常,程序总是根据运行时才知道某些条件去创建新对象。...Map:可以把 (key) 映射到 值(value) 对象,不能重复(键值对)。...JDK1.8 以后在解决哈希冲突时有了较大变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间(哈希表对进行散列,Map结构即映射表存放键值对) LinkedHashMap:LinkedHashMap...Null 处理:HashMap 和值都可以存储为 null 类型,但是只能有一个 null 类型但是 null 类型值可以有多个。

    77630

    “面试不败计划”:集合、日期、异常、序列化、其他知识点

    p=217%5D 15、HashMap实现原理 1 HashMap概述: HashMap是基于哈希表Map接口非同步实现。此实现提供所有可选映射操作,并允许使用null值和null。...如果你不这么做,在解析或者格式化日期时候,可能会获取到一个不正确结果。因此,从日期、时间处理所有实践来说,强力推荐 joda-time 库。 2、如何格式化日期?...3、JDK 1.7特性 然 JDK 1.7 不像 JDK 5 和 8 一样大版本,但是,还是有很多新特性,如 try-with-resource 语句,这样你在使用流或者资源时候,就不需要手动关闭...虽然两者都是构建工具,都用于创建 Java 应用,但是 Maven 做事情更多,在基于“约定优于配置”概念下,提供标准Java 项目结构,同时能为应用自动管理依赖(应用中所依赖 JAR 文件....使用NIO和NIO 2或者AIO,而非BIO 在finally中关闭流 使用内存映射文件获取更快IO

    88420

    Java面试题:Java中集合及其继承关系

    ,将已有对象传入另一个构造器中创建对象来增强实现)。...但是,他们有以下不同点: HashMap允许和值是null,而Hashtable不允许或者值是null。 Hashtable是同步,而HashMap不是。...12、HashSet和HashMap区别 HashSet实现了Set接口,它不允许集合中有重复值。它存储是对象 HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复。...24、HashMap实现原理 HashMap概述: HashMap是基于哈希表Map接口非同步实现。此实现提供所有可选映射操作,并允许使用null值和null。...27、说出几点 Java 中使用 Collections 最佳实践 这是使用 Java 中 Collectionc 类一些最佳实践: 使用正确集合类,例如,如果不需要同步列表,使用 ArrayList

    1.3K00

    【Java面试总结】Java集合

    另外,HashTable 基本被淘汰,不要在代码中使用它 对 Null key 和 Null value支持:HashMap中,null 可以作为,这样只有一个,可以有一个或多个所对应值为...创建如果指定了容量初始值,那么 HashTable 会直接使用给定大小,而 HashMap 会将其扩充为2 幂次方大小。...HashMap底层实现 JDK 1.8之前 JDK 1.8之前HashMap底层是 数组和链表 结合在一起使用也就是 链表散列。...也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突值加到链表中即可。...不过,jdk 1.8 后解决了这个问题,但是还是不建议在多线程下使用 HashMap,因为多线程下使用 HashMap 还是会存在其他问题比如数据丢失。

    72610

    深入理解HashMap,让你面试对答如流...

    说说HashMap工作原理? 我们通过put和get存储和获取对象。当我们给put()方法传递和值时,先对一个hashCode()计算来得到它在bucket数组中位置来存储Entry对象。...但是随着hash链越来越长,寻址也是更加耗时。好hash算法就是要让链尽量短,最好一个index上只有一个值。也就是尽可能地保证散列地址分布均匀,同时要计算简单。 8. 为什么要用异或运算符?...平时可能大家使用最多就是使用 String 作为 HashMap key,但是现在我们想使用某个自定义类作为 HashMap key,那就需要注意以下几点: 如果类重写了 equals 方法...类所有实例需要遵循与 equals 和 hashCode 相关规则。 如果一个类没有使用 equals,你不应该在 hashCode 中使用它。...①、Segment 继承 ReentrantLock(重入锁) 用来充当锁角色,每个 Segment 对象守护每个散 列映射若干个桶; ②、HashEntry 用来封装映射-值对; ③、每个桶是由若干个

    77840

    ArrayMapHashMap区别

    HashMap HashMap内部是使用一个默认容量为16数组来存储数据,而数组中每一个元素却又是一个链表头结点,所以,更准确来说,HashMap内部存储结构是使用哈希表拉链结构(数组+链表)...从中可以看出,如果有多个元素keyhash值相同的话,后一个元素并不会覆盖上一个元素,而是采取链表方式,把之后加进来元素加入链表末尾,从而解决了hash冲突问题,由此我们知道HashMap中处理...在此补充一个知识点,处理hash冲突方法有以下几种: 开放地址法 再哈希法 链地址法 建立公共溢出区 讲到这里,重点来了,我们知道HashMap中默认存储大小就是一个容量为16数组,所以当我们创建一个...所以我们在一些情况下可以使用SparseArray和ArrayMap来代替HashMap。...二:ArrayMap ArrayMap一个映射数据结构,它设计上更多是考虑内存优化,内部是使用两个数组进行数据存储,一个数组记录keyhash值,另外一个数组记录Value

    2K40

    面试必问之HashMap VS HashTable

    可以看到HashMap/HashTable内部创建一个Entry类型引用数组,用来表示哈希表,数组长度,即是哈希桶数量。...这样就可以得出结论,HashMap/HashTable内部用Entry数组实现哈希表,而对于映射到同一个哈希桶(数组一个位置)键值对,使用Entry链表来存储(解决hash冲突)。...还有没列出代码一点,就是如果创建时给定了初始化大小,那么HashTable会直接使用你给定大小,而HashMap会将其扩充为2幂次方大小。 也就是说HashTable会尽量使用素数、奇数。...但是由于引入hash冲突加剧问题,HashMap在调用了对象hashCode方法之后,又做了一些位运算在打散数据。关于这些位计算为什么可以打散数据问题,本文不再展开了。...事实上,这个优化在JDK 1.8中已经去掉了,因为JDK 1.8中,映射到同一个哈希桶(数组位置)Entry对象,使用了红黑树来存储,从而大大加速了其查找效率。 5.

    39520

    Java集合:ConcurrentHashMap

    整个看起来就像是优化过且线程安全 HashMap,虽然在 JDK1.8 中还能看到 Segment 数据结构,但是已经简化了属性,只是为了兼容旧版本。...boolean containsValue(Object value):如果映射一个或多个映射到指定值,则返回 true。 Enumeration elements():返回此表中值枚举。...V get(Object key):返回指定映射值,如果映射不包含该映射关系,则返回 null。 boolean isEmpty():如果映射不包含-值映射关系,则返回 true。...---- 四、相关知识点 1、 JDK 1.8为什么要摒弃分段锁 很多人不明白为什么Doug Lea在JDK1.8为什么要做这么大变动,使用重级锁synchronized,性能反而更高,原因如下:...这就 2、为什么 key 和 value 不允许为 null 在 HashMap 中,key 和 value 都是可以为 null 但是在 ConcurrentHashMap 中却不允许,这是为什么

    61720

    大数据岗位必知必会53个Java基础

    Map 是一种把对象和值对象映射集合,它一个元素都包含一对对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出对象,就会返回对应值对象。...这样比较ArrayMap其实是申请了更少内存空间,但是扩容频率会更高。因此,如果当数据量比较大时候,还是使用HashMap更合适,因为其扩容次数要比ArrayMap少很多。...这里需要说明一下,网上有一种传闻说因为ArrayMap使用System.arraycopy更省内存空间,这一点真的没有看出来。arraycopy也是把老数组对象一个一个赋给新数组。...4、内存耗费 以ArrayMap采用了一种独特方式,能够重复利用因为数据扩容而遗留下来数组空间,方便下一个ArrayMap使用。而HashMap没有这种设计。...HashMap比较快,因为是使用唯一来获取对象。

    35410

    Java从入门到精通八(Java数据结构--Map集合)

    一个映射不能包含重复;每个最多只能映射一个值。 Map 接口提供三种collection 视图,允许以键集、值集或-值映射关系集形式查看某个映射内容。...该映射根据其自然顺序进行排序,或者根据创建映射时提供 Comparator 进行排序,具体取决于使用构造方法。 在线程同步问题上 注意,此实现不是同步。...如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。(结构上修改是指添加或删除一个或多个映射关系操作;仅改变与现有关联值不是结构上修改。)...简单再说明一下未曾见过方法 putIfAbsent() - 如果映射中不存在指定,则将指定/值映射插入到map中 同样也可以使用到前面迭代时候常用到方法 entrySet() -...如果存在作为参数传递,它将返回该 pollFirstEntry() - 返回并删除与映射一个关联条目 pollLastEntry() -返回并删除与映射最后一个关联条目 具体需要应用的话

    71510

    再撸一次HashMap

    先说一下hash算法干嘛,Hash函数是指把一个大范围映射一个小范围。把大范围映射一个小范围目的往往是为了节省空间,使得数据容易保存。...但是二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深问题),遍历查找会非常慢。 那为什么阀值是8呢? 不知道,等jdk作者来回答。...(1)因为字符串是不可变,所以在它创建时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中,字符串处理速度要快过其它对象。...这就是HashMap往往都使用字符串。...为了保证内部值不被修改,可以采用深度copy来创建一个新内存保存传入值。

    55510

    Clojure 学习入门(18)—— 数据类型

    列表可以通过使用括号来直接输入,这也是为什么Clojure代码本身就使用了如此多列表。例如,正常地调用一个函数:(println "Hello World!")...因为一个普通映射对它和值都会分配内存,所以在产生大量类似映射时候这会导致内存浪费。 不过,创建大量映射很多时候十分有用,所以Clojure提供了结构映射。...但是他们依然是映射,因此从各方面来说,你都可以使用相同方法来取得一个值甚至是添加新。当然,新添加不会像在结构里定义一样有节省内存优势。...普通映射查找速度绝不慢,但使用结构访问函数,你将可以大大缩短普通查找过程所花时间,以适用于那些极端性能敏感场合应用。 要创建一个结构映射高性能访问函数,使用 accessor 函数。...在一个Clojure程序上下文里,使用映射十分不错,因为可以通过普通方式来操作它们,而不必为不同对象创建操作方法。 assoc 映射结合函数assoc接收一个映射和一些/值对作为参数。

    2.3K10

    HashMap面试必问6个点,你知道几个?

    先说一下hash算法干嘛,Hash函数是指把一个大范围映射一个小范围。把大范围映射一个小范围目的往往是为了节省空间,使得数据容易保存。...3.不用红黑树,用二叉查找树可以么? 可以。但是二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深问题),遍历查找会非常慢。 4.那为什么阀值是8呢?...(1)因为字符串是不可变,所以在它创建时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中,字符串处理速度要快过其它对象。...这就是HashMap往往都使用字符串。...为了保证内部值不被修改,可以采用深度copy来创建一个新内存保存传入值。

    1.5K11

    HashMap 源码详细分析(JDK1.8

    HashMap使用了拉链式散列算法,并在 JDK 1.8 中引入了红黑树优化过长链表。...接下来说说构造方法所初始化几个变量。 3.1.2 初始容量、负载因子、阈值 我们在一般情况下,都会使用无参构造方法创建 HashMap。...但当我们对时间和空间复杂度有要求时候,使用默认值有时可能达不到我们要求,这个时候我们就需要手动调参。...为什么不直接用 hashCode 方法产生 hash 呢?大家先可以思考一下,把答案写在下面。 这样做有两个好处,来简单解释一下。...通过移位和异或运算,可以让 hash 变得更复杂,进而影响 hash 分布性。这也就是为什么 HashMap 不直接使用对象原始 hash 原因了。

    1.9K240

    HashMap 源码详细分析(JDK1.8

    接下来说说构造方法所初始化几个变量。 3.1.2 初始容量、负载因子、阈值 我们在一般情况下,都会使用无参构造方法创建 HashMap。...但当我们对时间和空间复杂度有要求时候,使用默认值有时可能达不到我们要求,这个时候我们就需要手动调参。...对于 HashMap 来说,负载因子是一个很重要参数,该参数反应了 HashMap 桶数组使用情况(假设键值对节点均匀分布在桶数组中)。...为什么不直接用 hashCode 方法产生 hash 呢?大家先可以思考一下,把答案写在下面。 这样做有两个好处,来简单解释一下。...通过移位和异或运算,可以让 hash 变得更复杂,进而影响 hash 分布性。这也就是为什么 HashMap 不直接使用对象原始 hash 原因了。

    39730

    HashMap你真的了解吗?

    因为在自动调整大小机制期间,如果一个线程试图放入或获取一个对象,映射可能会使用索引值,而不会找到该条目所在新存储桶。...密钥不变性 为什么字符串和整数是 HashMap 良好实现?主要是因为它们是不可变如果您选择创建自己 Key 类并且不使其不可变,则可能会丢失 HashMap数据。...查看以下用例: 您有一个内部值为“1”使用此键将对象放入 HashMap HashMap 从 Key 哈希码生成一个哈希(所以从“1”开始) Map 将此哈希存储 在新创建条目中 您将内部值修改为...“2” 修改了keyhash值但是HashMap不知道(因为存储了旧hash值) 您尝试使用修改后密钥获取对象 该映射计算您新哈希(因此从“2”开始)以查找条目在哪个链表(桶)中 案例 1...然后映射遍历链表以找到具有相同条目。但是为了找到key,map首先比较hash值,然后调用equals()比较。

    2.2K30
    领券