Collection
Collection 集合概述
- 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
- JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List) 实现
创建Collection 集合的对象 - 多态的方式
- 具体的实现类ArrayList
public static void main(String[] args) {
// 创建Collection集合的对象
Collection<String> c = new ArrayList<>();
// 添加元素
c.add("hello");
c.add("hello");
c.add("hello");
System.out.println(c);
}
Collection 集合常用方法
Collection 集合的遍历
Iterator: 迭代器,集合的专用遍历方式
- Iterator<E>iterator(): 返回此集合中元素的迭代器,通过集合的Iterator()方法得到
- 迭代器是通过集合的Iterator()方法得到的,所以我们说它是依赖于集合而存在的
Iterator中的常用方法 -
E next()
: 返回迭代中的下一个元素 - boolean hasNext()`: 如果迭代具有更多元素,则返回 true
public static void main(String[] args) {
// 创建Collection集合的对象
Collection<String> c = new ArrayList<>();
// 添加元素
c.add("hello");
c.add("world");
c.add("java");
Iterator<String> it = c.iterator();
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next()); // NoSuchElementException 表示被请求的元素不存在
while(it.hasNext()){
System.out.println(it.next());
}
集合的使用步骤
案例: Collection集合存储学生对象并遍历
public static void main(String[] args) {
// 创建Collection集合的对象
Collection<Student> c = new ArrayList<Student>();
// 创建学生对象
Student s1 = new Student("孙悟空",30);
Student s2 = new Student("猪八戒",31);
Student s3 = new Student("沙悟净",32);
// 把学生添加到集合
c.add(s1);
c.add(s2);
c.add(s3);
// 遍历集合(迭代器方式)
Iterator<Student> it = c.iterator();
while (it.hasNext()){
Student s = it.next();
System.out.println(s.getName() + "," + s.getAge());
}
}
List集合
List集合概述
- 有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置.用户可以通过整数索引访问元素,并搜索列表中的元素
- 与Set 集合不同,列表通常允许重复的元素
List集合特点 - 有序: 存储和取出的元素顺序一致
- 可重复: 存储的元素可以重复
public static void main(String[] args) {
// 创建集合的对象
List<String> list = new ArrayList<String>();
// 添加元素
list.add("hello");
list.add("world");
list.add("world");
list.add("java");
// 输出集合对象
System.out.println(list);
System.out.println("--------");
// 采用迭代器方法遍历
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}
}
List集合特有方法
案例: List集合存储学生对象并遍历
public static void main(String[] args) {
// 创建Collection集合的对象
List<Student> list = new ArrayList<Student>();
// 创建学生对象
Student s1 = new Student("孙悟空",30);
Student s2 = new Student("猪八戒",31);
Student s3 = new Student("沙悟净",32);
// 把学生添加到集合
list.add(s1);
list.add(s2);
list.add(s3);
// 遍历集合(迭代器方式)
Iterator<Student> it = list.iterator();
while (it.hasNext()){
Student s = it.next();
System.out.println(s.getName() + "," + s.getAge());
}
System.out.println("--------");
// for循环遍历
for (int i=0; i<list.size(); i++){
Student s = list.get(i);
System.out.println(s.getName() + "," + s.getAge());
}
}
并发修改异常
并发修改异常
- ConcurrentModificationException
产生原因 - 迭代器遍历过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致
解决方案 - 用 for 循环遍历,然后用集合对象做对应操作即可
列表迭代器
ListIterator: 列表迭代器
- 通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器
- 用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置
ListIterator中的常用方法
- E next(): 返回迭代中的下一个元素
- boolean hasNext(): 如果迭代具有更多元素,则返回true
- boolean hasprevious(): 如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true
- void add(E e): 将指定的元素插入列表
public static void main(String[] args) {
// 创建集合的对象
List<String> list = new ArrayList<String>();
// 添加元素
list.add("hello");
list.add("world");
list.add("java");
// 输出集合对象
System.out.println(list);
System.out.println("--------");
// 采用迭代器方法遍历
/* ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
String s = lit.next();
System.out.println(s);
}
System.out.println("------------");
while (lit.hasPrevious()){
String s = lit.previous();
System.out.println(s);
}*/
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()){
String s = lit.next();
if (s.equals("world")){
lit.add("javaee");
}
}
System.out.println(list);
}
增强for循环
增强for: 简化数组和Collection 集合的遍历
- 实现Iterable接口的类允许其对象成为增强型for语句的目标
- 它是JDK5之后出现的,其内部原理是一个Iterator迭代器
增强for的格式 - 格式:
for(元素数据类型 变量名 : 数组或Collection集合) {
//在此处使用变量即可,该变量就是元素
} - 范例:
int[] arr = {1,2,3,4,5};
for(int i : arr) {
System.out.println(i);
}
public static void main(String[] args) {
// 创建集合的对象
List<String> list = new ArrayList<String>();
// 添加元素
list.add("hello");
list.add("world");
list.add("java");
for (String s : list) {
System.out.println(s);
}
System.out.println("------------");
int[] arr = {1,2,3,4,5};
for(int i : arr) {
System.out.println(i);
}
System.out.println("------------");
String[] strArray = {"hello","world","java"};
for (String s1 : strArray){
System.out.println(s1);
}
System.out.println("------------");
/* // 内部原理是一个Iterator迭代器
for (String s : list){
if (s.equals("world")){
list.add("javaee"); // ConcurrentModificationException,所以是一个Iterator迭代器
}
}*/
}
案例: List集合存储学生对象用三种方式遍历
public static void main(String[] args) {
// 创建集合的对象
List<Student> list = new ArrayList<Student>();
// 创建学生对象
Student s1 = new Student("孙悟空",500);
Student s2 = new Student("猪八戒",500);
Student s3 = new Student("沙悟净",500);
// 把他们添加进集合
list.add(s1);
list.add(s2);
list.add(s3);
// 遍历集合
// 迭代器,集合特有
Iterator<Student> it = list.iterator();
while (it.hasNext()){
Student s = it.next();
System.out.println(s.getName() + "," + s.getAge());
}
// 普通for,带有索引
for (int i=0;i<list.size();i++){
Student s = list.get(i);
System.out.println(s.getName() + "," + s.getAge());
}
// 增强for,最方便的
for (Student s : list){
System.out.println(s.getName() + "," + s.getAge());
}
}