最近在做 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)中没有值,
就放进去。但是有些关键码可以通过散列函数装换的地址直接找到,但有些关键码在散列函数转换的地址后你会 发现是冲突的。 所以需要的内存空间是比实际要大的。
但这样换来的结果就是:通过键来 查询值是比较快的。
可能有些硬伤,请大家矫正,在交流和思考中成长!