简单集合使用



迭代器

  • 只要实现了Iterable接口的类就能使用迭代器,for each循环也是使用迭代器作为底层实现,编译器简单的将for each转化为迭代器。Collection接口实现了Iterable接口。
  • hasNext()方法是检查是否有下一个元素。
  • 迭代器调用next()方法是越过下一个元素并将此元素返回。类似于InputStream.read。
  • Iterator接口的remove()方法是删除被越过的元素,可以将迭代器看作一个指针,每次调用next()方法时,标头越过了一个值,我们对这个值进行修改删除等操作。所以在调用remove()方法时需要调用next()方法。

ListIterator接口

这是一个继承了Iterable接口的为list迭代实现的接口,它提供的方法有:
在这里插入图片描述

向前遍历的hasNext()与next(),向后遍历的hasPrevious()与previous(),获取遍历时越过元素的索引nextIndex()与previousIndex(),以及三个增删改方法。

  • 这里需要注意的的是add()方法,可以看以下示例,添加的值插在了list的第一位,这是因为还没有开始遍历list,iterator指针处于第一位的前面,值插在了第一位和前面空白的中间,如果遍历到了中间,它会将值插在遍历的值和下一个值的中间。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

多迭代器并发修改

如果有两个迭代器同时修改改一个list,并且进行了添加、删除操作,就会出现并发修改异常(ConcurrentModificationException)。需要遵循一个简单规则,多个迭代器对同一list操作时不能使用添加、删除操作。对于set()方法,并发情况下是支持的,它并不被视为结构性修改,不报并发异常。

集合体系

集合框架中的主要部分接口

集合接口有两个部分,一部分是以Collection为顶层接口,另一部分是以Map作为顶层接口。

  • Collection接口下有List,Set,Queue三个接口。
  • Set接口下面还有SortedSet接口,提供了用来排序的比较器对象,这个接口下面还有一个NavigableSet接口,提供了搜索和遍历的方法。
  • NavigableSet接口在理想情况下应该存在于SortedSet接口中,之所以不是这样是因为这个接口是在java6引入的,出现时间比较晚,所以独立出来了一个接口。
  • Map接口下面有SortedMap接口,再下面有NavigableMap接口,作用和Set接口类似。

集合框架中的主要部分实现类

实现类也与接口一样分为两个部分,一部分是以AbstractCollection为顶层抽象类,另一部分是以AbstractMap作为顶层抽象类。

  • AbstractCollection抽象类下面有对于的类似接口的三个抽象类,再下面就是具体的实现类了。
  • 具体的实现类很多,就不一一介绍了

HashMap底层原理

  • 底层实现是散列表,它是先通过hashCode()方法获得一个散列码,再将高16位与低16位进行异或运算,再对数组长度取余就可以得到它存储的位置。
  • 在jdk1.8以前是以数组加链表实现的,jdk1.8以后又增加了一定条件下链表转红黑树的实现。
  • 不同存储的值经过散列再对数组取余后,得到了同一个存储位置,这就是hash冲突,为了解决hash冲突形成的链表查询慢O(N)的问题,使用红黑树O(logN)。
  • 链表的插入在1.7采用头插法,它在多线程模式下会产生死循环的问题,1.8改成了尾插法解决了这个问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值