---------------------- android培训、java培训、期待与您交流! ---------------------
集合与数组同属于容器范围内,但是二者有明显不同,最显著不同是,集合存储的元素,不必为同一种类型,而且集合存储元素的数量是可变的。
Collection接口在java.util包下,其子接口有List何Set两个。
List接口有三个常用实现类——ArrayList、LinkedList、Vector,Set接口有两个常用实现类——HashSet、TreeSet。
遍历一个Collection的最佳方式是使用Iterator接口,这个借口有三个方法,hasNext(),next,remove()。其子接口ListIterator有更多实用方法,专门用于List实现类的遍历和操作。
一、List
List的特点是向这个容器中添加元素是有序的,而且允许添加多个相同的元素。
凡是可以操作角标的方法,都是List中所区别于Set的方法。
包括add(index, element)、addAll (index,Collection)、remove(index)、set (index, element)、get(index)、subList(from, to).、listIterator();
(1)ArrayList
ArrayList底层实现为数组,但是其内部实现的数组大小是可变的,并且选择性的实现了List接口中的方法。可以存储任意类型的元素,甚至包括null类型。除了实现List接口中的方法外,还提供了操作其用来存储List数据的内部Array大小的方法。
ArrayList的特点是向这个容器中添加元素是有序的,而且允许添加多个相同的元素。
ArrayList中常见方法有add ,clear,size,remove等方法。
ArrayList的遍历:
ArrayList al1 = new ArrayList();
al1.add("abc");
al1.add("789");
al1.add("ddd");
如果只是取值操作,可以用对容器共用的Iterator遍历,如下,
Iterator it = al1.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
但是共用的Iterator只提供hasNext(),next()和remove()方法。
对于List接口的实现类,有一个继承自Iterator的子类ListIterator提供更多的操作方法,例如add(E),hasPrevious(),nextIndex(),previous(),previousIndex(),set(E)。
只需要用
(2)LinkedList
底层实现为链表结构,增删速度很快,但是查询慢。
LinkedList中独有的方法有addFirst(),addLast(),getFirst(),getLast(),removeFirst(),removeLast(),在以上方法中,带有First的方法,都是在表头进行操作,而带有Last的方法,都是从尾部进行操作。
例如,addFirst(),是在链表的头部插入一个元素:
LinkedList al2 = new LinkedList();
al2.add("111");
al2.add("222");
al2.add("333");
al2.addFirst("000");
System.out.println(al2);
便可以在“111”前边加上“000”这个元素。
对LinkedList的遍历,基本与ArrayList相同。
(3)Vector
Vector类在出现在jdk1.0版本,底层实现为数组。由于该类操作效率低,已经被ArrayList所取代。
List接口下三个实现类的比较:
ArrayList:底层实现为数组结构,查询速度很快,但是增删慢
LinkedList:底层实现为链表结构,增删速度很快,但是查询慢
Vector:与ArrayList一样,底层实现是数组,该类出现比ArrayList早,现在基本已经被ArrayList取代。相比ArrayList,Vector是线程同步的的,而ArrayList线程不同步,但是由于Vector增删改查太慢,现在已经基本不再需要Vector了。
对Vector的遍历,除了有共用的Iterator外,还有另外一种Vector特有的方法:
Enumeration en = v.elements ();
while (en.hasMoreElements()){
System.out.println (en.nextElement());
}
但是,由于这种方法的名称太长了,所以,这种方法也基本不再使用。
二、Set
Set容器的特点是,元素的存入和取出的顺序不一致,且不能出现重复元素。
其常用实现类包括HashSet、TreeSet.
(1)HashSet
HashSet是线程不同步的容器,底层实现方式是Hash表,所以在该类的很多方法中,底层都掉用了HashCode()方法的返回值,除此之外,还用到了equals()方法。
例如在向一个HashSet实例中,添加一个元素,会首先看该对象的HashCode,如果HashCode与该HashSet实例中的任何元素都不同,则认为是不同元素,则添加进来;若HashCode相同,则继续判断equals返回值,若返回值为true,则认为二者是同一对象,否则认为是不同对象,而添加进来。
因此,在向该类实例化对象中添加自定义类的时候,必须复写该类的HashCode()和equals()方法,来实现自己的规则。
(2)TreeSet
该类的底层实现为二叉树。
可以对该集合中的元素排序,这就要求其元素的类必须实现Comparable接口或者在实例化TreeSet的时候,传入一个实现Comparator接口的类的实例。
当被传入Comparator时候,就不再用元素类中的Comparable中提供的排序方法。
List与Set的区别:
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
与 set 不同,列表通常允许重复的元素。更正式地说,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。
一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。
List判断元素是否存在,依赖equals方法,而HashSet先判断HashCode后判断equals方法。
-----------------------android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima