JavaSE-List集合体系

List集合共性方法


add(index,element);
addAll(index,Collection);


remove(index);


set(index,element);


get(index):
subList(from,to);
listIterator();
int indexOf(obj):获取指定元素的位置。
ListIterator listIterator();

List的特有方法

如上述所描述,凡是可以操作角标的方法都是该体系特有的方法。

List集合的迭代器

概述

List集合特有的迭代器。ListIterator是Iterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。

所以,在迭代器时,只能用迭代器的放过操作元素,由于Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。

范例


public static void sop(Object obj)
	{
		System.out.println(obj);
	}
ListIterator li = al.listIterator();



		while(li.hasNext())
		{
			Object obj = li.next();

			if(obj.equals("java02"))
				li.set("java006");


		}

while(li.hasPrevious())
		{
			sop("pre::"+li.previous());
		}

关于hasNext()的工作原理

如图所示,集合中都会存在一个游标,最开始游标处于第一个元素前方,当调用hasNext()时,游标会判断后面是否有元素。当使用next()后,游标会到下一个元素的前方
JavaSE-List集合体系_第1张图片

List集合中的并发异常

错误解释

如下所示,当使用iterator的迭代器遍历时,若用list独有的add方法添加元素,此时集合的长度加1,导致迭代器不知道是否需要遍历这个元素而导致了并发异常

	while(li.hasNext())
		{
			Object obj = li.next();

			if(obj.equals("java02"))
				li.add("java009");


		}

解决方案

使用List独有的迭代器解决并发异常


		ArrayList al = new ArrayList();

		//添加元素
		al.add("java01");
		al.add("java02");
		al.add("java03");
	ListIterator li = al.listIterator();



		while(li.hasNext())
		{
			Object obj = li.next();

			if(obj.equals("java02"))
				li.set("java006");


		}

List集合remove

问题

明明已被remove了,为什么输出语句还能输出java02这个元素呢

	//演示列表迭代器。
		ArrayList al = new ArrayList();

		//添加元素
		al.add("java01");
		al.add("java02");
		al.add("java03");
Iterator it = al.iterator();

		while(it.hasNext())
		{
			Object obj = it.next();

			if(obj.equals("java02"))
				//al.add("java008");
				it.remove();//将java02的引用从集合中删除了。

			System.out.println("obj="+obj);


		}

答案

remove移除的时集合中对该元素的引用,但是obj还是指向这个元素,所以该元素没有被垃圾回收器回收
JavaSE-List集合体系_第2张图片

ArrayList的前身 Vector

概述

枚举就是Vector特有的取出方式。
发现枚举和迭代器很像。
其实枚举和迭代是一样的。

因为枚举的名称以及方法的名称都过长。
所以被迭代器取代了。
枚举郁郁而终了。

范例

class VectorDemo 
{
	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());
		}
	}
}

LinkList

LinkedList:特有方法

addFirst();
addLast();

getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException

removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException

在JDK1.6出现了替代方法。

offerFirst();
offerLast();

peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。

pollFirst();
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。

范例

class LinkedListDemo 
{
	public static void main(String[] args) 
	{
		LinkedList link = new LinkedList();

		link.addLast("java01");
		link.addLast("java02");
		link.addLast("java03");
		link.addLast("java04");

		//sop(link);
//		sop(link.getFirst());
//		sop(link.getFirst());
		//sop(link.getLast());
		//sop(link.removeFirst());
		//sop(link.removeFirst());

		//sop("size="+link.size());

		while(!link.isEmpty())
		{
			sop(link.removeLast());
		}

	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

ArrayList练习

需求

将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。

注意事项和提示

List集合判断元素是否相同,依据是元素的equals方法。

范例

class Person
{
	private String name;
	private int age;
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	public boolean equals(Object obj)
	{

		if(!(obj instanceof Person))
			return false;

		Person p = (Person)obj;
		//System.out.println(this.name+"....."+p.name);

		return this.name.equals(p.name) && this.age == p.age;
	}
	/**/
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
}
class ArrayListTest2 
{
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		ArrayList al = new ArrayList();

		al.add(new Demo());

		al.add(new Person("lisi01",30));//al.add(Object obj);//Object obj = new Person("lisi01",30);
		//al.add(new Person("lisi02",32));
		al.add(new Person("lisi02",32));
		al.add(new Person("lisi04",35));
		al.add(new Person("lisi03",33));
		//al.add(new Person("lisi04",35));

		
		//al = singleElement(al);

		sop("remove 03 :"+al.remove(new Person("lisi03",33)));//remove方法底层也是依赖于元素的equals方法。


		Iterator it = al.iterator();


		while(it.hasNext())
		{
			Person p = (Person)it.next();
			sop(p.getName()+"::"+p.getAge());
		}
	}


	public static ArrayList singleElement(ArrayList al)
	{
		//定义一个临时容器。
		ArrayList newAl = new ArrayList();

		Iterator it = al.iterator();

		while(it.hasNext())
		{
			Object obj = it.next();

			if(!newAl.contains(obj))
				newAl.add(obj);

		}

		return newAl;
	}
}

ArrayList使用注意事项

需要对自定义集合进行增删改查等操作时,需要注意是否需要定制equals方法,因为list判断相同和查找元素都是一局equals方法

你可能感兴趣的:(JavaSE)