第一部分:Collection集合容器与Iterator迭代器
Collection集合容器
1.add方法的参数类型是Object,以便于接受任意类型的对象。
2.集合中存储的都是对象的引用(地址)
什么是迭代器: 就是集合的取出元素的方式。
把取出方式定义在集合的内部,这样取出方式就可以直接访问集合的元素。因此取出方式被定义成内部类
而每一个容器的数据结构不同,取出的动作细节也不一样。但都有共性内容:判断和取出。
那么可以将这些共性抽取,封装成一个接口:Iterator。
如何获取集合的取出对象?
通过一个对外提供的方法:c.iterator();
Iterator it =al.iterator();
while(it.hasNext()){
sop(it.next());
}
高效的用法(for循环结束后迭代器会释放,节省内存空间):
for (Iteratoritr = al.iterator(); itr.hasNext(); )
sop(itr.next());
}
public static voidmethod_retain(){
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);
sop(al1);
}
public static voidbase_Method(){
//创建一个集合容器,使用Collection接口的子类:ArrayList
ArrayList al =new ArrayList();
//1.添加元素:
//add(Objectobj);addAll(Collection c)将c中所有元素添加到当前集合中
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
sop(al);
//2.获取集合长度(对象个数)
//sop(al.size);
//3.删除元素
//al.remove("java02");
//al.removeAll(Collection c);删除两个集合交集
//al.clear();//清空集合
//4.判断
//al.contains("java03");//boolean
//al.isEmpty();//boolean
}
public static voidsop(Object obj){
System.out.println(obj);
}
}
--------------------------------------------------------------------------------------------------
第二部分:List集合容器(Vector,ArrayList以及LinkedList)
Collection
|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层是数组数据结构。特点:查询快,增删慢。[线程不同步]
|--LinkedList:底层使用的是链表结构。特点:查询慢,增删快。
|--Vector:底层是数组数据结构。[线程同步]
|--Set:元素是无序的,元素不可以重复。
List:
特有方法:凡是可以操作角标的方法都是该体系特有的方法。
增
add(int index,element);
addAll(intindex,Collection);
删
remove(int index);
改
set(int index,element);
查
get(int index);
subList(int from,intto);
listInterator();
int indexOf(obj);//获取元素的指定位置
ListIteratorlistIterator()
--------------------------------------------------------------------------------------------------
List集合特有的迭代器。ListIterator是Iterator的子接口
在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException(并发修改异常)
所以在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法有限。
如过想要其他的操作如添加,修改等,就需要使用其接口,ListIterator。
该接口只能通过List集合的listIterator方法获取。
ListIterator(API方法摘要):
void add(E e)
将指定的元素插入列表(可选操作)。
boolean hasNext()
以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。
boolean hasPrevious()
如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。
E next()
返回列表中的下一个元素。
int nextIndex()
返回对 next 的后续调用所返回元素的索引。
E previous()
返回列表中的前一个元素。
int previousIndex()
返回对 previous 的后续调用所返回元素的索引。
void remove()
从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。
void set(E e)
import java.util.*;
class ListDemo
{
public static voidmain(String[] args)
{
//演示列表迭代器。
ArrayList al = new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
//在迭代过程中,准备添加或者删除元素。
/ *
for(Iterator it= al.iterator();it.hasNext();)
{
Objectobj = it.next();
if(obj.equals("java02"))
al.add("java008");
//在迭代器操作元素的同时,利用集合操作元素,抛出并发修改异常
sop(obj);
}* /
for(ListIteratorlit = al.listIterator();lit.hasNext();)
{
Objectobj = lit.next();
if(obj.equals("java02"))
//lit.add("java04");
lit.set("java006");
sop(obj);
}
sop(al);
}
public static voiddisplayMethod(){
ArrayList al =new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
//在指定位置添加元素。
al.add(1,"java09");
//删除指定位置的元素。
al.remove(2);
//修改元素
al.set(2,"java007");
//通过角标获取元素
sop(al.get(1));
//获取所有元素
for (int i =0;i<al.size() ;i++ )
{
sop(al.get(i));
}
//迭代器获取所有元素
for(Iterator it= al.iterator();it.hasNext();)
sop(it.next());
//通过indexOf获取对象的位置
sop(al.indexOf("java007"));
//获取列表的子列表
List sub =al.subList(0,2);
sop(sub);
}
public static voidsop(Object obj){
System.out.println(obj);
}
}
--------------------------------------------------------------------------------------------------
LinkedList特有方法:
addFirst();addLast();
getFirst();getLast();
获取元素,但是不删除元素。如果集合中没有元素,则抛出无此元素异常
removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,则抛出无此元素异常
JDK1.6后出现的替代方法:
offerFirst();offerLast();
peekFirst();peekLast();
获取元素,但是不删除元素。如果集合中没有元素,则返回null。
pollFirst();pollLast();
获取元素,但是元素被删除。如果集合中没有元素,则返回null。
--------------------------------------------------------------------------------------------------
使用LinkedList模拟一个堆栈或者队列数据结构。
堆栈:LIFO 队列:FIFO
import java.util.*;
class StackDemo
{
private LinkedList link ;
StackDemo(LinkedListlink){
this.link =link;
}
public void push(Object obj){
link.offerFirst(obj);
}
public Object pop(){
returnlink.pollFirst();
}
public booleanisNull(){
returnlink.isEmpty();
}
}
class QueueDemo
{
private LinkedList link = new LinkedList();
QueueDemo(LinkedListlink){
this.link =link;
}
public void in(Objectobj){
link.offerFirst(obj);
}
public Object out(){
return link.pollLast();
}
public booleanisNull(){
returnlink.isEmpty();
}
}
class Test
{
public static voidmain(String[] args){
LinkedList link1=new LinkedList();
LinkedListlink2 = new LinkedList();
StackDemo stack = new StackDemo(link1);
QueueDemo queue= new QueueDemo(link2);
stack.push("java01");
stack.push("java03");
stack.push("java05");
stack.push("java07");
sop(link1);
queue.in("java02");
queue.in("java04");
queue.in("java06");
queue.in("java08");
sop(link2);
sop(stack.pop());
sop(queue.out());
sop(link1);
sop(link2);
}
public static voidsop(Object obj){
System.out.println(obj);
}
}
(***重要***2012/4/25)
练习二:将自定义对象作用为元素存到ArrayList集合中,并去除重复元素。
如:存人为对象,同名同年龄视为同一人。
List集合判断元素是否相同,依据的是元素的equals方法。
!!!判断元素是否相同的场合:booleanremove(obj);boolean contains(obj);
import java.util.*;
class Person
{
private String name;
private int age;
Person(String name, intage){
this.name =name;
this.age = age;
}
public StringgetName(){
return name;
}
public int getAge(){
return age;
}
public booleanequals(Object obj){//重写才能进行自定义的条件比较
//更严谨的话,可以直接抛异常
if (objinstanceof Person) return false;
Person p=newPerson();
if ( this.name .equals(p.name)&&this.age==p.age)
returntrue;
else returnfalse;
}
}
class ArrayListTest
{
public static voidmain(String[] args){
ArrayList al =new ArrayList();
al.add(newPerson("mike01",20));
al.add(newPerson("mike02",30));
al.add(newPerson("mike02",30));
al.add(newPerson("mike03",25));
al.add(newPerson("mike04",35));
al.add(newPerson("mike04",35));
al =removeSame(al);
Iterator it =al.iterator();
while(it.hasNext())
{
Person p =(Person)it.next();//需要将Object向下转型成Person
sop(p.getName()+":"+p.getAge());
}
}
public static voidsop(Object obj){
System.out.println(obj);
}
public static ArrayListremoveSame(ArrayList al){
//临时容器
ArrayList newAl= new ArrayList();
Iterator it =al.iterator();
while(it.hasNext())
{
Objectobj = it.next();
if(!newAl.contains(obj))//contains里调用了equals方法,Person类里需要重写该方法。
newAl.add(obj);
}
return newAl;
}
}