一、Iterator迭代器
Java.util.Iterator接口
Iterator对象也被称为迭代器
1.迭代器
- 迭代:集合的通用获取方式。在取出集合之前判断有没有元素,如果有就把这个元素取出来,继续判断,还有继续取,直到全部取出
- Iterator interator() 获取集合对应的迭代器,用来遍历集合的元素
举例:
Collection<String> coll= new ArrayList<String>();
Iterator<String> it = coll.iterator();
2.常用方法
E next() 返回迭代的下一个元素
boolean hasNext() 判断是否有元素,并把指针移到下一个位置
3.使用步骤
-
使用集合接口中的方法iterator() 获取迭代器的实现类,使用Iterator接口接收(多态)
-
使用Iterator接口中的方法hasNext()判断还有没有下一个元素
-
使用Iterator接口中的方法next()取出下一个元素
二、Collection集合
java.util.Collection
是所有单列集合的最顶层接口,里边定义了所有单列集合共性的方法,集合是具有相同性质的多个元素汇聚成的整体,又称容器,可以用来存储多个数据
1.体系
- 和数组区别
- 数组长度固定,集合长度可变
- 数组存储同一类型的元素,可以存储基本数据类型值
集合存储的都是对象,而且对象的类型可以不一致
- 常见子类接口 List、 Set、 Queue
List实现了Iterator接口用于Collection集合的遍历
2.常用方法
所有单列集合都可以使用Collection接口中的方法
1.boolean add(E e) ; 向集合中添加元素,返回是否添加成功
2.boolean remove(E e); 删除集合中的某个元素,返回是否删除失败
3.void clear(); 清空集合中的元素
4.boolean contains(E e) 判断集合是否包含某个元素
5.boolean isEmpty(); 判断集合是否为空
6.int size(); 获取集合的长度、元素个数
7.Object[] toArray() 将集合转成一个数组
8.Iterator<E> interator() 返回在此collection的元素上迭代的迭代器,并把指针放在索引0前面
3.集合的遍历
public class IteratorDemo {
public static void main(String[] args) {
//创建集合对象
Collection<String> c = new ArrayList<>();
//添加元素
c.add("hello");
c.add("world");
c.add("java");
c.add("javaee");
//Iterator<E> iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到
遍历方式1 迭代器
Iterator<String> it = c.iterator();
//获取迭代器的实现类对象,并把指针指向集合的0索引前面
//用while循环改进元素的判断和获取
while (it.hasNext()) {
//判断是否还有下一个元素
String s = it.next();
//取出下一个元素,并把指针向后移动一位
System.out.println(s);
}
}
遍历方式2 (增强for循环) foreach
for(String str : c){
System.out.println(i);
}
遍历方式3 for循环
for(int i =0 ;i<c.size();i++){
System.out.println(c.get(i));
}
}
4.Collections工具类
java.utils.Collections
集合工具类 用来对集合进行操作
1.static <T> boolean addAll(Collection<T> c,T...elements)
往集合中添加一些元素
2.static void shuff(list<?> list) 打乱集合顺序
3.static <T> void sort(List<T> list) 将集合中元素按照默认规则排序
ArrayList排序默认规则是升序
4.static <T> void sort(List<T> list,Comparator<? super T>)
将集合中的元素按照指定规则排序
三、数据结构(重要)
数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率
1.栈(stack)
又称堆栈,运算受限的线性表,
其限制仅允许在标的一段进行插入和删除操作,不允许在其他位置添加查找删除操作
- 采用该结构的集合,对元素存取有以下特点
- 先进后出(存进去的元素,要在后面的 元素依次取出之后才能取出)
- 栈的入口出口都在栈的顶端位置
总结:先进后出
2.队列(queue)
简称队,如同堆栈一样,也是运算受限的线性表。其限制是仅允许在表的一端进行插入,而在表的另一端进行删除
- 采用该结构的集合,对元素的存取有以下特点
- 先进先出 (存进去的元素,要在前面的元素依次取出之后,才能取出)
- 队列的入口和出口各占用一侧
总结:先进先出
3.数组(Array)
是有序的元素序列,数组是在堆内存中开辟一段连续的空间,并在此空间存放元素。
- 采用该结构的集合,对元素的存取有以下特点
- 查找快 通过索引,可以快速定位访问位置的元素
- 增删慢 创建一个新数组,将新元素存储在指定索引位置,再把原数组元素根据索引复制到新的位置
在堆内存中频繁的创建数组,复制数组中的元素,销毁数组,效率低下
总结:查找快,增删慢
4.链表:(linked list)
由一系列结点:(note,链表中的每一个元素称为结点),节点可以动态生成。
每个结点包括两个部分,一个是存储数据元素的数据域,另一个是存储结点地址的指针域,有单向链表和双向链表之分,
- 单向链表指针域存储下一个结点地址
只有一条链子不能保证元素的顺序(存储元素和取出元素的顺序有可能不一致) - 双向链表指针域存储上一个和下一个结点地址
双向链表有两条链子,一条专门记录元素的顺序,是一个有序的集合 - 采用该结构的集合,对元素的存取有以下特点
- 多个结点之间,通过地址进行连接
- 查找慢,想要查找某个元素,需要通过连接的结点,依次查找指定元素
- 增删快,只需要修改连接下个元素的地址即可
总结: 查询慢:链表中地址不是连续的,每次查询元素都得从头开始
增删快:链表结构增删一个元素,对链表的整体结构没有影响
5.红黑树(Red-Black Tree)
-
二叉树:(binary tree),每个结点不超过2的有序树 (tree),二叉树是每个节点有两个子树的树结构
-
顶上的叫根节点;两边分别叫左子树和右子树;叶子节点:没有子树的节点
-
平衡树:左子树和右子树数量相等
-
不平衡树:左子树和右子树数量不相等
-
红黑树:
(趋近于平衡树,查询速度非常快,查询叶子节点最大次数和最小次数不能超过两倍)约束:1.叶子节点可以是红色或者黑色 2.根节点是黑色的 3.叶子节点(空节点)是黑色的 (这里是指为空(NIL或NULL)的叶子节点 ) 4.每个红色节点的子节点都是黑色的 5.任何一个节点到其每个子节点上所有路径上黑色节点数相同