概述
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,java就提供了集合类
数组和集合类的区别
两者同是容器,数组虽然也可以存储对象,但长度是固定的呃;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象
特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象
Collection接口
概述
Collection层次结构中的根接口。Collection表示一组对象,这些对象也成为collection的元素。一些collection允许有重复的元素,而另一些则不允许。一些collection是有序的,而另一些则是无序的
成员方法
boolean add(E e) 添加一个元素
boolean remove(Object o) 从该集合中删除指定元素的单个实例
void clear() 删除集合中所有的元素
boolean isEmpty() 检查集合是否为空
int size() 返回集合长度
Iterator iterator(); 返回一个迭代器(集合专用的遍历方式)
boolean contains(Object o) 检查集合是否包含指定元素
Object[] toArray() 把集合转成数组,可以实现集合的遍历
boolean addAll(Collection c) 添加一个集合元素
boolean removeAll(Collection c) 删除一个集合中包含的小集合中所有元素
boolean containAll(Collection c) 判断大集合是否包含小集合
boolean retainAll(Collection c) 两个集合求交集(c1对c2做交集,最终的交集的结果保存在c1中,c2不变,返回值表示的是c1是否发生变化,而不是表示是否有包含关系)
Iterator接口
概述
对collection进行迭代的迭代器
依赖于集合而存在
成员方法
boolean hasNext() 判断下一个元素是否为空
E next() 返回迭代中的下一个元素
//迭代器遍历
Iterator iterator=c1.iterator();
while(iterator.hasNext()){
Object next=iterator.next();
Student s=(Student)next;
System.out.println(s.getName()+"--"s.getAge());
}
//注意:不能重复调用next()方法,因为每调用一次就会获取下一个元素,指针一直在动
System.out.println(((Student)it.next()).getName()+”---”+((Student)it.next()).getAge());
//这样写就会出现问题
//Iterator为什么不定义为一个类,而是一个接口?
/*
假设迭代器是一个类,这样的话就可以通过类创建对象,调用类中的方法区实现集合的遍历。但是呢,java中提供了很多种集合类,这些集合类数据结构是不同的,所以,存储的方式也应该是不同的,进而对应的遍历的方式应该也有所不同,所以,就不应该被设置为一个类
无论你是使用哪种集合,都应该具备获取元素的操作,而且通过编写代码发现,在啊获取之前最好有一个判断功能,而每隔一种集合他们的数据结构存储方式都不统一,所以判断操作和获取操作的内部实现应该也不是一样的,所以就不能再一开始就具备了具体实现,应该是一个接口。
那么,具体的方法实现在哪里呢?
在真正的具体子类中,以内部类的形式实现。实际上,获取到的迭代器对象是new It人()
*/
List接口
概述
有序(存储和取出顺序一致)
有序的collection(也成为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确的控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素
与set不同,列表通常允许重复的元素
成员方法
void add(int index,E element) 将制定的元素插入此列表中的指定位置(索引范围为0~size())
E remove(int index) 删除该列表中指定位置的元素(返回的是被删除的那个元素)
E get(int index) 返回此列表中指定位置的元素
E set(int index,E element) 用指定的元素替换此列表中指定位置的元素(返回的是被修改的元素)
ListIterator listIterator() 返回列表中的列表迭代器(按适当的顺序)
boolean hasPrevious() list中特有的方法,查看上一个元素是否为空
E previous() 返回上一个元素
注意:
ConcurrentModificationException 并发修改异常
在使用迭代器遍历list的情况下,又对list进行增删改等操作,会触发这个异常
原因分析:
迭代器是依赖与集合而存在的,在遍历迭代器中元素的时候,判断成功后,我们往集合中添加一个新元素,但是呢,迭代器并不知道你添加了新元素,所以就报错了
简单概括:在迭代器遍历的时候,不能去通过集合去修改元素
解决:1、使用迭代器自带的增删改等操作 2、不使用迭代器进行遍历