常见数据结构在内存中是怎么存储的
2017-08-10 14:24
295 查看
前言:
在开发中,经常用到数组,ArrayList,HashMap等,他们在内存中是怎么存储的呢? 其实在他们在申请内存时,要么是一块连续的内存,要么是分散的,要么是内存和连续的结合使用。说白了在底层存储结构只有两种:数组和链表; 数组是连续的,只要知道了首地址,就可以通过步长访问数组内所有的值,如果arraylist是基于数组的。 链表是分散的,每个位置除了包含值还会包含下一项的指针,双向链表会前后两项的指针。
ArrayList
ArrayList底层是基于数组存储的,相对于数组,arraylist可以动态扩容(使用数组时,在定义时,需要指定长度,但arrayList不需要)。 所以arrayList中存储是连续的,查询会很方便。但删除插入时,除非是尾部,否则都会涉及到其他位置的重新赋值,影响效率。 ArrayList的动态扩容,定义arraylist时,如果没有定义长度,默认的长度是10 可能不同换jdk有不同的实现,当需要扩容时,会申请一块原size 1.5倍的内存块(new_size=old_size+old_size>>1),然后将原内存块中的内容复制到新的内存块中。原内存块清空,从而实现扩容。
LinkedList
linkedList 底层是基于 链表的,每个结点,都会有前一个和下一个的指针,插入删除,也只需要改变指针指向的位置就可以了。
hashMap
hashmap 是基于数组和链表的,hashMap 默认申请大小为16 的数组,当存储时,根据key的hashCode,决定存储在数组中的第几个索引,如果该索引已经存储了其他元素,刚判断两个key是否相等,如果相等,刚覆盖,否则存储在该索引处的链表中。 hashMap扩容时,也需要重新申请一块连续的内存,将原内存块内容复制到新的内存块中,但是个索引处的链表节点,不需要重新创建。 hashMap 扩容机制:默认长度是16 如果需要扩容则扩为原来的2倍。
相关文章推荐
- float数据在内存中是怎么存储的
- redis是key-value存储的,放在内存中,并在磁盘持久化的数据结构存储系统 通过set key value来存储,通过get key来获取值 复制代码 set key value:设
- float数据在内存中是怎么存储的
- float数据在内存中是怎么存储的
- Java里面float类型数据在内存中怎么存储
- 直播流怎么存储在Ceph对象存储上? Linux内存文件系统tmpfs(/dev/shm) 的应用
- 2.3 常见内核数据结构 : 存储系统数据结构
- (转)程序是怎么在内存中存储的
- Java语言中:float数据类型在内存中是怎么存储的?
- float数据在内存中是怎么存储的 AND IEEE754测试程序
- 常见几个有关存储的名词,如硬盘、内存、u盘Mp3存储设备的特点及原因
- 第九题:【数据结构】【微软面试题】假设我们有一个队列 我们需要快速的找到里面存储的最大值 该怎么做?
- 高级语言中各种数据结构在内存中是如何存储的?
- C++ 内存中 常见数据存储区域
- float数据在内存中是怎么存储的
- C语言 如何查看数据在内存中是怎么存储的
- float数据在内存中是怎么存储的
- 基本数据类型,String、Integer等封装类,以及Class,三者在内存中是怎么存储的?对它们的操作机制又是什么样的?
- float数据在内存中是怎么存储的
- 一个 -100.01 的double 在内存中怎么存储的. 一个中文String 在内存中占多少直接 utf-8 / GBK