------------------ <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、
<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
1集合的由来
对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。就是使用集合容器进行存储:
2 集合的特点
集合作为一种容器:与数组不同,集合长度可变,数组中可以存储基本数据类型,集合缺只能存储对象。集合可以存不同类型的对象。
add方法的参数类型是object,以便于接收任意类型对象。
集合存储的都是对象的引用(内存地址);
集合容器因为内部的数据结构不同,有多种具体容器。不断向上抽取,就形成了集合框架。框架的顶层为Collection接口;
3集合框架:
(顶)java.util.collection接口:
(子)set接口 { hashset , treeset } }
元素无序,元素不可重复,无索引
(子)list接口 { arraylist , linkedlist , vector } }
元素有序、可重复,因为该集合体系有索引;
4Collection的常见方法;
添加:boolean add ( Object obj ) ;
boolean addAll ( Collection coll ) ;
删除:boolean remove ( Object obj ) ;
boolean removeAll ( Collection coll ) ;
void clear( ) ;
判断:boolean contains ( Object obj ) ;
boolean containsAll ( Collection coll );
boolean isEmpty ( ) ;
获取:int size ( ) ;
Iterator iterator ( ) ;
其他:boolean retainAll ( Coolection coll ) ; //取交集
Object[ ] toArray ( ) ; //将集合转成数组。
<T>[] toArray (<T>[ ] ) ;//要传入的数组多大呢?等于集合的size()最优。
5 Set集合特点:
元素无序、存入取出的顺序不一定一致,元素不可重复;其子集合有HashSet,TreeSet;
6Hashset集合:底层数据结构是哈希表,线程不同步,其元素唯一的判断依据为,通过两个方法hashcode()和equals()方法来完成;即如果元素的hashcode()值相同,才会判断equals是否为true;(相同);如果hashcode()值不同,不会调用equals()方法;
所以;对于判断hashset元素是否存在,以及删除等操作,依赖于元素的hashcode()和equals()方法;
如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。建立判断对象是否相同的依据;
7 TreeSet集合的特点:元素有序,不重复;不同步。地层结构是二叉树;其保证元素唯一性的依据是:compareTo()方法;(return 0则为相同);
8 TreeSet排序的实现方式:
8.1让元素自身具备比较性,元素需要实现comparable接口,覆盖compareTo(…)方法;这种方式成为元素的自然排序或默认排序;
class Studentimplements Comparable//该接口强制让学生具备比较性。
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public int compareTo(Object obj)
{
//return 0;
if(!(obj instanceof Student))
throw newRuntimeException("不是学生对象");
Student s = (Student)obj;
//System.out.println(this.name+"....compareto....."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age)
{
returnthis.name.compareTo(s.name);
}
return -1;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
8.2元素自身不具备比较性时,或具备的比较性不是所需要的排序方式,这时就需要让集合自身具备比较性;此时,要在集合初始化的时候,(将一个比较器对象作为参数传递给treeSet集合的构造函数)
9比较器的建立:
定义一个类,实现Comparator接口,覆盖compare()方法;当两种排序都存在时,以比较器为主;
class MyCompare implements Comparator
{
publicint compare(Object o1,Object o2)
{
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int num =s1.getName().compareTo(s2.getName());
if(num==0) {
return new Integer(s1.getAge()).compareTo(newInteger(s2.getAge()));
/*
if(s1.getAge()>s2.getAge())
return 1;
if(s1.getAge()==s2.getAge())
return 0;
return -1;
*/
}
}
}
10list集合:有序(存入取出的顺序一致),元素都有索引(角标),元素可以重复。可
以完成对元素的增删改查。list下的子类有Vector,ArrayList,LinkedList
对于ArrayList集合,判断元素是否存在,或者删元素底层依据都是equals方法。
11List特有方法:
其特有方法的共性特点是都可以操作角标。
增:add(index , element ); addAll(index ,collection );
删:remove( index );
改:set(index , element );
查:get(index); subList(from ,to); listIterator();
12List集合特有的迭代器ListIterator是Iterator的子接口,
Iterator的方法有限,只能对元素进行判断、取出、删除操作;迭代取出的是object类型
ListIterator的方法在Iterator上增加了:添加、修改操作;该接口只能通过list集合的ListIterator()获取;
13 listIterator特有方法及iterator方法:
add( E e ); 添加元素set( E e );替代元素 hasprevious() 逆向遍历(是否有前一个元素)
previous()返回前一个元素
同时也包含iterator的方法:
hasNext(); 是否有下一个next();返回下一个 remove();移出当前元素
14vector特有的枚举操作:
枚举是vector特有的取出方式,名称长,被迭代器取代,
Enumeration en=vect.elements();
While(en.hasMoreElements()) { sop (en.nextElement() ) };
15LinkedList特有方法:
addFirst( E e); addLast( E e);getFirst();获取首元素不删除getLast();)获取尾元素不删除
removeFirst()获取首元素并删除;removeLast()获取尾元素并删除
以上如果集合中没有元素会抛NosuchElementException异常;
在jdk1.6后的替代方法:
OfferFirst( E e); 首添加OfferLast( E e);尾添加peekFirst()取首元素不删peekLast()取尾元素不删
PollFirst();取首元素并删除 pollLast()取尾元素并删除
16定义多种类型容器是因为每种容器对数据的存储方式都有不同,即使用不同的数据结构。
Arrarylist底层的数据结构使用的是数组结构,特点:查询快,增删慢;线程不同步
LinkedList底层使用的是链表数据结构,特点:增删很快,查询稍慢;
Vector底层是使用数组数据结构,线程同步,
arrayList与vector默认数组元素为10个,超过长度自动new一个数组,copy原数组后在末尾添加,ArrayList是加长50%,vector是加长100% (不省空间)
17集合的迭代:
即集合的元素取出方式,通过集合类中的一个内部类iterator来实现,把取出方式定义在集合的内部,这样的取出方式就可以直接访问集合内容的元素;而每个容器旳数据结构不同,取出方式的细节也不同,但都有共性内容:判断hasNext(),取出next(),那么将共性内容提取出来即(iterator)接口,集合中通过一个对外方法iterator()返回此内部类对象(迭代器)要掌握此种设计思想;
迭代示例:
Iterator it=col.iterator();
While(it.hasNext()){ sop( it.next() ) }; //it变量在while结束后不直接回收;
for( Iterator it=col.iterator() ;it.hasNext() ; ){ sop( it.next() ) }; //it变量在for结束后直接回收;
18枚举的获取:
枚举和迭代的功能是将一个集合对象中所有元素顺序列举出来,它们分别由Enumeration接口和Iterator接口所定义。Enumeration接口是Java标准版1.0 所定义的,而Iterator接口则是从Java标准版1.2开始定义。两者之间既有相同之处,也存在不同,但目前在Java语言中推荐使用Iterator接口来替换Enumeration接口。下面详细介绍两者的不同。 Enumeration接口仅包含两个方法申明,其描述如下:
(1) publicboolean hasMoreElements()
测试此枚举是否包含更多的元素。
(2) publicObject nextElement()
如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。
在实际使用中,采用nextElement()方法将一个个集合元素顺序列举出来。目前用到Enumeration接口的方法仅存在于历史集合类Vector和Hashtable中,如下所示:
Java.util.Hashtable类中的枚举方法:
(1) publicEnumeration elements()
获取Hashtable对象中所有值的一个枚举
(2) publicEnumeration keys()
获取Hashtable对象中所有键的一个枚举
Java.util.Vector类中的枚举方法:
public Enumeration elements() 获取Vector对象中所有元素的一个枚举
19集合的选择技巧:
需要唯一吗?
需要:set
需要制定顺序吗?
需要:TreeSet;
不需要:HashSet;
不需要(但想要一个和存储顺序一致的(有序集合))LinkedHashSet;
不需要:List
需要频繁增删吗?
需要:LinkedList;
不需要:ArrayList;
注:集合后缀名就是该集合所属的体系,前缀名就是该集合的数据结构;
------------------<ahref="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、
<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------