生动形象地说明集合框架家族

首先第一大类接口(爷爷)Collection,被第二大类接口(爸爸)list和set继承

首先说明第二大类接口的list(list爸爸):

1.可以允许重复的对象。
2.可以有多个null。
3.是一个有序集合(容器),保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4.常用的实现类(儿子)有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。

list爸爸的大儿子:ArrayList

采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦。(插入到中间,ArrayList中的其他元素又要移位,可以理解为排队大家往后挪个位,重新安排后面的人的号码)

list爸爸的二儿子:LinkedList

1.采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引(双向链表)
(所以可以更快定位你要添加或删除的位置,只需要将改变插入处前后元素跟插入元素即可。相当于插队时大家定位自己的位置是看谁在我前面或后面,这样插入后面的元素的索引不会变。只会改变插入位置的元素两边。非常方便。)
2.但是缺点就是查找非常麻烦 要从第一个索引开始(比如说集合size=100,你要取40,根据源码,100>>1=50,40<50,需要从前往后循环,循环40遍取出node.item.
如果正好取中间那位或者排后面的,则从后往前循环,直到找到该元素。简直不要太麻烦。)

list爸爸的小儿子:Vector

与大儿子ArrayList亲近(相似),区别在于Vecto线程安全(更保守,少数的线程安全的类,所以性能较慢)。.数据增长(扩容):当需要增长(扩容)时,Vector默认增长为原来一培,而ArrayList却是原来的一半

然后说明第二大类接口的set(set爸爸,简直与list爸爸相反):

1.不允许重复对象
2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
3. 只允许一个 null 元素
4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。

只说明下个人觉得比较常见的:

set爸爸的大儿子:HashSet(hash兄弟之一,全家就他和set无序属性相似)

我的理解是他就是hashmap里的value,其存储是标有hash值来存,取出也是依照hash值取出

set爸爸的小儿子:TreeSet

TreeSet是SortedSet接口的唯一实现(SortedSet接口继承Set接口),正如SortedSet名字所暗示的,TreeSet可以确保集合元素处于排序状态。与前面的HashSet集合相比,TreeSet还提供了一些额外方法:(自己去看api),该孙子较为复杂,红黑树结构。(自行单独了解)

set爸爸的孙子:LinkedHashSet (HashSet儿子)

LinkedHashSet集合也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使的元素看起来是以插入的顺序保存的。也就是说当遍历LinkedHashSet集合里的元素时,HashSet将会按元素的添加顺序来访问集合里的元素。

LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但是在迭代访问Set里的全部元素时,将有很好的性能,因为它以列表来维护内部顺序。

以上Collection家族说完,现在介绍下他的邻居Map(爸爸,没有爷爷)

1.Map不是collection的子接口或者实现类。Map是一个接口。
2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
3. TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
4. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

map爸爸的大儿子:HashMap(无序)

1.Map是一种以键值对存储数据的容器,而HashMap则是借助了键值Key的hashcode值来组织存储,使得可以非常快速和高效地地根据键值key进行数据的存取。

2.对于键值对,HashMap内部会将其封装成一个对应的Entry对象,即Entry对象是键值对的组织形式;

3.对于每个对象而言,JVM都会为其生成一个hashcode值。HashMap在存储键值对Entry的时候,会根据Key的hashcode值,以某种映射关系,决定应当将这对键值对Entry存储在HashMap中的什么位置上;

4.当通过Key值取数据的时候,然后根据Key值的hashcode和内部映射条件,直接定位到Key对应的Value值存放在什么位置,可以非常高效地将Value值取出。

map爸爸的孙子:LinkedHashMap(HashMap的孙子)

与HashMap的区别是他为双向链表,是个有序的集合

map爸爸的二儿子:Hashtable

Hashtable和HashMap相似,其区别是Hashtable是线程安全的

map爸爸的二儿子:TreeMap

看名字就知道是红黑树结构的map啦,是个有序的集合。

总结到这发现了规律:
1.凡是linked开头的集合类名,其都有双向链表结构,那么就适合插入和删除操作,那么就是个有序的集合。
2.凡是tree开头的集合类名,其都是红黑树结构,那么他的元素排列方式有很多,具体可以自行深究,也应当是有序的。
3.凡是hash开头的集合类名,其元素的存储都是会产生相应的hash值。(这里hash值作用和运行原理还需要百度下,貌似有点重要,知道的可以私信或评论)
4.除了以上那些,其他集合实现类都是相似与他的爸爸,有序的都有序,无序的都无序。
5.最后,以上所讲的集合中线程安全的类不多,可以记记:Vector和hashtable

当然,上面的最常用的,除这些之外还有stack,等等就不介绍了,具体的其他类自行百度吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值