美文网首页
数据结构优化

数据结构优化

作者: 夜光草 | 来源:发表于2023-03-27 12:18 被阅读0次

ArrayList 内部使用的动态数组来存储元素,LinkedList 内部使用的双向链表来存储元素,这也是 ArrayList 和 LinkedList 最本质的区别。
ArrayList特点:查询快、修改快、增加慢、删除慢。
LinkedList特点:插入和删除节点快,查找耗时。

HashMap是整合了ArrayList和linkedlist的优点,查询和插入都是比较快的。HashMap由数组(键值对entry组成的数组主干)+ 链表(元素太多时为解决哈希冲突数组的一个元素上多个entry组成的链表)+ 红黑树(当链表的元素个数达到8链表存储改为红黑树存储)进行数据的存储。
HashMap采用table数组存储Key-Value的,每一个键值对组成了一个Node节点(JDK1.7为Entry实体,因为jdk1.8加入了红黑树,所以改为Node)。Node节点实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Node节点,以此来解决Hash冲突的问题。
map.put(k,v)实现原理:
1.首先将k,v封装到Node对象当中(节点)。
2.然后它的底层会调用K的hashCode()方法得出hash值。
3.通过哈希表函数/哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有链表。此时,就会拿着k和链表上每个节点的k进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾。如其中有一个equals返回了true,那么这个节点的value将会被覆盖。
map.get(k)实现原理:
1.先调用k的hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。
2.通过上一步哈希算法转换成数组的下标之后,在通过数组下标快速定位到某个位置上。如果这个位置上什么都没有,则返回null。如果这个位置上有单向链表,那么它就会拿着K和单向链表上的每一个节点的K进行equals,如果所有equals方法都返回false,则get方法返回null。如果其中一个节点的K和参数K进行equals返回true,那么此时该节点的value就是我们要找的value了,get方法最终返回这个要找的value。
HashMap 的实例有两个参数影响其性能:初始容量和加载因子(默认值为0.75)。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
HashMap的缺点:内存浪费。

SparseArray:SparseArray相比于HashMap,采用的是时间换取空间的方式来提高手机App的运行效率。
1.SparseArray采用了int[] mKeys 和 Object[] mValues两个数组来分别存储key和value。
2.对于某个key值,先查找其在mKeys中的索引i,直接mValues[i]获取key对应的value,也就是说key与其对应的value存储下标是一样的。
3.SparseArray对mKeys数组做了正序排列,因此,在进行遍历查找key时,使用的是二分查找法,一切为了效率。
4.SparseArray使用int类型,不同与HashMap使用Integer,省去了自动装箱过程,消耗更少内存。
总的来说,SparseArray内存性能优于HashMap,一般适用于key为整型值,数据量较少的应用场景。也是考虑内存优化时替代HashMap的首选。

ArrayMap:是谷歌推出的在安卓等设备上用于替代HashMap的数据结构,和HashMap相比,具有更高的内存使用率,因此适合在Android等内存较为紧张的移动设备。
特点:
1.实现了Map接口,并使用int[]数来存储key的hash值,数组的索引用作index,而使用Object[]数组来存储key<->value ,这还是比较新颖的 。
2.使用二分查找查找hash值在key数组中的位置,然后根据这个位置得到value数组中对应位置的元素。
3.和SparseArray类似,当数据有几百条时,性能会比HashMap低50%,因此ArrayMap适用于数据量很小的场景。

相关文章

  • app内存优化

    内存优化的套路: 一. 使用更加优化的数据结构 一般来说,使用优化的数据结构,并不会给程序带来太多的内存上的节约。...

  • 无标题文章

    缓存优化:优化缓存数据结构,减少属性,复用共同引用,String.Intern()优化存储时间,自动清理机制删除不...

  • 说一说那些我也不太懂的 Python 对象优化

    我们通常做性能优化的思路是:先优化业务逻辑,再优化架构,最后再优化语言的数据结构等。所以如果想将性能优化到极致,往...

  • 高性能mysql

    各种数据结构的特性 大数据量 优化方法 值得优化的查询 计数表

  • reids string

    redis中支持的数据结构都是经过设计优化的数据结构和算法。 1. redis string数据结构 见sds.h...

  • python性能优化和pyinstaller使用

    Python 性能优化常见技巧有:改进算法选择合适的数据结构;并行编程;减少冗余数据;循环优化;字符串的优化;函数...

  • 性能优化

    缩短时间 缓存,数据优化,算法优化,逻辑优化,需求优化 三级缓存 数据类型和数据结构 多使用二分查找和hash 提...

  • 2019-08-04-Android性能优化方法总结

    1,代码优化 选择正确的数据结构。Java中常见的数据结构,List,Map以及实现类等。Android也提供了一...

  • Spark性能优化之优化数据结构

    一、前言 其实主要就是优化算子函数,内部使用到局部数据,或是算子函数外部数据,都可以进行数据结构优化,优化之后,都...

  • 9月17-MySQL性能优化

    MySQL性能优化策略 1、MySQL内核架构 2、索引原理与查询优化 加速MySQL高效查询数据的数据结构 二分...

网友评论

      本文标题:数据结构优化

      本文链接:https://www.haomeiwen.com/subject/zexzrdtx.html