集合,迭代器

一.集合

Java中所有的类都位于java.util包下,主要由两个接口派生出来。分别是Collection(集合)和Map.Collection(映射集合),包含了List和Set两大分支。Map是一个映射接口。Set、Map、List(集,映射,列表)可以看做集合的三大类。
而遍历集合的工具有Iterator和Enumeration(迭代器和枚举);
Arrays(数组)和Collection(集合)是操作数组集合的两个工具类。

一、Java中的集合主要分为四类:
1、List列表:有序的,可重复的;
2、Queue队列:有序,可重复的;
3、Set集合:不可重复;
4、Map映射:无序,键唯一,值不唯一。

二、集合类下包含的主要的实现类:

① List列表:有序,可重复

  1. ArrayList数组列表,有序,可重复,内部是通过Array实现。对数据列表进行插入、删除操作时都需要对数组进行拷贝并重排序。因此在知道存储数据量时,尽量初始化初始容量,提升性能。
  2. LinkedList双向链表,每个元素都有指向前后元素的指针。顺序读取的效率较高,随机读取的效率较低。
  3. Vector向量,线程安全的列表,与ArrayList一样也是通过数组实现的,不同的是Vector是线程安全的,也即同一时间下只能有一个线程访问Vector,线程安全的同时带来了性能的耗损,所以一般都使用ArrayList。
  4. Stack栈,后进先出(LIFO),继承自Vector,也是数组,线程安全的栈。但作为栈数据类型,不建议使用Vector中与栈无关的方法,尽量只用Stack中的定义的栈相关方法,这样不会破坏栈数据类型。
  5. ArrayQueue数组队列,先进先出(FIFO)

② Queue队列,有序、可重复

  1. ArrayDeque数组实现的双端队列,可以在队列两端插入和删除元素
  2. LinkedList也是双向链表
  3. PriorityQueue优先队列,数组实现的二叉树,完全二叉树实现的小顶堆(任意一个非叶子节点的权值,都不大于其左右子节点的权值)

③ Map映射 /字典,无序,键值对,键唯一
在这里插入图片描述

  1. HashMap哈希映射/字典,无序字典,键值对数据,key是唯一的,Key和Value都可以为null
  2. TreeMap红黑树实现的key->value融合,可排序,红黑树是一种自平衡二叉查找树。
  3. LinkedHashMap链表映射/字典,继承了hashmap的所有特性,同时又实现了双向链表的特性,保留了元素插入顺序。

④ Set集合,不可重复

  1. HashSet基于HashMap实现的集合,对HashMap做了一些封装。与HaspMap不同的是元素的保存为链表形式,插入数据时遍历链表查看是否有相同数据,有则返回false,没有则返回true.
  2. LinkedHashSet链表集合,继承自HashSet与LinkedHashMap相似,是对LinkedHashMap的封装。
  3. TreeSet红黑树集合,与TreeMap相似,是对TreeMap的封装。 

二.迭代器(Iterator)

一.迭代器作用:
   通用的取出集合中元素的方法(对集合进行遍历)

二.迭代器概念:
1)迭代: 即collection集合元素的通用获取方式,在取出元素之前先要判断集合中是否有没有元素,如果有,就把这个元素取出来,接下来继续判断,如果还有,就继续取出来,直到把集合中所有元素全部取出

这种取出方式专业术语称为迭代

2)使用java.util.Iterator接口对集合进行遍历

三.迭代器的定义:
    提供一种方法访问一个容器(container)对象中各个元素,而又不需要暴露该对象的内部细节

迭代器模式,就是为了容器而生

1)Collection接口继承了java.lang.Interable接口,该接口有一个interator()方法,那么实现Collection接口的类都有interator()方法,用以返回一个实现了Interator接口的对象

2)Interator仅用于集合的遍历,本身并不提供继承对象的能力,如果需要创建Interator对象,则必须有一个被迭代的集合

3)集合对象每次调用interator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前
 

四.常用方法:


boolean hasNext();
//判断集合中是否还有下一个元素,如果仍有元素可以迭代,则返回true;没有则返回false

E next();
//返回迭代的下一个元素

   Iterator迭代器,是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊 Collection中接口中有一个iterator()方法,这个方法返回的就是迭代器实现类的对象

default remove();
//移除操作,不同于集合直接调用remove()

五、Iterator与泛型(Genetic)搭配:
         Iterator 对集合类中的任何一个实现类,都可以返回这样一个 Iterator 对象。可以适用于任何一个类。因为集合类(List和Set等)可以装入的对象的类型是不确定的,从集合中取出时都是 Object 类型,用时都需要进行强制转化,这样会很麻烦,用上泛型,就是提前告诉集合确定要装入集合的类型,这样就可以直接使用而不用显示类型转换。

六、foreach 和 Iterator 的关系
       foreach 以用来处理集合中的每个元素而不用考虑集合定下标。就是为了让用 Iterator 简单。但是删除的时候,区别就是在 remove,循环中调用集合remove会导致原集合变化导致错误,而应该用迭代器的 remove 方法。

for 循环和迭代器 Iterator 对比:
①采用 ArrayList 对随机访问比较快,而 for 循环中的 get(),采用的即是随机访问的方法,因此在 ArrayList 里,for 循环较快
②采用 LinkedList 则是顺序访问比较快,Iterator 中的 next(),采用的即是顺序访问的方法,因此在 LinkedList 里,使用 Iterator 较快。
③从数据结构角度分析,for 循环适合访问顺序结构,可以根据下标快速获取指定元素。而 Iterator 适合访问链式结构,因为迭代器是通过 next() 和 Pre() 来定位的,可以访问没有顺序的集合。
④使用 Iterator 的好处在于可以用相同方式去遍历集合中元素,而无需考虑集合类的内部实现(只要它实现了java.lang.Iterable接口)。如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改;如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整。因为 List 有序,Set 无序,结构不同,它们的访问算法也不一样。(由此也说明遍历和集合本身分离了)
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值