List、Map实现类(集合)间的区别、遍历、以及实现原理小结

    List:(有序可重复)

        ArrayList:

        ArrayList 基于动态数组存储数据,因为数组内存地址是连续的,所以通过.get(index)方法,很快就可以遍历到指定索引下的数据。

增加数据:首先会检测数组长度是否够用,不够用则创建一个长度为当前数组长度1.5倍的新数组,并将当前数组内数据,拷贝到新数组前。无论长度是否够用,添加数据后,根据添加的位置,都要移动其后的所有数据。

删除数据:如果删除的不是最后一条数据,那么删除数据后,该数据之后的所有数据均向前移动1位。

        LinkList:

        LinkList 基于双向链表是数据结构,因为链表存储数据时地址并不连续,存储数据时每个数据都是以[上一个节点信息(prev)|数据|下一个节点信息(next)]的数据结构存于集合。所以查询时只能逐个数据遍历,因此如果存储数据过多时,查询效率很低。

增加数据:linkList有一个first和last节点,其他元素已上文形式存储。如果添加集合最后,则将last节点指向新元素(prev节点),新元素(next节点)指向first节点。添加集合中,则修改其添加位置前后元素节点指向。

删除数据:

        首先检测该位置是否在该列表中存在,然后解除该元素前、后指向的元素。

     综上所述:

        1.ArrayList是基于动态数组的数据结构,LinkedList是基于双向链表的数据结构。 

        2.需要频繁的查询数据,ArrayList优于LinkedList,因为LinkedList要逐个遍历。

        3.需要频繁的增加或删除数据,LinedList优于ArrayList,因为ArrayList要移动数据位置。


Map:(无序,key-value形式存储,key不可重复,value可重复)

        hashMap:(“链表散列”的数据结构,可理解为数组和链表的结合体。)---线程不安全

            HashMap 是在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置,如果有存在即覆盖,否则新增;当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。

            遍历:(建议使用迭代器)    

HashMap<String, String> map=  new  HashMap<String, String>();  
Iterator it = map.entrySet().iterator();  
while (it.hasNext()){  
    Map.Entry entry=(Map.Entry)it.next();  
    System.out.println( "map-"  entry.getKey() +  ":"  entry.getValue());  
}  

         HashTable:

            同HashMap原理几乎一样,差别在于

            1、HashTable不允许key和value为null

            2、线程安全

                get/put所有相关操作都是同步(synchronized)进行,性能较差。

        ConcurrentHashMap:(线程安全,采用“分段锁”思想)

           ConcurrentHashMap的主干是个Segment数组。Segment继承了ReentrantLock,所以它就是一种可重入锁(ReentrantLock)。每一个Segment里维护了一个HashEntry数组,所以并发环境下,不同的Segment不用考虑锁竞争,值用同一个Segment的操作开考虑线程同步。

get方法无需加锁,由于其中涉及到的共享变量都使用volatile修饰,volatile可以保证内存可见性,所以不会读取到过期数据。


            由于对线程和锁的学习并不牢固,所以代码没有加入很多,后续有深入学习继续更新该博客。还有对List、Map集合的操作方法add(),put(),get(),remove()等等参照官方API,Set集合目前阶段使用极少,只在迭代器遍历是使用过,就暂不过多解释,目前阶段先吃透原理。

            有写的不对的地方,还请各位大神指正,谢谢~

猜你喜欢

转载自blog.csdn.net/jeff_seid/article/details/80524257