Java集合初步了解

集合框架的理解是java学习过程中一件必不可少的事情,以下是记录下我的理解。
集合框架在我看来就是 数组与链表。

ArrayList

我们经常用到的arraylist在我们原有的array上实现了List接口,其实现为动态可变数组。其中数组长度capacity随着数组量的大小而动态规划,看其源码可知。数据量达到默认长度时,增加数组长度,重新申请一块内存区域复制以往数据,然后增加新数据。其本质是动态数组的实现。

LinkedList

LinkedList也实现了List接口,还实现了Deque与Queue。双向队列与队列,就可知其用途了,实际上实现的是双向链表与栈的功能实现。当需要增加与删除功能时 使用LinkedList对计算量的优势在大多数情况下优于ArrayList,然而数组的查询的复杂度为(1)。

HashMap

HashMap实现了Map接口所以其存储形式为 键值对 一个key对应一个value值,程序运行中可添加重复key值的数据,但是会覆盖之前key值的数据。其实际实现为数组加链表的存储形式,先对key值进行hash产生一个hashcode。先默认一个长度为2000的数组,然后在对数组下标为hashcode的存储空间存下这个数据,若数据量庞大而数据长度有限,而hashcode相同,则一数组中再按链表进行存储。

HashSet

HashSet的实现是建立在HashMap上的,看源码不难看出。HashSet在Map的实现上,将value的设置全为同一个。HashSet在程序运行中不允许添加重复值,否则会抛出异常。判断重复的逻辑为 首先判断Hashcode是否为同一个然后再对key值进行equels判断。全满足则统一数据,否则不同数据。数据存储无特定顺序。

TreeSet

TreeSet中有两种排序,一个是自然排序,一个是实现Comparable重写compareTo()方法自定义排序。
自然排序可以参考Integer,String等类中的实现。其顺序也是我们常见的“1,2,3,4”,“a,b,c,d”。

集合类的通用遍历方式, 用迭代器迭代:
Iterator it = list.iterator();
while(it.hasNext()) {
  Object obj = it.next();
}

每个遍历方法的实现原理是什么?
1、传统的for循环遍历,基于计数器的:
遍历者自己在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后,停止。主要就是需要按元素的位置来读取元素。
2、迭代器遍历,Iterator:
每一个具体实现的数据集合,一般都需要提供相应的Iterator。相比于传统for循环,Iterator取缔了显式的遍历计数器。所以基于顺序存储集合的Iterator可以直接按位置访问数据。而基于链式存储集合的Iterator,正常的实现,都是需要保存当前遍历的位置。然后根据当前位置来向前或者向后移动指针。
3、foreach循环遍历:
根据反编译的字节码可以发现,foreach内部也是采用了Iterator的方式实现,只不过Java编译器帮我们生成了这些代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值