1、List特有方法:凡是可以操作角标的方法都是该体系特有方法
增
add(index,element);
addAll(index,Collection);
删
remove(index);
改
set(index,element);
查
get(index);
subList(from,to);
listIterator();
各个基本操作代码如下:
import java.util.ArrayList;
import java.util.Collection;
public class ListDemo
{
public static void sop(Object Obj)
{
System.out.println(Obj);
}
public static void main(String[] args)
{
ArrayList L=new ArrayList();
L.add(1);
L.add("asd");
L.add(false);
L.add(100); //增(<span style="color:#ff0000;">其实add(100)这步应称为自动装箱,因为集合类型中存放的是对象的应用,100是数值,不是对象,所以自动装箱为Integer对象</span>)
sop(L); //增加到表尾
L.add(0,true); //增
sop(L); //按角标增加
sop(L.remove(4));//删:返回被删元素
sop(L); //删除了对应元素
sop(L.set(2,50));//改:返回被替代元素
sop(L); //按角标改成对应元素
sop(L.get(3)); //查:返回去的元素
sop(L); //没有删除对应元素
}
}
运行结果如下:
可见,在一个ArrayList对象中,可以存放多种数据,有数值型,布尔型,字符串型,等等!
2、List中特有的迭代器listIterator()
2.1、普通的迭代器iterator()
(1)代码段1(普通的)
Iterator it=L.iterator();
while(it.hasNext())
{
System.out.println("......"+it.next());
}
(2)代码段2(里面有两个next())
Iterator it=L.iterator();
while(it.hasNext())
{
<span style="white-space:pre"> </span>Object O=it.next();
System.out.println("......"+it.next());
System.out.println("Object"+"......"+O);
}
当ArrayList实例L中存有四个元素时
可以看出每次next在取完元素后,自动往后移动一位!
当ArrayList实例L中存有五个元素时
发现报错了,因为五个元素的话,则在第一个next取出第五个元素后,第二个next已经指向空了,因此会报错,所以next与hasNext应成对匹配!
(3)代码段3(在迭代器中进行增删改查操作)
Iterator it=L.iterator();
while(it.hasNext())
{
Object O=it.next();
if(O.equals((50)))
L.remove(O);
sop(L);
System.out.println("......"+O);
//System.out.println("Object"+"......"+O);
}
可以发现报错了,因为在对集合元素操作,有两种方式,一种为迭代器,一种为对对象的普通操作。在使用一般迭代器这种方法时,每次next的同时,又进行对对象操作的方式如:增加元素等操作,会造成它指向混乱的,因此其不允许在迭代过程中再对集合对象进行操作,而iterator所具有的方法只有三种,满足不了需要,针对此,Java为List集合实现了iterator的子接口listIterator!
2.2、List集合中特有的迭代器listIterator
具备了增删改查的功能,其方法定义如下:
代码如下:
ListIterator it=L.listIterator();
while(it.hasNext())
{
Object O=it.next();
if(O.equals((50)))
{
it.remove(); //删除元素
}
it.add(50); //增加元素
sop(L);
System.out.println("......"+O);
}
其中L的原数据为:[true, 1, 50, false, 123],结果迭代器中remove与add的操作后,结果如下:
这段程序的结果可以好好分析下,蛮有意思的,了解next、remove、add操作后的其迭代器”指针“的具体变化情况!
3、List中3个常见的子类对象:
|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
ArrayList:是可变长度数组,初始化时容量为10,当存储元素超过10个时,从新new一个新的数组,并延长50%,即容量为15;
Vector:是固定长度数组,初始化时容量为10,当存储元素超过10个时,从新new一个新的数组,并延长100%,即容量为20;
3.1、Vecor
凡是Vector中带有Element的方法都是Vextor的特有方法,如addElement,elementAt……
重点:elements()方法
调用代码如下:
Vector v=new Vector();
v.add(123);
v.add(false);
v.addElement("djfkl");
Enumeration t=v.elements();
while(t.hasMoreElements())
sop(t.nextElement());
可见,这种取出方式类似于迭代器,称之为 枚举,其实枚举和迭代是一样的,枚举是Vextor特有的取出方式,因为枚举的名称和方法名称都过长,因此被迭代器取代了,但是在之后IO流中还会遇到,故提前说一声!
3.2、LinkedList
addFirst();
addLast();
getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法。
offerFirst();
offerLast();
peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst();
pollLast();获取元素,但是元素被删除。如果集合中没有元素,会返回null。
练习1,用LinkedList实现队列或者堆栈功能,
代码如下;
import java.util.LinkedList;
public class LinkedListTest
{
private LinkedList link;
LinkedListTest()
{
link=new LinkedList();
}
public void myAdd(Object Obj)
{
link.offerLast(Obj);
}
public Object myGet()
{
return link.pollFirst();
}
public boolean isNull()
{
return link.isEmpty();
}
}
public class LinkedListDemo
{
public static void main(String[] args)
{
LinkedListTest L=new LinkedListTest();
L.myAdd("myDuilie01");
L.myAdd("myDuilie02");
L.myAdd("myDuilie03");
L.myAdd("myDuilie04");
sop(L.myGet());
sop(L.myGet());
sop(L.myGet());
sop(L.myGet());
sop(L.myGet());
}
public static void sop(Object Obj)
{
System.out.println("..."+Obj);
}
}
编写的是队列的程序,由结果可以看出其实先见先出,满足要求!
练习2,将ArrayList中的重复元素删除
import java.util.*;
public class ArrayListDemo
{
public static void main(String[] arg)
{
ArrayList L=new ArrayList();
L.add("MyList01");
L.add("MyList02");
L.add("MyList03");
L.add("MyList04");
L.add("MyList04");
L.add("MyList03");
L.add("MyList01");
show(L);
ArrayList newL=singleElement(L);
show(newL);
}
public static ArrayList singleElement(ArrayList L)
{
ArrayList newL=new ArrayList();
Iterator it=L.iterator();
while(it.hasNext())
{
Object obj=it.next();
if(!newL.contains(obj))
newL.add(obj);
}
return newL;
}
public static void show(Object obj)
{
System.out.println(obj);
}
}
结果如下: