三人行,必有吾师,欢迎加入星球,一起讨论技术点滴

前言:

在开发中,经常用到数组,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倍。

常见数据结构在内存中是怎么存储的相关推荐

  1. @清晰掉 C++ 中的 enum 结构在内存中是怎么存储的?

     C++ 中的 enum 结构在内存中是怎么存储的? C++ C++ 中的 enum 结构在内存中是怎么存储的?里面存储的是常量值吗? 关于占用内存的大小,enum类型本身是不占内存的,编译器直接替换 ...

  2. C语言学习(十一)小数在内存中是如何存储的?定点数与浮点数各自的优势在哪?规格化浮点数与非规格化浮点数又表示什么?

    C语言学习(十一)小数在内存中是如何存储的?定点数与浮点数各自的优势在哪?规格化浮点数与非规格化浮点数又表示什么? 浮点数与定点数 小数在内存中以浮点数形式存储.浮点数并不是一种数值分类,他和整数.小 ...

  3. 转载——C语言中float,double类型,在内存中的结构(存储方式)

    最近在做一个数据格式分析和转换的项目,第一次接触底层的二进制代码存储,看的一头雾水,看到这个帖子后对于在Windows系统下数据的存储方式有了更多的了解,将原文分享一下: 原文地址为http://ww ...

  4. 计算机中小数如何储存,小数在内存中是如何存储的?

    小数在内存中是如何存储的? 文本关键字:小数.float.double.浮点数.精度 一.IEEE 754(二进制浮点数算术标准) 在学习进制转换时,我们了解到:我们经常使用的十进制数是转换为二进制进 ...

  5. 16 bit float 存储_小数在内存中是如何存储的,揭秘诺贝尔奖级别的设计(长篇神文)...

    小数在内存中是以浮点数的形式存储的.浮点数并不是一种数值分类,它和整数.小数.实数等不是一个层面的概念.浮点数是数字(或者说数值)在内存中的一种存储格式,它和定点数是相对的.C语言使用定点数格式来存储 ...

  6. 数据结构和内存中堆和栈的区别

    特别声明:本文参考了博客:http://blog.csdn.net/wolenski/article/details/7951961#comments 堆和栈在 我的眼里一直是很模糊的概念,只是简单的 ...

  7. C语言中float,double类型,在内存中的结构(存储方式).

    从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度. 任何数据在内存中都是以二进制(0或1)顺序 ...

  8. 【Java数据结构】计算机中数据的存储方式(为什么要使用B树)

    多路查找树 计算机的存储 内存 硬盘 硬盘基本构成 硬盘存储的优缺点 磁盘的预读 二叉树与B树 二叉树读取数据 B树读取数据 计算机的存储 计算机中的存储大致可以分为内存与硬盘存储,硬盘还能继续分为机 ...

  9. double取两位小数_Java语言中:float、double数据类型在内存中是如何存储的

    java语言中,float类型数字在计算机中用4个字节(32位)来存储.double类型占用8个字节(64位). 从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float ...

最新文章

  1. Java中Math类常用函数总结
  2. JAVA基础12-继承(3)
  3. java虚拟机(二)
  4. 这款AI耳机可以主宰你的情绪,决定让你是哭还是笑
  5. 3MIN干完一周的工作量?快来看看应该如何部署 Kubernetes!
  6. linux shell 创建序列数组(list,array)方法
  7. Windows2003利用×××+NAT+静态路由表建立网通电信双线×××服务器
  8. 862. 和至少为 K 的最短子数组
  9. 怎么实现注解_通透!一口气搞懂注解到底怎么用
  10. 怎么打开网络访问 计算机共享,电脑只要打开共享提示“无法启用共享访问”如何解决...
  11. C++ Vector详解
  12. matplotlib 设置标注方向_Matplotlib绘制带主题及聚类类标的散点图
  13. python文件读写及形式转化和CGI的简单应用
  14. Java8 的 Stream API 的确牛X,但性能究竟如何呢?
  15. java web 局部刷新页面_如何实现页面局部刷新(Java)
  16. Hadoop权威指南第四版数据下载代码
  17. Delphi 10.4.2 CE 社区版支持 Android API-30,之二
  18. 拼车小程序的市场应用与外包开发的建议
  19. 按着Phoenix Framework文档练个手,感受一下Elixir语言。
  20. oracle vm虚拟盒,虚拟盒子内部版下载|虚拟盒子虚拟机下载_最火软件站

热门文章

  1. Ajax实现图片上传并预览
  2. GD图片处理——缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色
  3. Hook android系统调用研究(一)
  4. 正则表达式与grep
  5. 堆和栈是什么?有哪些区别?
  6. Java对象 转 JSON 字符串
  7. 图像处理(九)-图片和数组的转换
  8. MATLAB | 一行代码让你的绘图背景变得逼格满满
  9. 无盘服务器0x00000124,蓝屏0x00000124,懂的帮我一下
  10. EmguCV入门(一)