思来想去还是决定先谈谈 LinkedList,因为hashmap实际上是链表和数组的特殊结合,如果不讲链表,直接讲hashmap,感觉有点太随意了,话不多说,linkelist,是我们日常生活中比较常见的链表,要理解他,首先就要谈谈链表到底是什么。
众所周知,数组的概念就是内存中一段连续的地址,计算机可以方便的读取地址中的数据,对于查找数据来说这无疑是很方便的一种结构,只要遍历过去即可完成查找,但是对于增删改来说这种结构无疑是难缠的,如果你想删除或增加任意一个数据,那么大量的数据必须一起修改,这对系统开销实在是太大了,为了解决这个问题链表应运而生,链表中的每一个节点都不是连续的,如果说数组通过地址相邻来存储数据,链表通过直接存储地址存储数据。
链表的核心有三个数据(单向链表两个,一般只有数据和后一个节点的地址),数据本身,前一个节点的地址,后一个节点的地址,与数组相同,链表保存第一个节点的地址,访问时通过前一个节点寻找后一个节点,需要花费大量性能但对于增删来说,仅仅只要修改极少的的信息就可以完成
LinkedList就是一个典型的链表实现LinkedList中有一个内部类Entry,用于实现节点,成员方法header存储着前一个节点的位置,它本身,同时储存后一个节点的位置,它本身,后续节点添加时header的后一个节点变为添加的节点,同时添加的节点的后一个节点变成之前的该节点顶替的节点,同时被顶替的节点的前一个节点变成该节点,对于第一个添加的节点来说,相当于他和header互为前后节点,由此形成一个封闭的环,之后的节点相当于是为这个环添加节点,此处比较抽象应该画图,但是鉴于作者较懒,请自行体会,size负责存放当前节点的数量,主要方法为add,remove,get,作用分别为添加,删除,查找,add,remove分别对应内部类Entry的addBefore,remove方法,添加的原理上面已经说明,不再复述,删除的原理是将该元素的前一个节点记录的地址改为后一个节点的地址,后一个节点进行相反操作,再将当前节点的所有属性设置为null,查找则使用了较为巧妙的方法,首先让你输入一个int值,对size进行位运算,获取该值的一半,然后进行比较,若大于,从header的前一个节点进行循环查找(也可以认为是从最后一个节点进行查找)若小于,从header的后一个节点进行循环查找,最后输出该节点
java ArrayList,HashMap, LinkedList的简单概括与分析(二)
最新推荐文章于 2022-08-28 17:36:04 发布