一、集合(Collection)
1.1 概念
集合:用于存储数据的容器;
数组与集合的比较:
- 数组的长度是不可变的,集合的长度是可变的;
- 数组是存储基本数据类型的数据,也可以存储引用数据类型的数据,集合只能存储引用数据类型;
集合的分类:
单列集合:每一个元素都是独立的单元;
双列集合:以键(key)值(value)对来存储的,以组为单元;
1.2 Collection常用方法
方法名称 | 方法描述 |
---|---|
boolean add(E e) | 向集合中插入元素 |
void clear() | 清空集合中元素 |
Iterator iterator() | 将集合转换为迭代器 |
删除集合中的元素 | int size() |
Object[] toArray() | 将集合转换为数组 |
1.3 四个带All的方法
方法的名称 | 方法的描述 | 方法的返回值 | col1集合 | col2集合 |
---|---|---|---|---|
boolean addAll(Collection<?extends E>c) | 大集合添加小集合 | col1添加成功之后返回true,否则返回false | 集合发生改变 | 集合不发生改变 |
boolean containsAll(Colleation<?>c) | 大集合是否完全包含小集合 | col1集合完全包含col2集合则返回true,否则返回false | 不发生改变 | 不发生改变 |
boolean removeAll(Collection<?>c) | 大集合删除小集合 | col1集合中元素发生改变 | col1和col2集合交集剩余的部分改变 | 不发生改变 |
boolean retainAll(Collection<?>c) | 获取两个集合的交集 | col1与col2集合中元素完全相同返回false,否则返回true | col1与col2的交集 | 不发生改变 |
1.4 集合的遍历方式
1.4.1 第一种–转换成数组来进行遍历
规制: Object [] toArray();
import java.util.ArrayList;
import java.util.Collection;
import java.util.Objects;
public class Test01 {
public static void main(String[] args) {
//实例化集合
Collection col = new ArrayList();
//向集合中添加数据
((ArrayList) col).add("Lili");
((ArrayList) col).add("Tom");
((ArrayList) col).add("Tony");
((ArrayList) col).add("mary");
//将集合转换成数组
Object[] objects = col.toArray();
for (int i=0;i<objects.length;i++){
System.out.println(objects[i]);
}
/**
*
* 输出
* Lili
* Tom
* Tony
* mary
*/
}
}
1.4.2 第二种–使用迭代器
规制: Interator iterator;
迭代器常用的方法:
方法的名称 | 方法的描述 |
---|---|
boolean hashNext() | 判断是否有下一个元素 |
E next() | 返回迭代的下一个元素 |
void remove() | 删除迭代器中的元素 |
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Objects;
public class Test02 {
public static void main(String[] args) {
//实例化集合
Collection col = new ArrayList();
//录入数据
((ArrayList) col).add("张三");
((ArrayList) col).add("李四");
((ArrayList) col).add("王五");
((ArrayList) col).add("赵六");
//将集合转换成迭代器
Iterator iter = col.iterator();
//遍历
while (iter.hasNext()){
//判断是否有下一个元素
Object obj = iter.next();
System.out.println(obj);
}
}
}
1.4.3 第三种–使用增强for循环遍历
*语法:* for(集合或者数组的数据类型 变量名:需要遍历的集合或者是数组){
变量名(就是集合中每一个元素)
}
*说明:*
A.变量名表示集合中每一个元素;
B.增强for循环的底层也是使用迭代器进行遍历;
import java.util.ArrayList;
import java.util.Collection;
public class Test11 {
public static void main(String[] args) {
//实例化集合
Collection col = new ArrayList();
//向集合中添加元素
col.add("Lili");
col.add("Tony");
col.add("Tom");
col.add("Mary");
//使用增强for循环遍历
for (Object obj :col) {
System.out.println(obj);
}
}
}
二、列表(List)
2.1 概念
列表: 是有序的,索引(在列表中的位置)访问元素;允许重复元素;
带索引的方法:
方法的名称 | 方法的描述 |
---|---|
void add(int index, E element)(增) | 在列表的指定位置插入指定元素 |
E get(int index)(查) | 返回列表中指定位置的元素 |
E remove(int index)(删) | 移除列表中指定位置的元素 |
E set(int index,E element)(改) | 用指定元素替换列表中指定位置的元素 |
2.2 List-Listlterator
方法名称 | 方法描述 |
---|---|
Listlterator listlterator() | 将集合转换为迭代器 |
boolean hasPrevious() | 判断是否有上一个元素 |
E previous() | 返回列表中前一个元素 |
void add(E e) | 将指定的元素插入列表 |
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Objects;
public class Test01 {
public static void main(String[] args) {
//实例化集合
List li = new ArrayList();
li.add("Lili");
li.add("Tom");
li.add("Tony");
//转化为迭代器
ListIterator iter = li.listIterator();
//判断是否有下一个元素
while (iter.hasNext()){
//返回迭代的下一个元素
iter.next();
}//有输出
//使用循环来遍历
while (iter.hasPrevious()){//判断是否有上一个元素
//返回列表中的前一个元素
Object obj = iter.previous();
System.out.println(obj);
}//无输出
}
}
2.3 并发异常-ConcurrentModificationException
问题: 使用迭代器遍历,使用集合的方法添加数据,在集合中修改数据之后,迭代器并不知道集合修改了数据,就会产生并发异常;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Objects;
public class Test01 {
public static void main(String[] args) {
//实例化集合
List li = new ArrayList();
li.add("Lili");
li.add("Tom");
li.add("Tony");
//转化为迭代器
ListIterator iter = li.listIterator();
//判断是否有下一个元素
while (iter.hasNext()){
//返回迭代的下一个元素
String s = (String)iter.next();
if (s.equals("Tom")){
li.add("another Tom");
}
}
System.out.println(li);
//输出异常:ConcurrentModificationException
}
}
解决方案:
A.使用迭代器遍历,使用迭代器添加数据;
B.使用集合传统的方式遍历,使用集合来添加数据;
方案A:
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Objects;
public class Test01 {
public static void main(String[] args) {
//实例化集合
List li = new ArrayList();
//向集合中添加元素
li.add("Lili");
li.add("Tom");
li.add("Tony");
//将集合转化为迭代器
ListIterator iter = li.listIterator();
//判断是否有下一个元素
while (iter.hasNext()){
//返回迭代的下一个元素
String s = (String)iter.next();
if (s.equals("Tom")){
iter.add("another Tom");//这里修改li---->iter
}
}
System.out.println(li);
//输出正常:[Lili, Tom, another Tom, Tony]
}
}
方案B:
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Objects;
public class Test01 {
public static void main(String[] args) {
//实例化集合
List li = new ArrayList();
//向集合中添加元素
li.add("Lili");
li.add("Tom");
li.add("Tony");
//将集合转化为迭代器
ListIterator iter = li.listIterator();
//这里修改
//使用普通for循环啊
for (int i=0;i<li.size();i++){
//这里用li 传统集合方式调用添加数据
String s = (String)li.get(i);
if (s.equals("Tom")){
li.add("another Tom");
}
}
System.out.println(li);
//输出正常:[Lili, Tom, another Tom, Tony]
}
}