A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

day15:

集合是可以发生改变的
集合是存储对象最最常用的方式
集合:由于我们使用的是面向对象语言,所以我们哟啊经常使用对象,而很多时候,我们可以需要使用很多的对象
这个时候,我们就只能使用以前的数组进行存储了,而数组的特点是长度是固定的
这样的话就不适合变化的数据,所以,Java重新提供了一种容器,用于存储对象,这种容器叫集合
数组的特点:
  1,长度固定
  2,数据类型一致
  3,可以存储基本数据类型和引用类型
集合的特点:
  A:长度是可以改变的
  B:可以存储不同的数据类型
  C:只能存储对象

由于数据结构不同,Java就对应提供了很多中集合类,又由于多种集合类的功能很相似,所以,就要不断的 向上抽取功能
最终形成了集合的体现结构。

学习一个体系:
学什么?
        一般学习最顶层的内容,因为顶层定义的是这个体系的共性内容。
用什么?
        用底层的内容,因为底层是真正的具体实现,

我们的集合这种容器,由于数据结构不同,所以,java就对应的提供了很多种集合类,供我们使用。
  
数据结构:就是数据的组织(存储)方式。
  
Collection中应该有什么功能
A:添加功能
                boolean add(Object obj):向集合中添加一个元素
                boolean addAll(Collection c):向集合中添加一个集合的元素。
B:删除功能
                void clear():删除集合中的所有元素。
                boolean remove(Object obj):从集合中删除指定的元素
                  boolean removeAll(Collection c):从集合中删除一个指定的集合元素。
C:判断功能
                  boolean isEmpty():判断集合是否为空。
                  boolean contains(Object obj):判断集合中是否存在指定的元素。
                boolean containsAll(Collection c):判断集合中是否存在指定的一个集合中的元素。
D:遍历功能
                Iterator iterator():就是用来获取集合中每一个元素。
E:长度功能
                  int size():获取集合中的元素个数
F:交集功能
                  boolean retainAll(Collection c):判断两个集合中是否有相同的元素。???
G:把集合转换成数组
               
  Object[] toArray():把集合变成数组。
               
                Collection
                        |--List\
                                |--ArrayList  |
                                |--Vector     | --元素有序(指的是存储顺序和取出顺序是否一致),可重复。
                                |--LinkedList |
                        |--Set\
                                |--HashSet    |
                                |--TreeSet    | --元素无序唯一

NoSuchElementException 没有这样的元素异常
it.hasNext 判断it是否还有元素

一次判断一次获取  next();
什么是迭代器?
        其实是集合的一种遍历(一个一个的获取元素)方式。
集合的使用四步走:
        *A: 创建元素对象。
        *B:创建元素对象
        *C:把元素对象添加到集合对象中
        *D:遍历集合对象
                    /\
                    ||
                *a:通过集合对象获取迭代器对象               
                *b: 通过集合对象的hasNext()方法进行判断
                *c:通过迭代器对象的next()进行获取


while(it.hasNext())

  {
        String s= (String)it.next();
        System.out.println(s);
  }
         /\
         ||
   标准的迭代器代码


为什么迭代器定义成接口类型?
  不同集合的数据结构是不一样的  如果定义成一个统一的实现类。
  那么变量不同集合的时候,会不会出问题?会
  但是迭代器一接口的形式定义。规则:hasNext();next();
  又是以具体的某一个集合中以内部类的形式实现。

迭代器源码分析,设计原理。
  Apublic 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;
        }
    }
}



用法:
        //多态
        Collection c = new ArrayList();
        //添加元素
        c.add("hello");
        c.add("world");
        c.add("java");
       
        Iterator it = c.iterator(); //把Itr返回来了,而Itr实现了Iterator接口。所以,这是多态的体现。
        while(it.hasNext())
        {
                String s = it.next();
                System.out.println(s);
        }

List特有的功能
  A:添加功能
             |-->void add(int index, Object obj):在指定位置添加元素
  
  B:删除功能
             |-->Object remove(int index):根据指定索引删除元素,并把删除的元素返回。
  
  C:修改功能
           |-->Object set(int index, Object obj):把指定索引位置的元素修改为指定的值,返回修改前的值。
  
  D:获取功能
             |-->int indexOf(Object o):返回指定元素在集合中第一次出现的索引
           |-->Object get(int index)|:获取指定位置的元素
           |                        |-->有了get(int index)又有了size(),想到了可以有for循环遍历
            |-->ListIterator listIterator():列表迭代器
  
  E:截取功能
           |-->List subList(int fromIndex, int toIndex):截取集合。

并发修改异常:
   * 面试题:
   *            \ConcurrentModificationException:并发修改异常。
   *              \这是个什么异常,怎么产生的,怎么解决的?
   *
   * 怎么产生:
   *             \当我们通过迭代器迭代元素的过程中,又通过集合去添加了元素。这种情况是不允许的。
   *              \因为迭代器是依赖于集合存在的,如果集合发生改变,迭代器也应该相应的发生改变。
   *               \而我们目前看到的确实,迭代器没变,集合变了。所以,报出了一个并发修改异常。
   *
   * 注意问题:通过迭代器遍历集合的时候,是不能通过集合去操作(添加,删除)。
   * 那么,我们可不可以这样理解呢?
   *     ? A:全部通过迭代器操作ListIterator:元素是添加到刚遍历的那个元素后面。
   *          ?        通过迭代器迭代的时候,可以通过迭代器对集合进行操作。
   *     ? B:全部通过集合操作:元素是添加到最后的。
   *                 通过集合普通for遍历的时候,可以通过集合去操作。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马