用数据结构的视角来分析list set和map

       最近在做 ITOO云平台权限系统,用到几种不同的集合 于是想找个时间深入总结一下,不能停留会用的水平的上。

       于是今天问问了自己一些问题?  想找出他们之间不同的本质是什么?


        1、这三大接口之间的联系和区别?

        2、是什么导致这些区别?

        3、关于线程安全问题?

        4、 他们各自的适用场景?


       1、 list  、set和map接口联系和区别?

         说到这三种的联系不到不说collection,Collection集合层次中的根接口,JDK没有提供这个接口的直接的实现类

         而是由List  和Set接口继承了Collection根接口,再由List接口和Set接口下面的实现类来实现的。

        

       至于区别就是:请看下面的思维导图

        list集合:元素放入顺序,可重复。

        set集合:元素放入无序,不可重复。

        Map集合:元素放入无序,一个key 对应唯一value。

           

       2、   是什么导致这些区别呢?

               为什么list元素放入就可以重复 ,而且是有序的 。而set就不可重复,无序呢?         

               为什么LinkedList多用于插入和删除 而ArrayLis和Vector多用于查询呢?        

               如果从数据结构的角度来看就好理解了。

 

                set为什么可以不可以重复,而List可以重复的根本原因是set的基于HasMap,

                 HashMap的key 是不可能有重复的。


                用arraylist实现类:为什么允许快速随机存储,而不是适合元素插入和删除。

                因为arraylist 的存储结构是:顺序存储的。

                顺序存储意味着:删除和插入元素需要移动元素,但是遍历就非常快速和随意了。


               用Linkedlist实现类: 适合插入和删除元素,就不适合随机存取的。

               因为linkedlist的存储结构是:链式存储结构。

               链式存储结构意味着:在删除和插入元素时只需要改变指针就行了,不需要移动元素的。

            

                 map:基于哈希表:该数据结构的特点是是以空间换时间的,因为哈希表具有不可避免冲突现象,

        H(key)=a key  + b  ,其中a和b 是常数,若H(key)中有值了,就往下下一个找,直到H(key)中没有值,

     就放进去。但是有些关键码可以通过散列函数装换的地址直接找到,但有些关键码在散列函数转换的地址后你会    发现是冲突的。 所以需要的内存空间是比实际要大的。 

       但这样换来的结果就是:通过键来 查询值是比较快的。

       可能有些硬伤,请大家矫正,在交流和思考中成长!
                    

   


              

    

         

         



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值