集合框架的特点:
1:对象封装数据,对象多了也需要存储。集合用于存储对象。
2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合。因为集合是可变长度的。
Collection
|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList: 底层使用的是数组数据结构。 特点:查询速度快,但是增删稍慢。线程不同步。
|--LinkedList:底层使用的是链表数据结构。 特点:增删速度很快,查询稍慢。
|--vector: 底层使用的是数组数据结构。 线程同步,被ArrayList替代。
|--Set:元素是无序的,元素不可以重复,该集合中没有索引。
Collection中的方法:
1、添加:
add(object):添加一个元素
addAll(Collection) :添加一个集合中的所有元素。
2、删除:
clear():将集合中的元素全删除,清空集合。
remove(obj) :删除集合中指定的对象。
removeAll(collection) :删除部分元素。部分元素和传入Collection一致。
3、判断:
boolean contains(obj) :集合中是否包含指定元素 。
boolean containsAll(Collection) :集合中是否包含指定的多个元素。
boolean isEmpty():集合中是否有元素。
4、获取:
int size():集合中有几个元素。
5、取交集:
boolean retainAll(Collection) :对当前集合中保留和指定集合中的相同的元素。如果两个集合元素相同,返回flase;如果retainAll修改了当前集合,返回true。
6、获取集合中所有元素:
Iterator iterator():迭代器
7、将集合变成数组:
toArray();
class Demo
{
public static void main(String[] args)
{
method_get();
}
public static void method_get()
{
ArrayList al=new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
/*
Iterator it=al.iterator();//获取迭代器,用于取出集合中的元素。
while(it.hasNext())
{
System.out.println(it.next());
}
*/
for(Iterator it=al.iterator();it.hasNext();)
{
System.out.println(it.next());
}
}
public static void base_method_2()
{
ArrayList al1=new ArrayList();
al1.add("java01");
al1.add("java02");
al1.add("java03");
al1.add("java04");
ArrayList al2=new ArrayList();
al2.add("java01");
al2.add("java02");
al2.add("java05");
al2.add("java06");
// al1.retainAll(al2);//取交集,al1中只会保留和al2中相同的元素。
al1.removeAll(al2);//删除al1中与al2共有的元素。
System.out.println("al1:"+al1);
System.out.println("al2:"+al2);
}
public static void base_mathod()
{
//创建一个集合容器。使用Collection借口的子类。ArrayList
ArrayList al=new ArrayList();
//1.添加元素。
al.add("java01");//add(Object obj);
al.add("java02");
al.add("java03");
al.add("java04");
//打印集合
System.out.println(al);
//2.获取个数。集合长度。
System.out.println("size="+al.size());
//3.删除元素
// al.remove("java02");
// al.clear();//清空集合
// System.out.println(al);
//4.判断元素
System.out.println("java03是否存在:"+al.contains("java03"));
System.out.println("集合是否为空:"+al.isEmpty());
}
}
List:特有方法,凡是可以操作角标的方法都是该体系特有的方法。
增:
add(index,element);
addAll(index,Collection);
删:
remove(index);
改:
set(index,element);
查:
get(index);
subList(from,to);
listIterator();
List集合特有的迭代器。ListIterator是Iterator的子接口
在跌倒时,不可以通过集合对象的方法操作集合中的元素,
因为会放生ConcurrentModificationException异常(并发修改异常)。
所以在跌倒时只能用迭代器的方法操作元素,可是Iterator的方法是有限的。
只能对元素进行判断,取出,删除的操作,
如果想要其他的操作,如添加,修改等,就需要使用其子接口,ListIterator。
该接口只能通过List集合的listIterator方法获取。
class Demo
{
public static void main(String[] args)
{
//演示列表迭代器
ArrayList al=new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
System.out.println(al);
ListIterator li=al.listIterator();
System.out.println("hasPrevious():"+li.hasPrevious());
for(;li.hasNext();)
{
Object obj=li.next();
if(obj.equals("java02"))
{
// li.add("java009");
li.set("java006");
}
}
System.out.println("hasNext():"+li.hasNext());
System.out.println("hasPrevious():"+li.hasPrevious());
System.out.println(al);
//逆向遍历
while(li.hasPrevious())
{
System.out.println(li.previous());
}
/*
//在跌代过程中,准备添加或者删除元素。
for(Iterator it=al.listIterator();it.hasNext();)
{
Object obj=it.next();
if(obj.equals("java02"))
{
// al.add("java008");
it.remove();//将java02的引用从集合中删除
}
System.out.println(obj);
}
System.out.println(al);
*/
}
public static void method()
{
ArrayList al=new ArrayList();
//添加元素
al.add("java01");
al.add("java02");
al.add("java03");
System.out.println(al);
//在指定位置添加元素
al.add(1,"java09");
System.out.println(al);
//删除指定位置元素
// al.remove(2);
// System.out.println(al);
//修改元素
// al.set(2,"java007");
// System.out.println(al);
//通过角标获取元素
// System.out.println(al.get(1));
//获取所有元素
// for(int x=0;x<al.size();x++)
// {
// System.out.println("al["+x+"]="+al.get(x));
// }
// for(Iterator it=al.listIterator();it.hasNext();)
// {
// System.out.println(it.next());
// }
//通过indexOf获取对象位置
System.out.println("java02的index="+al.indexOf("java02"));
//截取List
List sub=al.subList(1,3);
System.out.println("sub="+sub);
}
}
LinkedList:特有方法:
addFirst();
addLast();
getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst();
removeLast();
获取元素,但元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6中出现了替代方法
offerFirst();
offerLast();
peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null
pollFirst();
pollLast();
获取元素,但元素被删除。如果集合中没有元素,会返回null
练习:
使用LinkedList模拟一个堆栈或者队列数据结构
堆栈:先进后出 如同一个杯子。
队列:先进先出 如同一个水管。First in First out (FIFO)
class Demo
{
public static void main(String[] args)
{
DuiLie dl=new DuiLie();
dl.myAdd("java01");
dl.myAdd("java02");
dl.myAdd("java03");
dl.myAdd("java04");
while(!dl.isNull())
{
System.out.println(dl.myGet());
}
}
}
class DuiLie
{
private LinkedList link=null;
DuiLie()
{
link=new LinkedList();
}
public void myAdd(Object obj)
{
// link.addFirst(obj);
link.offerFirst(obj);
}
public Object myGet()
{
// return link.removeLast();//队列
// return link.removeFirst();//堆栈
return link.pollLast();//队列
// return link.pollFirst();//堆栈
}
public Boolean isNull()
{
return link.isEmpty();
}
}
枚举就是vector特有的取出方式。
发现枚举和迭代器很像,其实枚举和跌代是一样的。
因为枚举的名称以及方法的名称都过长。
所以被迭代器取代了。
class Demo
{
public static void main(String[] args)
{
Vector v=new Vector();
v.add("java01");
v.add("java02");
v.add("java03");
v.add("java04");
Enumeration en=v.elements();
while(en.hasMoreElements())
{
System.out.println(en.nextElement());
}
}
}