集合框架(List 、Set)

数组与集合的不同

数组长度是固定,集合长度可变,数组可以存储基本数据类型,集合只能存储对象

集合创建时:参阅顶层,创建底层;

集合中存储的都是对象的引用(地址);

迭代器:集合中取出元素的方式。

Collection

List

1、有序集合,元素可以重复。因为该集合体系有索引。List集合中判断元素是否相同,依据是元素的equals()方法。

2、List集合特有的迭代器,ListIterator 是Itertor的子接口, 在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生ConcurrenModificationException异常

3、List特有方法。凡是可以操作角标的方法都是该体系特有方法 

增
	void add(int index E element);
	boolean addAll(int index ,Collection c);
删
	Object remove(int index);
改
	Object set(int index,Object element)
查
	Object get(int index);
	List subList(int fromindex,int endindex);

4、ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删稍慢;线程不同步

5、 LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询速度稍慢。

LinkedList特有方法:如果集合中没有元素,会出现NoSuchElementsException

 

JDK1.6中出现了替代方法
public boolean offerFirst(E e)    //在此列表的开头插入指定的元素
public boolean offerLast(E e)   //在此列表末尾插入指定的元素。
public E  peekFirst()   //获取但不移除此列表的第一个元素;如列表为空,则返回 null
public E peekLast()    //获取但不移除此列表的最后一个元素;如列表为空,则返回 null
public E pollFirst()    //获取并移除此列表的第一个元素;如列表为空,则返回 null

 

 

Vector

底层是数组数据结构。线程同步。被ArrayList替代了。枚举是Vector特有的取出方法。其实枚举和迭代时一样的。因为枚举的名称和方法名称都过长,所以被迭代器取代了。     

Set

元素是无序(存入和取出的顺序不一定一致),元素不可以重复,该集合体系中没有索引。

HashSet

1、底层数据结构是哈希表,可以快速查找所需要的对象,线程是不同步。

2、通过元素的两个方法,hashcode和equals保证元素的唯一性。

         如果元素的hashcode值相同,才会判断equals是否为true;

         如果元素的hashcode值不同,不会调用equals()方法;

注:判断元素是否存在,及删除等操作,依赖的也是hashcode和equals()方法。

TreeSet

1、是一个有序集合,自动对元素进行排序,可以按照任何顺序将元素插入该集合,但当对该集合进行迭代时,各个值将自动以排序后的顺序出现。

2、底层数据结构是二叉树。保证元素唯一性的依据是:compareTo()方法 return 0;

3、TreeSet默认排序方式:让元素自身具备比较性,元素需要实现comparable接口,覆盖compareTo()方法。

4、TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数

实现比较器:定义一个类,实现comparator接口,覆盖compare()方法。注:当两种排序都存在时,以比较器为主;

/*实例:使用LinkedList模拟一个堆栈或者队列数据结构
堆栈:先进后出;如同一个杯子;
队列:先进先出。如同一个水管;
*/
public class LinkedListTest
{
	public static void main(String[] args)
	{
		Queue qu = new Queue();
		qu.myAdd("java01");
		qu.myAdd("java02");
		while(!qu.isNull())
		{
			sop(qu.myGet());
		}
	}
}
class Queue
{
	private LinkedList link;
	Queue()
	{
		link = new LinkedList();
	}
	public void myAdd(Object obj)
	{
		link.addFirst(obj);
	}
	public Object myGet()
	{
		return link.removeFirst();
	}
	public boolean isNull()
	{
		return link.isEmpty();
	}
}
/*
实例:将自定义对象作为元素存到ArrayList集合中,并去除重复元素
List集合中判断元素是否相同,依据是元素的equals方法。
*/
	public static ArrayList singleElement(ArrayList al)
	{
		ArrayList newal = new ArrayList();
		for(Iterator it = al.iterator();it.hasNext();)
		{
			Object obj = it.next();
			if(!newal.contains(obj))
			{
				newal.add(obj);
			}
		}
		return newal;
	}

你可能感兴趣的