1、集合
* 由于我们使用的是面向对象语言,所以我们要经常使用对象,而很多时候,我们可能需要使用很多对象。
* 这个时候我们就只能使用以前讲过的数据进行存储了,而数组的特点是长度固定。
* 这样的话就不适合变化的数据,所以java直接提供了一种容器,用于存储对象,这种容器叫集合。
* 集合的特点:
* A:集合长度是可以发生改变的。
* B:集合只能存储对象。
*
* 集合和数组的区别:
* 数组:
* 数组长度固定
* 数组可以存储基本类型,也可以存储引用类型。
* 数组存储的数据类型是一致的。
* 集合:
* 集合长度可变
* 集合只能存储引用类型
* 集合可以存储不同类型的对象。
*
* 集合体系的由来:
* 由于数据结构不同,java就对应提供了很多种集合类,又由于多种集合类的功能很相似,
* 所以就要不断地向上抽取功能,最终形成了集合的体现结构。
* 数据结构就是数据的组织(存储)方式。
*
* 看到一个体系:
* 学什么?
* 一般学习最顶层的内容,因为顶层定义的是这个体系的共性内容。
* 用什么:
* 一般用最底层的内容,因为底层才是真正的具体体现。
* 那么,顶层是什么呢?
* Collection.
*
* Collection中应该有什么功能?
* A:添加功能
* boolean add(Object obj) 确保此collection包含指定的元素(可选操作)。
* 向集合中添加一个元素。
* boolean addAll(Collection<? extends E> c),向集合中添加一个集合元素。
* B:删除功能
* void clear() 删除集合中的所有元素
* boolean remove(Object o)从集合中删除指定的元素
* boolean removeAll(Collection<?> c)从集合中删除一个指定的集合元素
* C:判断功能
* boolean contains(Object o);判断集合中是否存在指定的元素。
* boolean containsAll(Collection<?> c);判断结合中是否存在指定的一个集合中的元素。
* boolean isEmpty();判断集合是否为空
* D:遍历功能
* Iterator<E> iterator()就是用来获取集合中的每一个元素。
* E:长度功能
* int size();获取集合中的元素个数
* F:交集功能
* boolean retainAll(Collection<?> c);获取两个集合中相同的元素。
* G:把集合转换成数组的功能
* Object[] toArray();把集合变成数组,便于遍历
2、 迭代器:
* 其实就是集合的一种遍历(一个一个的获取元素)方式。
* 集合的使用步骤:
* A:创建集合对象
* B:创建元素对象
* C:把元素对象添加到集合对象中
* D:遍历集合对象
* a:通过集合对象获取迭代器对象
* b:通过迭代器对象的hasNext()方法进行判断
* c:通过迭代器对象的next()方法获取
代码实现:
//创建对象
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);
}
* 我们假设迭代器迭代数据的功能定义了一个类,那么就有这样的问题,不同的集合由于数据结构不一样,那么存储方式就不一样。
* 进而他们的获取方式也就是不一样的,也就是说,迭代器获得的方式是变化的,也就是不固定的。
* 所以把这种方式定义为具体的实现是不合理的,无论是何种集合,他们肯定有遍历的功能,而且,如果不知道什么时候就没有数据了,所以也会有判断功能,所以就把判断和获取功能抽取出来,定义在接口中,这样的话,将来无论是哪种集合在遍历的时候, 他们自己只要去获取迭代器接口即可。
* 怎么实现呢?
* 集合迭代器是以内部类的方式实现的。
在ArrayList中迭代器的原码:
public interface Iterator
{
public abstract boolean hasNext();
public abstract Object next();
}
public interface Collection
{
public abstract Iterator iterator();
}
public interface List extends Collection
{
......
}
public class ArrayList implements List{
public Iterator iterator() {
return new Itr();
}
private class Itr implements Iterator {
public boolean hasNext() {
return XXX;
}
public E next() {
return XXX;
}
}
}
3、List有序的Collection(序列)。
1)此接口的用户可以对列表中每个元素的插入位置进行精确地控制。
* 用户可以根据元素的整数索引(在整数中的位置)访问元素,并搜索列表中的元素。*
* 与set不同,列表通常允许重复的元素
*
* Collection有两大体系:
* A:List
* 元素有序(指的是存储顺序和取出顺序是否一致),可重复
* B:Set
* 元素无序,唯一
2)List的特有功能:
* A:添加功能
* add(int index, E element)在指定位置添加元素
* B:删除功能:
* remove(int index);移除列表中指定位置的元素,并把删除的元素返回。
* C:修改功能:
* set(int index, E element),把指定位置的元素修改为指定的值,返回修改前的值。
* D:获取功能
* get(int index);获取指定位置的元素
* indexOf(Object o);返回指定元素在集合中第一次出现的索引
* ListIterator<E> listIterator();列表迭代器
* E:截取功能
* subList(int fromIndex, int toIndex);截取两个索引之间的值,包左不包右
4、列表迭代器:
ListIterator listIterator( ):列表迭代器---public interface ListIterator extends Iterator
为了研究ListIterator的特有功能,先分析下面的应用背景:
这时有了另外一个需求:请遍历集合,判断其中是否有hello这个元素,如果有就在添加一个元素IOS
* java.util.ConcurrentModificationException并发修改异常
* 怎么产生的?
* 当我们通过迭代器迭代元素的过程中,又通过集合修改了元素,这种情况是不允许的
* 因为迭代器是依赖于集合而存在的,如果集合发生了改变那么迭代器也会发生改变
* 而目前我们看到的确实,迭代器乜有发生改变,集合变了,所以报出了一个并发修改异常。
* 注意问题:通过迭代器遍历集合的时候,是不能通过集合去操作,包括添加删除等。
* 那么我们可不可以这样理解呢?
* A:通过迭代器迭代的时候,可以通过迭代器对集合进行操作,而不是通过集合去操作集合。
* 只能通过列表迭代器实现。
* void add(E e)Inserts the specified element into the list (optional operation).
* B:通过集合普通for遍历的时候,可以通过集合操作
* 这种方法元素是添加到最后的。
* 要么全部采用集合做,要么全部用迭代器做,唯独不能集合和迭代器混合使用
5、列代表迭代器特有功能:
* previous()返回列表的前一个
* 虽然可以逆向遍历,但是需要首先正向遍历