A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 熊乾坤 中级黑马   /  2015-6-4 14:38  /  326 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

集合

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

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”);

all.add(“789”);

all.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.add(“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方法。

5 个回复

倒序浏览
赞一个!!
回复 使用道具 举报
雪域星辰 来自手机 中级黑马 2015-6-4 15:16:48
藤椅
总结这么多啊。。。辛苦了
回复 使用道具 举报
总结的很详细    但是对数组的排序和查找 能分享个更详细点的吗,最后的set对于我的测试题中的数组去重很有用,真心谢谢!!!
回复 使用道具 举报
学习一下
回复 使用道具 举报
暂时没学到,,,不过学习了。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马