[java]——深入理线性表与线性链表
2015-06-06 10:37
316 查看
前言
昨天遇到了一个问题,map如何保证散列均衡?如何扩展?自诩Java学的还算比较认真,但是没想到深度不够,并且借此机会,打算从新屡一边Java核心的东西,比如并发,JVM,IO。。。这样的话,最近的学习路线有四条了:jQuery,J***A4Core(java核心内容,姑且这么起个名字),android高级(Open GL ES只学到理解和熟练阶段,等将来用到了再深入去研究)。废话不说,进入今天的正题——链表。线性列表
是一种数据结构(我觉得java底层代码就是数据结构和设计模式的实现...),在物理内存里的存储是非连续的,非顺序的。这怎么理解呢?数组的存储模型是这样的,我们在声明数组的时候,需要指定数据类型,这样是为了给数组里每一个单元分配合适的内存,根据高高低低的原则,把数据线性的存在一块内存里。这样做的好处是,可以快速查询,但是要实现插入数据和删除数据(因为其所占内存是连续的),譬如说在012345..的1、2位置之间插入一条数据,
结果是,包括2号数据在内的后边所有数据,都要往后移动一个单元,以保证连续性不变。同理,删除操作,也会导致数据的整体移动,保证连续性。
所以对于线性链表:
优点:查询速度快
缺点:插入和删除操作慢
为了解决插入和删除操作慢的问题,有一种新的数据结构:链表。
链表
链表分三种:单向链表,双向链表,循环链表。只要理解了单向链表,剩下两个也就不难了。单向链表:
每个数据单元由两部分构成。第一部分为地址信息,用于指向下一块数据单元。第二部分为数据。下图中,右侧的单元结构很明显的可以分辨出是两部分。这样的结果,就是数据在内存块里,可以是不连续的。因为每一块数据单元都保存了下一块数据单元的地址,可以通过这个地址跳转过去(直接寻址)。
功能:内存分配更加灵活,插入和删除操作变得简单。因为:插入一条新数据,只需要更改前一个数据单元的指向地址即可,然后再把所插入的数据指向下一个数据单元。缺点:查询困难,需要从头开始查询。使用迭代器快速迭代。因为是非共享数据,线程不安全,当在迭代时,若发生了数据改变,快速迭代会迅速失败。
有了单向链表的思想,就可以构建双向链表。即:每个数据单元由三部分构成。
第一部分指向上一个数据单元,中间是数据,后面是指向下一个数据单元。相比单项链表,其复杂度低。双向链表也可以从尾读到头,单项链表只能从头读到尾。第一条数据的第一个数据单元内存指向和最后一条数据尾部的内存指向均为null值。
由此有衍生出了双向循环链表,成为这一数据结构的最优解。第一个数据单元内存指向尾部,最后一条数据尾部的内存指向为head。
相关文章推荐
- 常见的Java的软件包
- CGLib与JDK的动态代理
- 插入排序法
- 大型Java多用户商城系统设计开发的心得和困难
- MyEclipse 2015优化七步法<亲测有效>
- Could not create the view: An unexpected exception was thrown. Myeclipse空间报错
- JAVA
- Eclipse中使用javap运行配置详解
- 怎样在Eclipse中使用debug模式调试程序
- 第二个Spring冲刺周期团队进展报告
- 工厂模式Java
- [Java] Webservice之定制发布WSDD教程 (二)
- Java加密技术(四)非对称加密算法RSA
- 工作积累(五)——使用spring@Value注解实现常量功能
- JAVA中int转String类型有三种方法
- java基础集合操作工具类Collections简述(java集合四)
- 初试IDEA插件开发
- java.util.Random 类的 nextInt(int num )
- Java加密技术(三)对称加密算法PBE
- 关于Java.net.URL对象使用Proxy访问Internet资源