文章目录
Collection
概念
单列集合的顶级接口,不能直接new对象。通过实现类去new 如:ArrayList
常用方法
- boolean add(E e) 将指定对象添加到集合中
- void clear(E e) 清空集合元素
- boolean remove(E e) 把给定对象在当前集合删除
- boolean contains(Object obj) 判断当前集合中是否包含给定对象
- boolean isEmpty() 判断当前集合是否为空
- int size() 返回集合长度
- Object[] toArray() 把集合中的元素,存到数组中
迭代器
概念
- 本身是一个Iterator接口
- 在程序开发过程中 经常要遍历集合的元素,于是 JDK就提供了Iterator接口
- 是Collection集合的通用遍历方式
获取迭代器
- Iterator iterator()
获取元素
- boolean hasNext() -->判断集合中有没有下一个元素
- E next() -->获取下一个元素
使用步骤
//创建集合
ArrayList list = new ArrayList();
list.add("第一个元素");
list.add("第二个元素");
list.add("第三个元素");
//获取迭代器
//*其实Iterator指向的是ArrayList的内部类Itr*
Iterator<String> iterator = 集合.iterator();
//由于我们要循环判断集合中有没有下一个元素,利用while循环
while(iterator.hasNext()){
String element = iterator.next();
System.out.print(element )
}
注意事项
先来一个需求:使用迭代器遍历集合,判断集合中是否有元素 “2”,如果有再为集合中添加一个元素“4”。
public static void main(String[] args) {
//创建集合
Collection<String> collection = new ArrayList<>();
//给集合添加数据
collection.add("1");
collection.add("2");
collection.add("3");
//获取迭代器
Iterator<String> iterator = collection.iterator();
//使用迭代器循环
while(iterator.hasNext()){
String str = iterator.next();
//判断 如果集合中有 “2” 在为集合添加元素 “4”
if("2".equals(str))
collection.add("4");
}
}
看了上面的代码,你可能觉得没有任何问题,但是一运行就会报一个ConcurrentModificationException(并发修改异常)异常。至于为什么还要研究一下底层实现源码。
所以:使用迭代器去操作元素的过程中,不要修改元素长度!!
解决办法
可以使用ListIterator这个接口:允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。
ListIterator中的方法
- void add(E e) 添加元素
- boolean hasNext() 判断有没有下一个元素
- E next() 获取下一个元素
演示
public static void main(String[] args) {
//创建集合
Collection<String> collection = new ArrayList<>();
//给集合添加数据
collection.add("1");
collection.add("2");
collection.add("3");
//获取ListIterator迭代器
ListIterator<String> iterator = ((ArrayList<String>) collection).listIterator();
//使用ListIterator迭代器循环
while(iterator.hasNext()){
String str = iterator.next();
//判断 如果集合中有 “2” 在为集合添加元素 “4”
if("2".equals(str))
iterator.add("4");//这里必须使用ListIterator这个接口重写的add方法
}
}
增强for – foreach
概念
遍历数组和集合 使用方法比迭代器简单,但是他遍历集合的时候底层也是迭代器,遍历数组不是!!
格式
for(容器中元素的类型 变量名 :要变遍历的容器的名字){
变量名就是要接受的元素;
}
例:
//创建集合
ArrayList<String> list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
//利用迭代器遍历
Iterator iterator = list.Iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
//利用增强for简历
for(String element:list){
System.out.println(element:list);
}
注意事项
- 使用foreach去操作元素的过程中,也不要修改元素长度!!
- foreach在遍历集合的时候底层原理是迭代器。
- 在遍历数组的时候底层原理不是迭代器。
泛型
好处
定义的时候:让代码更通用,接收任意引用数据类型
使用的时候:可以规定数据类型,防止类型转换异常
定义
1.定义类
格式 :
修饰符 class 类名<代码泛型变量一般用E表示>{}
创建对象的时候确定具体类型。
2.定义方法
格式:
修饰符<代码泛型变量一般用E表示> 返回值类型 方法名(参数){}
调用方法的时候确定泛型的类型
3.定义接口
格式:
修饰符 interface 接口名{}
实现类的时候确定泛型类型,如果在实现类的时候泛型没有确定,那么就要在new对象的时候确定了。
泛型通配符(了解)
一般使用在方法的参数上
格式:
修饰符 返回值类型 方法名(类型名称<?> 对象名){}
可以存Object类型
受限泛型
上限:
格式:
类型名称<? extent 类>对象名
意义:
?只能接受extends后面类型的本身及它的子类类型
下限:
格式
类型名称<? suoer 类>对象名
意义:
?只能接受super后面类型的本身及它的父类类型
数据结构(简单介绍)
栈
采用该数据结构集合的特点:先进后出(举例:压子弹)
队列
采用该数据结构集合的特点:先进先出(举例:排队)
数组
采用该数据结构集合的特点:有序的元素序列,查询快(下标直接定位),增删慢(要想给数组添加元素,需要创建新数组。)
链表
单向链表
概念
- 就是把多个节点链接起来
- 一个节点它是由两个部分组成,数据域(存储的数值),指针域(存储的地址)
- 第二部分存的是下一个节点的地址。
- 上一个节点保存着下一个节点的地址
- 下一个节点没有保存上一个节点的地址
- 不能保证元素的顺序
采用该数据结构集合的特点:查询慢,增删快
双向链表
概念
- 有两个指针域
- 一个节点它是由三个部分组成,上一个节点地址,数据域,下一个节点地址
- 上一个节点记录下一个节点地址
- 下一个节点记录着上一个节点地址
- 可以保证元素的顺序