面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。集合和数组一样是一个容器,可以进行数据的存储,但集合和数组不同的是,集合只能存储引用数据类型,而且集合对数据操作起来比较方便。
一、集合和数组的区别
1. 长度区别
数组的长度是固定的,而集合的长度是可变的
2. 存储数据类型的区别:
数组可以存储基本数据类型 , 也可以存储引用数据类型; 而集合只能存储引用数据类型
3.内容区别:
数组只能存储同种数据类型的元素 ,集合可以存储不同类型的元素
二、Collection集合
Collection是一个顶层父接口,他的下面有List和Set两个子接口,而实现类在List ( ArrayList、LinkedList、Vector )和Set(hashSet、TreeSet、LinkedHashSet)接口下,所以在使用Collection集合时,需要用多态来创建,格式如下:
Collection collection=new ArrayList();
Collection collection=new Vector();
使用Collection集合我们可以对元素进行增删,判断等功能。但是在使用前,我们需要创建它的实例化对象,使用方法如下:
1.添加功能
-
boolean add(E e) :向集合中添加对象。
-
boolean addAll(Collection c) :将一个集合中的所有元素添加到另一个集合中。
2.删除功能
- void clear():移除集合中的所有元素。
- boolean remove(Object o):移除集合中的一个元素。
- boolean removeAll(Collection c):移出一个集合中与c集合的交集元素,c集合中的元素不变。如果删除成功返回true,否则为false。
3.判断功能
- boolean contains(Object o):判断集合中是否包含该指定的元素 。
- boolean containsAll(Collection c):判断一个集合是否是另一个集合的子集,如果是返回 true 否者为false。
- boolean isEmpty():判断集合是否为空。
4.获取功能
集合中可以通过 for 循环进行遍历每个元素,也可以通过迭代器(Iterator)进行获取每个元素。迭代器中有两个方法:
- boolean hasNext ():如果仍有元素可以迭代,则返回 true。
- E next ():返回迭代的下一个元素
这两个方法配合使用可以获取集合中的每个元素,使用方式如下:
public class MyTest {
public static void main(String[] args) {
Collection collection1 = new ArrayList();
collection1.add("张三");
collection1.add("李四");
collection1.add(56);
//获取一个迭代器
Iterator iterator = collection1.iterator();
System.out.println(iterator);
while (iterator.hasNext()){
Object obj = iterator.next();
System.out.println(obj);
}
- boolean retainAll(Collection c):获取两个集合的交集元素。
- int size():获取集合中元素的个数与数组的 length() 类似。
5.转换功能
- Object[] toArray():通过这个方法把集合转换为数组。
三、List集合
List 是Collection集合的子接口,它拥有自己特有的一些功能:
- void add(int index,E element): 在指定索引处添加元素
- E remove(int index):移除指定索引处的元素,返回被移除的元素。
- E get(int index):获取指定索引处的元素
- E set(int index,E element):更改指定索引处的元素 返回的而是被替换的元素
List集合中有自己迭代器(ListIterator ),使用方法和 Iterator 一样。有时候在我们使用迭代器遍历集合中的元素时,会发生报错 ConcurrentModificationException (并发修改异常),原因是我们的迭代依赖于集合,当我们向集合中添加好了元素之后 获取迭代器时,此时迭代器已经自动计算出了元素的个数 ,然后这个时候我们在遍历的时候又突然想向集合里面加一个元素(用的是集合的add方法)那么迭代器就无法处理,所有就报错。
要解决这个问题我们就需要使用迭代器自带的 add() 方法 (ListIterator的特有功能add),或者使用 for循环遍历,然后添加元素。
List的三个子类的特点(ArrayList,Vector,LinkedList)
- ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。 - Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。 - LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。