黑马程序员 日记六:集合的学习总结

---------------------- android培训java培训、期待与您交流! ---------------------

集合与数组同属于容器范围内,但是二者有明显不同,最显著不同是,集合存储的元素,不必为同一种类型,而且集合存储元素的数量是可变的。

Collection接口在java.util包下,其子接口有ListSet两个。

List接口有三个常用实现类——ArrayListLinkedListVectorSet接口有两个常用实现类——HashSetTreeSet

遍历一个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相同。

3Vector

Vector类在出现在jdk1.0版本,底层实现为数组。由于该类操作效率低,已经被ArrayList所取代。

List接口下三个实现类的比较:

ArrayList:底层实现为数组结构,查询速度很快,但是增删慢

LinkedList:底层实现为链表结构,增删速度很快,但是查询慢

Vector:ArrayList一样,底层实现是数组,该类出现比ArrayList早,现在基本已经被ArrayList取代。相比ArrayListVector是线程同步的的,而ArrayList线程不同步,但是由于Vector增删改查太慢,现在已经基本不再需要Vector了。

Vector的遍历,除了有共用的Iterator外,还有另外一种Vector特有的方法:

Enumeration en = v.elements ();
while (en.hasMoreElements()){
System.out.println (en.nextElement());
}


但是,由于这种方法的名称太长了,所以,这种方法也基本不再使用。

二、Set

Set容器的特点是,元素的存入和取出的顺序不一致,且不能出现重复元素。

其常用实现类包括HashSetTreeSet.

(1)HashSet

HashSet是线程不同步的容器,底层实现方式是Hash表,所以在该类的很多方法中,底层都掉用了HashCode()方法的返回值,除此之外,还用到了equals()方法。

例如在向一个HashSet实例中,添加一个元素,会首先看该对象的HashCode,如果HashCode与该HashSet实例中的任何元素都不同,则认为是不同元素,则添加进来;若HashCode相同,则继续判断equals返回值,若返回值为true,则认为二者是同一对象,否则认为是不同对象,而添加进来。

因此,在向该类实例化对象中添加自定义类的时候,必须复写该类的HashCode()equals()方法,来实现自己的规则。

(2)TreeSet

该类的底层实现为二叉树。

可以对该集合中的元素排序,这就要求其元素的类必须实现Comparable接口或者在实例化TreeSet的时候,传入一个实现Comparator接口的类的实例。

当被传入Comparator时候,就不再用元素类中的Comparable中提供的排序方法。

ListSet的区别:

有序的 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


猜你喜欢

转载自blog.csdn.net/boybeak/article/details/7584393
今日推荐