淘先锋技术网

首页 1 2 3 4 5 6 7
集合:
1 由来:
面向对象语言会产生很多对象,为了对这些对象进行存储,操作,就产生了集合。集合存放的是对象的地址,操作的对象是对象。他是可变长度的。
对象用于封装特有数据,对象多了需要存储,如果对象的个数不定,则使用集合进行存储。
2.特点:
1.集合是用于存储对象的容器
2.集合的长度是可变的。
3.集合中不可以存储基本数据类型值。这是它和数组的重要区别之一。
3.每个容器都有自己的特点,所有的容器都有其共性。集合容器因为内部的数据结构不同,有多种具体容器,不断向上抽取,就形成了集合框架,框架的顶层Collection接口

4.Collention的常见方法:

	1.添加:
	Boolean add(Object o);
	Boolean addAll(Collection c);//有重复元素时重复添加。
	2.删除:
	Boolean remove(Object o);		//会改变集合的长度
	Boolean removeAll(Collection c);//将两个集合中的相同元素从调用者集合中删除掉,注意删除的是相同的元素。
	void clear();					//清空,容器还在。
	3.判断:
	Boolean contains(Object o);//包含
	Boolean containsAll(Collection c);//必须包含所有元素才返回true。
	Boolean isEmpty();	//判断集合是否为空
	4.获取:
	int size();//获取集合的元素个数(长度)。
	Iterator iterator();//迭代器,获取元素。
	5.其他:
	Boolean retainAll(Collection c);//取交集,保留调用者集合中与指定集合相同元素
	Object toArray();//将集合转化成数组
5.迭代器使用:

		Iterator it = Collention子类对象.iterator();//创建迭代器对象
		it.next();			//输出第一个元素
		it.next();			//输出第二个元素,it会自动后移。
		//当迭代器到最后个元素时,即不存在next()时,会出现运行时错误。
		it.hasNext();				//存在下一个时,返回true。
			所以,输出容器中的所有元素,可以使用方法:
				while(it.hasNext()){
					System.out.println(it.next());
				}
			注意:该方法运行结束后,迭代器it还会驻留内存,但是相当于指向容器的末尾,已经没有存在的价值。
				所以更好的使用方法时把迭代器定义成局部变量,相应代码执行结束时释放迭代器资源:
				for(Iterator it = Collention子类对象.iterator();it.hasNext();){
					System.out.println(it.next());
				}
6.迭代器的原理:
迭代器对象必须依赖于具体的容器,因为么一个容器的数据结构都不相同,
所以该迭代器对象是在容器中进行内部实现的,对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器对象即可,也就是iterator方法。
Iterator接口就是对所有Collection子类容器进行元素取出的公共接口。
7.List(列表)和set(集):
List:有序的Collection,也成为序列。此接口的用户可以对列表中的每个元素的插入位置进行精确的控制,即索引。有序的:存入和取出存在一定的序列,顺序一致。每个元素都有角标(索引),可以存在重复的元素
set:不包含重复元的Collection,并且最多包含一个null元素。元素不能重复(与List最大的区分),无序的,内部有一定的存储规则。

List特有的常见方法:可以完成对元素的增删查改。List最大的特点(共性):都可以操作角标(索引)。

	1.添加:
	void add(index,element);
	void add(index,collection);
	2.删除:
	Object remove(index);		//返回被删除的对象。
	3.修改
	Object set(index,element);		//返回修改前的对象,需要注意的是:在Vector也有该方法,不过在Vector中set方法中参数顺序与其正好相反。前对象后下标。
	4.获取:
	Object get(index);				//返回角标代表的对象,特有的方式。
	int indexOf(Object);
	int lastIndexOf(Object);
	List subList(from,to);			//返回截出的对象
5.在迭代器过程中不要使用集合操作元素,因为容易出现异常。
为了避免异常,且完成相应的操作,可以使用Iterator接口的子接口列表迭代器(listIterator)。
它可以实现在迭代的过程中完成对元素的增删查改。
注意:只有在List集合中才存在该迭代器功能。
6.list下的重要的集合:
Vector:内部是数组数据结构。连续存储,每个元素带有索引,大小可根据需要增大或减小。它是同步的,线程安全。jdk 1.0就出现了。现在几乎不用了。
增删,查询速度都很慢。
ArrayList:内部是数组数据结构。他是不同步的,jdk 1.2才出现。替代了Vector。查询的速度很快。
LinkedList:内部是链表数据结构。他是不同步的。增删元素的速度很快。

8.LinkedList:
需要注意的是:
该链表中的方法中,获取元素的方法有:

	1.Object get(index);
	2.Object getFirst();
	3.Object getLast();
	//如果链表为空,则出现运行时错误。替代方法:
	//jdk 1.6以后出现新的方法:peekFirst();peekLast();若不存在,则返回NULL,不会抛出异常。
	以上三种方式,只获取,不删除。
	4.Object remove(index);
	5.Object removeFirst();
	//如果链表为空,则出现运行时错误。替代方法:
	//jdk 1.6以后出现新的方法:poolFirst();poolLast();若不存在,则返回NULL,不会抛出异常。
	6.Object removeLast();
	//以上三种方法返回删除了的元素。
9.ArrayList:
判断对象是否相同的依据:equals()方法。
10.set:set中取数据使用迭代器iterator。set接口中的方法和Collection一致。
HashSet:内部数据结构是哈希表。有哈希表支持,不保证迭代顺序。特别是不保证顺序恒久不变。不同步。
哈希表判断元素是否相同的依据:
1.判断两个元素的哈希值是否相同。其实判断的是对象的hashCode()的方法。
2.判断两个元素的内容是否相同。其实是使用equals()方法进行判断。
注意:如果第一步不满足,则不再判断第二步。
treeSet:使用元素的自然顺序(字典序)对set集合中的元素进行排序。是不同步的。
判断元素唯一性的依据:根据比较方法(compareTo)的返回结果是否是0,若是代表两对象相等。正数代表大于。负数代表小于。
当无论比较结果如何,使返回值总是返回1,则会按照输入顺序存储。即产生有序现象。返回值为0时,按照倒序。
对元素进行排序的方式:
1.让元素本身剧本必备比较功能,需要实现Comparable接口,覆盖compareTo方法。
2.如果不要按照对象中具备的自然顺序进行排序,如果对象中不具备自然顺序时,可以让集合自身具备比较功能。
定义类实现Comparator比较接口。重写compare方法,将该类对象作为参数传递给创建的treeSet集合的构造函数。使集合自身具备比较功能。