JAVASE之集合框架-----List

为了方便对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式

特点:集合只用于存储对象;集合的长度是可变的,集合可以存储不同类型的对象

 

数组和集合类的区别:

数组的长度是固定的,可以存储基本数据类型

集合的长度是可变的,只能存储对象

 

常见集合类:

Collection

|-----List

|  |-----ArrayList

|  |-----LinkedList

|  |-----Vector

|-----Set

 |-----HashSet

                 |-----TreeSet

每一种容器对应的数据的数据结构都不同

 

List集合中的元素是有序的,并且元素是可以重复的,此集合体系中有索引

  |-----ArrayList:底层的数据结构是数组,线程不同步

  |-----LinkedList:底层的数据结构是链表结构,线程不同步

  |-----Vector:底层是数据结构是数组,线程同步


都是数组ArrayListVector的区别:

二者长度的初始化都是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());
    }

Iterator内部只有判断,取出,移除,三个方法,所以在遍历的时候只能使用对象的add方法来添加,下面的程序说明了不能用add方法的原因
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");//由于此迭代器只能判断、取出、删除,只能用对象添
		}
	}
}
此程序运行时会报错,如下所示:
ConcurrentModificationException

错误分析:

程序执行al.iterator()后,将al的内容全部读取到li中,循环内部,li在取元素,但是对象在添加元素,会产生异常,抛出ConcurrentModificationException

所以不能既用集合又用迭代器同时操作同一组元素,有可能会引发并发修改异常

这时候:列表迭代器ListIterator出世了

 

ListIteratorList集合特有的迭代器,ListIteratorIterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素

因为会发生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)方法,比如当集合中存入的是对象的时候

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值