对于Java集合框架,在面向对象思想的基础上面,对于集合做相应的增、删、查、求并集、差集、交集的基础上,引入单向队列、双向队列、栈几种类型的数据结构,底层采用数组、链表、数组+链表的结构进行相应的实现。整体操作思路上无外乎是一个查找,找到元素后进行相应的增加或删除的过程。

ArrayList其底层采用的是数组的形式进行实现的,作查找操作会比较快,通过下标即可直接定位到对应的元素。而对于底层数组作插入或删除元素的时候,涉及到数组结构的变化,这里面主要采用新建数组,重新将元素复制到里面的做法。

LinkedList链表来说,其采用的是链表的结构进行实现的,对链表来说节点与节点之间的前后关系是要进行相互认可的,如果有遗漏的话,就可能会导致链表断裂,找不到相应的元素。LinkedList同时又可以当作单向队列、双向队列、栈来进行使用,在使用的过程中,需要根据我们自身对数据结构的定义来使用里面的方法,LinkedList中的方法是根据不同的数据结构进行成套出来的。

HashMap采用键值对的形式进行使用,其底层采用数组+链表的形式进行实现,在这里需要提到的是散列函数,其目标就是要简单、快速、使值平均的进行分布。每一个对象对应的hashCode相当于其在内存中的地址,要将这些值全部存在数组当中,需要耗费很大的内存,所以会通过求余函数法的形式,将这些对象平均分布的存储在数组表中,此时可能会有多个对象可能存在数组中的同一个位置,那么在这个位置会产生相应的冲突,这种冲突的解决方法采用的是拉链法,即在数组中存放的元素是链表,链表当中包括key、value、next元素。当有多个元素存放在数组同一个位置的时候,则链接到链表的后面。对于HashMap的实现,有两个比较值得一提的地方,hash(int)方法和indexFor()方法,hash方法又被称为扰动函数,其目的就是将对象对应的hashCode做一些高低位的处理,使得hash冲突的概率变小,增加散列的平均概率。indexFor()方法,则为求余的一种变通,在HashMap当中,其容量长度2的n次方的形式出现的,采用hash&(length-1)的形式,会使得HashMap定位的效率变得更高。

参考资料:

hash方法

hash方法具体分析

indexFor方法分析

 

posted on 2016-11-20 12:39  天狼群星  阅读(92)  评论(0编辑  收藏  举报