Collection是Java中提供的一种数据容器,是用来存储数据的。java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。
Collection接口是所有集合的根接口。

image.png

1. Collection接口的基本方法

Collection 接口的基本方法

元素个数:int size()

学习Java中三种长度表现形式

  • 数组.length 属性 返回值 int
  • 字符串.length() 方法,返回值int
  • 集合.size()方法, 返回值int

    判空: boolean isEmpty()

    添加:

  • 尾部追加:boolean add(E e)

  • 添加一个collection:boolean addAll(Collection c)

    删除:

  • 清空:void clear()

  • 删除:boolean remove(Object o) 删除第一个匹配成功的element
  • boolean removeAll(Collection c)

    查找:boolean contains(Object o) 判断对象是否存在于集合中,对象存在返回true.

    Iterator实现类对象:Iterator iterator();

    转换成数组:Object[] toArray()

    流:Stream stream()

    2. Iterator 迭代器

    Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,
    如果有,就把这个元素取出来,继续判断。如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代

    Iterator接口有两个抽象方法:

  • boolean hasNext() 判断集合中还有没有可以被取出的元素,如果有返回true
  • next() 取出集合中的下一个元素
  • remove() 删除当前元素

    使用Iterator接口:

  1. 调用集合的方法iterator()方法,得到Iterator接口的实现类的对象;
  2. 在while循环条件上调用iterator.hasNext()判断集合中是否有元素;
  3. 在while循环内调用方法iterator.next()取出集合中的元素。 ```java Collection coll = new ArrayList(); coll.add(“abc1”); coll.add(“abc2”); coll.add(“abc3”); coll.add(“abc4”); //调用集合的方法iterator()获取出,Iterator接口的实现类的对象 Iterator it = coll.iterator();

//接口实现类对象,调用方法hasNext()判断集合中是否有元素 while(it.hasNext()){ 调用方法next()取出集合中的元素 String s = it.next(); System.out.println(s); }

  1. <a name="t71hd"></a>
  2. ### foreach -- iteration的引申
  3. Collection 继承Iterable接口,Iterable接口允许对象成为foreach的语句的目标。
  4. ```java
  5. for( 数据类型 变量名: 数组或者集合 ){
  6. sop(变量);
  7. }

注意:

在对Collection类进行迭代时,要调用删除元素时必须调用Iterator的remove()方法,而不能调用Collection的remove()方法。

  • 错误写法实例一

    public static void remove(ArrayList<String> list) 
      {
          for (int i = 0; i < list.size(); i++) 
          {
              String s = list.get(i);
              if (s.equals("b")) 
              {
                  list.remove(s);
              }
          }
      }• 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    
  • 错误的原因:这种最普通的循环写法执行后会发现第二个“b”的字符串没有删掉。遍历第一个字符串b时因为符合删除条件,所以将该元素从数组中删除,并且将后一个元素移动(也就是第二个字符串b)至当前位置,导致下一次循环遍历时后一个字符串b并没有遍历到,所以无法删除。针对这种情况可以倒序删除的方式来避免,因为数组倒序遍历时即使发生元素删除也不影响后序元素遍历。

  • 错误写法实例二:

    public static void remove(ArrayList<String> list) 
    {
    for (String s : list)
    {
    if (s.equals("b")) 
    {
    list.remove(s);
    }
    }
    }
    
  • 错误的原因:这种for-each写法会报出著名的并发修改异常:java.util.ConcurrentModificationException

  • 在对Collection类进行迭代时,要调用删除元素时必须调用Iterator的remove()方法,而不能调用Collection的remove()方法。