Collection
集合的由来?
我们学习的是Java–面向对象的语言–事物的描述–对象体现,
–多个对象–进行操作–存储 – 容器(数组和StringBuffer)
–StringBuffer返回结果是字符串–数组的长度固定–不适合做变化的需求,Java就提供了集合供我们使用。
(1)定义:Collection--是单列集合的顶层接口
1)属性
1)集合和数组的区别?
1-长度区别
数组固定
集合可变
2-内容区别
数组可以是基本类型,也可以是引用类型
集合只能是引用类型
3-元素内容
数组只能存储同一种类型
集合可以存储不同类型(其实集合一般存储的也是同一种类型)
2)集合的继承体系结构
由于需求不同,Java就提供了不同的集合类。
这多个集合类的数据结构不同,但是它们都是要提供存储和遍历功能的,
我们把它们的共性不断的向上提取,最终就形成了集合的继承体系结构图。
数据结构:数据的存储方式
Collection:是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的,有无序的;
|--List 有序,可重复
|--Set 无序唯一
|--Queue 队列
|--BeanContext
|--BeanContextServices
3)Collection的功能概述:7个
1-添加功能:boolean add(Object obj)--添加一个元素
boolean addAll(Collection c)--添加一个集合的元素
2-删除功能:void clear()--移除所有的元素
boolean remove(Object o)--移除一个元素
boolean removeAll(Collection c)--移除一个集合的元素
3-判断功能:boolean contains(Object o)--判断集合中是否包含指定的元素
boolean containsAll(Collection<?> c)--判断集合中是否包含指定的集合元素(必须包含所有元素)
boolean isEmpty()--判断集合是否为空
4-获取功能:Iterator<E> iterator()--迭代器,集合专用的遍历方式
Object next()方法--获取下一个元素
boolean hasNest()--如果仍有元素可以迭代,返回true
5-长度功能:int size()--元素的个数
6-交集(了解):boolean retainAll(Collection c)--仅保留此集合中包含在指定集合中的元素,两个集合都有的元素
特殊情况:list1和list2两个集合完全相同,所以list1和list2的交集就是他们本身,
把交集赋给list1时,list1没有发生任何的变化,所以返回false。
返回的boolean表示集合是否有改变
假设A,B两个集合
A对B做交集,最终结果保存在A中,B不变
返回值表示的是A是否有改变
7-集合转数组:Object[] toArray()
数组转集合:Arrays工具类的asList(T... a)--返回由指定数组支持的固定大小的列表。
--注意:这个集合的长度不能改变。
2)注意:2种Collection集合遍历方式
1)Collection集合的遍历
1-把集合转数组遍历(了解):Object[] toArray()
2-迭代器(集合专用方式):Iterator<E> iterator()
2)迭代器
1-是集合的获取元素的方式。
2-是依赖于集合而存在的。
3-迭代器的原理和源码。
1、迭代器为什么定义为了一个接口而不是实现类?
集合类的数据结构是不同的,所以,存储和遍历的方式也是不同的。
判断功能和获取功能应该是一个集合遍历所具备的。
2、那么真正的具体的实现类在哪里呢?
在真正的具体子类中,以内部类的方式体现的
如:在ArrayList中的内部类
private class ListItr extends Itr implements ListIterator<E> {
3、首先说一下迭代器模式,它是 Java 中常用的设计模式之一。
用于顺序访问集合对象的元素,无需知道集合对象的底层实现。
4、Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。
5、缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。
6、在迭代过程中调用集合的 remove(Object o)会报 java.util.ConcurrentModificationException 异常
案例:
A:存储字符串并遍历
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
public class CollectionDemo {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
//创建并添加元素
c.add("hello");
c.add("world");
c.add("java");
//遍历集合
Iterator it = c.iterator();//返回的是实现的子对象
while(it.hasNext()) {
String s =(String) it.next();
System.out.println(s);
}//多次调用next(),可能产生一个错误:NoSuchElementException
}
}
B:存储自定义对象并遍历
public class Student {
private String name;
private int age;
public Student(){}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
//getXxx()/setXxx()
}
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
public class StudentDemo {
public static void main(String[] args) {
//创建集合对象
Collection c = new ArrayList();
//创建学生对象
Student s1 = new Student("林青霞",27);
Student s2 = new Student("风清扬",30);
Student s3 = new Student("刘意",30);
Student s4 = new Student("武鑫",25);
Student s5 = new Student("刘晓曲",16);
//添加元素
c.add(s1);
c.add(s2);
c.add(s3);
c.add(s4);
c.add(s5);
//遍历集合
Iterator it = c.iterator();
while(it.hasNext()) {
Student s = (Student)it.next();
System.out.println(s.getName()+"---"+s.getAge());
}
}
}