为了方便对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式
特点:集合只用于存储对象;集合的长度是可变的,集合可以存储不同类型的对象
数组和集合类的区别:
数组的长度是固定的,可以存储基本数据类型
集合的长度是可变的,只能存储对象
常见集合类:
Collection
|-----List
| |-----ArrayList
| |-----LinkedList
| |-----Vector
|-----Set
|-----HashSet
|-----TreeSet
每一种容器对应的数据的数据结构都不同
List集合中的元素是有序的,并且元素是可以重复的,此集合体系中有索引
|-----ArrayList:底层的数据结构是数组,线程不同步
|-----LinkedList:底层的数据结构是链表结构,线程不同步
|-----Vector:底层是数据结构是数组,线程同步
都是数组ArrayList和Vector的区别:
二者长度的初始化都是10,但是当长度不够时:
ArrayList重新new一个新的ArrayList,长度50%增长,把原来的copy到新的集合中
而Vector当长度超过十时,长度100%延长,也就是2倍延长。
Vector是JDK1.0的,而ArrayList是JDK1.2。Vector出现的时候集合框架还没出现。
List特有方法:凡是可以操纵角标的方法都是该体系的特有方法
增删改查:
增:add(index,element)
addAll(index,Collection);
删:remove(index)
改:set(index,element);
查:get(index);
subList(from,to);
indexOf(obj)
集合的取出方式和数组的大不相同,使用迭代器对其进行遍历
迭代器:
对于取出元素操作不止一个动作(包括判断有无元素),因为每个集合的的数据结构不同,所以取出动作细节也不同,但都有共性方法(判断,取出),抽取出来形成一个接口。
所以通过一个类描述取出方式,每个类的实现方式不一样,这个类定义在集合内部,由于元素在集合内部,所以定义为内部类最方便。这些内部类都符合一个规则,该规则是Iterator。
将取出动作封装成一个对象,而对象在内部实现,通过iterator()方法获取集合的取出对象
Iterator取出方法演示:
ArrayList al = new ArrayList();
al.add("simba1");
al.add("simba2");
for(Iterator li = al.iterator();li.hasNext();)
{
System.out.println(li.next());
}
import java.util.*;
class ListDemo
{
public static void main(String[] args)
{
ArrayList al = new ArrayList();
//添加元素
al.add("simba1");
al.add("simba2");
al.add("simba3");
al.add("simba4");
Iterator li = al.iterator();
while(li.hasNext())
{
Object obj = li.next();
if(obj.equals("simba1"))
al.add("java09");//由于此迭代器只能判断、取出、删除,只能用对象添
}
}
}
错误分析:
程序执行al.iterator()后,将al的内容全部读取到li中,循环内部,li在取元素,但是对象在添加元素,会产生异常,抛出ConcurrentModificationException
所以不能既用集合又用迭代器同时操作同一组元素,有可能会引发并发修改异常
这时候:列表迭代器ListIterator出世了
ListIterator是List集合特有的迭代器,ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素
因为会发生ConcurrentModificationException异常
所以,在迭代时,只能用迭代器的方法操作元素,但是Iterator的方法是有限的
只能对元素进行判断,取出,删除的操作
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator
该接口只能通过List集合的listIterator方法获取
将上述程序的Iterator换成ListIterator就可以执行成功
LinkedList
LinkedList特有方法:
addFirst(e):将指定元素插入次列表的开头
addLast(e)
获取元素但不删除元素,获取不到会抛出NoSuchElementException异常
getFirst():
getLast()
获取元素,但是元素被删除,如果集合中没有元素,或出现异常NoSuchElementException
removeFirst();
removeLast();
在JDK1.6出现了替代方法
offerFirst():将指定元素插入次列表的开头
offerLast();
获取元素,但不删除元素,如果集合中没有元素,会返回null
peekFirst();
peekLast();
获取元素,但是元素被删除,如果集合中没有元素,会返回null
pollFirst();
pollLast();
LinkedList具体方法演示,构建栈或者队列
/*
使用LinkedList模拟一个堆栈或者队列数据结构
*/
import java.util.*;
class Queue
{
private LinkedList link;
Queue()
{
link = new LinkedList();
}
public void myAdd(Object obj)
{
link.addFirst(obj);
}
public Object myGet()
{
return link.removeLast();//改为First即为堆栈
}
public boolean isNull()
{
return link.isEmpty();
}
}
class LinkedListTest
{
public static void main(String[] args)
{
Queue q =new Queue();
q.myAdd("simba1");
q.myAdd("simba2");
q.myAdd("simba3");
q.myAdd("simba4");
while(!q.isNull())
{
System.out.println(q.myGet());
}
}
}
vetcor
Vector与其他两者不同的是,特有取出方式是枚举,其实和迭代器的功能相同
Vector属于比较元老级的集合,枚举演示:
class VectorDemo
{
public static void main(String[] args)
{
Vector v =new Vector();
v.add("simba1");
v.add("simba2");
v.add("simba3");
v.add("simba4");
Enumeration en = v.elements();
while(en.hasMoreElements())
{
System.out.println(en.nextElement);
}
}
}
Notes:
List 中的元素是可以重复的,若需要去掉重复的元素,则需要contains(obj),
底层调用的是equals(obj)方法,覆盖了Object类中的equals,
所以有时候需要根据需求重写equals(obj)方法,比如当集合中存入的是对象的时候