笔记之java基础--15

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()返回列表的前一个

 * 虽然可以逆向遍历,但是需要首先正向遍历


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值