java 集合:实现

集合本来就是为了方便开发的,实现了一些基本数据结构,一般来说数据结构有两种物理的实现:数组和链表。数组是连续的空间,链表是不连续的。基于这两种又扩展了很多的数据结构。队列,栈,hash表,树。

在java中有两种,一种是collection,主要是为了存储对象集合。一种是map,主要存储键值对。要了解各种java集合怎么使用就必须了解底层的数据结构。

collection是一个总的接口,有子接口set和list。然后还有一些抽象类,实际上这些所有的接口和抽象类,只不过定义了一些行为而已,真正的数据结构定义都是在每一个实现类中。

list:主要的实现类有arraylist,正如名字一样底层就是数组。linkedlist,底层是链表。这个两个类的特性也和这两种数据结构是一样的。

set:虽然是在collection中,hashset底层确是hashmap。为什么?首先说一下set是为了存储不一样的数据。hashmap实现了这个存储,hashset只是关注了hashmap中的key,value是一个默认的object对象。

tip:在了解hashset的时候一定要明白什么是hash表以及hash算法。hash其实就是一种映射方式,把很多无关的数据按照一定的函数映射之后,映射在固定的空间之中。为什么是固定空间?因为hash表在容量在不满的时候会有一个性能最佳的时刻,假如hash表很满了,性能就会下降。反而体现不出hash表的性能优越了。所以你要在创建之前最好可以预知空间的大小。这样hash表才会保持一个优良的性能。hash表为什么性能好?由于hash表基于数组,所以会有寻址上的优势,而hash算法是提供hash表一个快速定位的方法。基于这两个特点,hash表可以高效的查找和删除添加操作,但是有一个缺点就是容量,假如容量满了就会导致性能下降,而解决性能问题,只有重新构建hsah表。

hash表性能分析:首先要了解hash表的性能瓶颈是在什么地方,主要就是hash算法可能会出现hash冲突,这个主要就是要映射的集合是很大的,映射到固定的集合中的时候必定会有重复值的情况。解决这个有很多方法,java中采用的是链地址法,就是把一个冲突的值加到数组值的所连接的链表中去。这个方法在特殊情况下(所有值都单一映射)会出现退化,退化为一个链表。这样hash表的特性就体现不出来了,还有就是当hash表很满的时候,所使用的查找和添加元素的时间就会加剧,这样就导致hash表性能下降。这也就是性能瓶颈。即使使用其他的再哈希方法解决冲突,也会导致性能下降。所以一定要防止元素满表,这样就必须在添加元素的时候检查,假如容量超值了就要重新的去构建hash表。

map:了解了hash表之后,也基本上就了解了hashmap的实现,hashmap中有2个指标,一个是容量,一个是加载因子,其实就是hash表的容量比。也就是一个hash表一般都会超出容量。在使用hash表的时候也最好是使用容量的构造。更好的构建你的元素集合。

所以说hashset和hashmap都是同一底层数据结构,其实原理还是一样的。另一个就是treeset和treemap。这个和上一组是一样的原理,就是使用的底层集合是使用的红黑树。红黑树,是一个自平衡的查找二叉树,查找二叉树就是说所有的元素都是有规律的,这就要求你存储的元素要么是继承comparable或者实现compator的比较器。查找二叉树是数结构,树的使用就是为了大量的数据的时候依旧可以保持快速的查找,但是假如你的数据很特殊,树也会退化为一个链表,这样就会导致效率下降。解决的方法就是红黑树,这个是会不断的进行一个平衡,使得树的效率不会下降。这个主要就是针对大量数据的。才会体现出他的性能优越。

java 集合:实现,布布扣,bubuko.com

java 集合:实现

上一篇:关于Apache的两种工作模式prefork和worker


下一篇:《VMware vSphere企业运维实战》——2.3 vSphere ESXi基本管理与配置