java基础(17)、集合类(1:Collection)

时间:2023-02-15 07:40:22

一.  什么是集合类?

二.  Collection接口

  2.1  Collection子接口(List接口和Set接口)

  2.1  Collection的常用方法

三.  迭代器(Iterator)

  3.1  关于迭代器

  3.2  迭代其的用法

  3.3  迭代器的简化:增强for循环

  3.4  使用迭代器向集合添加元素

四.  List接口

  4.1  List接口的方法

  4.2  List接口的实现类

  4.3  List遍历的方法

  4.4  并发修改异常

 

 


一.  什么是集合类?

  放了方便对多个对象操作,需要一个能对对象存储的容器,它得具备:1、可以存不同的对象类型,2、容器的长度可变(放多少个对象进来就有多大);

就酱~~ 满足这要求的容器就是集合啦;特点如下图~ 

java基础(17)、集合类(1:Collection)

 


 

二.  Collection接口

Collection:集合框架的顶层接口。表示一组对象,这些对象也称为 collection 的元素。

java基础(17)、集合类(1:Collection)

 

2.1  Collection子接口

Collection有两个子接口,他们的特点是:

  List接口:可存放重复的元素,元素存取是“有序”的;

  Set接口:不可以存放重复的元素,通常元素存取是“无序”的,也有一些实现类是“有序”的。

注意:上方提到的“有序,无序”指的是存放元素时是否会记住元素的存放顺序;并非对元素进行“排序”。 

java基础(17)、集合类(1:Collection)

 

2.2  Collection接口中的常用方法【返回类型  方法名(形参)】

添加操作

  • boolean add(boject e):确保此 collection 包含指定的元素(可选操作)。
  • boolean addAll(Collectiong c):将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。

删除操作

  • void clear():移除此 collection 中的所有元素(可选操作)。
  • boolean remove(object o):从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
  • boolean removaAll(Collection c): 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。

查询操作

  • int size():返回此 collection 中的元素数

判断操作

  • boolean isEmpty():如果此 collection 不包含元素,则返回 true
  • boolean contains(Object obj):如果此 collection 包含指定的元素,则返回 true
  • boolean containsAll(Collection c):如果此 collection 包含指定 collection 中的所有元素,则返回 true

迭代操作

  • Iterator iterator():返回在此 collection 的元素上进行迭代的迭代器。

 


 

三.  迭代器:Iterator

 

3.1  关于迭代器

迭代是取出集合中元素的一种方式,因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器;迭代器的next方法返回值类型是Object,所以要记得类型转换。

迭代器读取元素示意图

java基础(17)、集合类(1:Collection)

1     Collection c = new ArrayList();    //创建集合对象
2     Iterator it = c.iterator();    //获取此集合的迭代器
3     while(it.haxNext()){        //遍历这个集合
4         Object o = it.next();
5     }

  说明

  1、迭代器不保证取出元素的顺序和存入的顺序一致,“有些”是靠集合实例本身保证的;

  2、迭代器本身是一个接口,该方法返回的是一个迭代器实例对象,通常使用的是接口多态使用迭代器;

  3、迭代器中常用的两个方法是:

    boolean hasNext():判断是否有下一个元素;

    boolean next();取出下一个元素。 

 

3.2  迭代器的两种用法 

 1  //迭代器用法一
 2  for(Iterator iter = iterator();iter.hasNext();){
 3      System.out.println(iter.next());
 4  }
 5  
 6  //迭代器用法二
 7  Iterator iter = l.iterator();
 8  while(iter.hasNext()){
 9      System.out.println(iter.next());
10  }

3.3  增强for循环:迭代器的一种简化方法

1     //for(数据类型 迭代变量名:集合对象)
2     for(Object obj : c){ 3         //do something with obj
4     }

 

3.4  如何使用迭代器添加集合元素?

iterator接口没有添加元素的方法,但是它的子接口ListIterator有,故:用ListIterator迭代,迭代器添加元素。(集合本身迭代,使用集合本身方法添加元素,如add

 


 

四.  List接口

4.1  List接口方法

特有方法

  • void add(int index,Object element):在列表的指定位置插入指定元素(可选操作)。
  • Object get(int index):返回列表中指定位置的元素。
  • Object set(int index,Object element):用指定元素替换列表中指定位置的元素(可选操作)。

 

4.2  List接口的实现类

  • ArrayList:线程不安全,查询速度块,底层用的是数组,增删慢;
  • LinkedList:线程不安全,链表结构,增删速度快,查询慢;
  • Vector:线程安全,但速度慢,已被ArrayList替代

4.3  List接口遍历的方法

1.  迭代器遍历

1 //迭代器遍历list
2 Iterator it = list.iterator(); 3 while(it.hasNext()){ 4     Object obj = it.next(); 5  System.out.println(obj); 6 }

2.  增强for循环

1 //增强for循环遍历集合
2 for(Object obj : list){ 3  System.out.println(obj); 4

3.  普通for循环配合get方法

1 //普通for循环,获取指定位置的元素
2 for(int i = 0;i<list.size();i++){ 3  System.out.println(list.get(i)); 4 }

 

4.4  并发修改异常

在使用迭代器遍历ArrayList的时候,若使用集合本身的方法修改了集合,将导致并发修改异常:ConcurrentModificationException,故需注意:

  • 使用迭代器遍历,使用迭代器删除元素
  • 使用集合本身遍历,使用集合本身方法删除元素

 

vector类

Vector类是1.0就已经有的,在1.2被整合到集合框架中,其中的大部分方法都和ArrayList相同,但它是线程安全的,所以效率要低,特有方法:

  • void addElement(E obj):将指定的组件添加到此向量的末尾,将其大小增加1。
  • void removeElement():从此向量中移除全部组件,并将其大小设置为零。
  • elements():返回此向量的组件的枚举。

 


LinkedList类

LinkedList类底层使用的是链表结构保存数据,绝大多数方法和ArrayList相同,只不过多了一些对首尾元素操作的方法

  • void addFirst(E e):将指定元素插入此列表的开头。
  • void addLast(E e):将指定元素添加到此列表的结尾。
  • E remove():获取并移除此列表的头(第一个元素)。

LinkedList底层使用的是链表,但是自己维护了一个索引,所以提供了get(int index)的方法来通过索引获取元素,但此方法的效率很低,一般不使用

 


 

小结:List接口的实现类选择

 

  是否需要线程安全: 如果是,可以选择Vector,但是可以通过其他方式让其他两种类也达到线程安全的,所以一般也不会使用Vector;

  如果不是,考虑是增删多还是查询多,增删多:使用LinkedList;查询多:使用ArrayList