黑马程序员-------集合(ArrayList,LinkedList)

来源:互联网 发布:淘宝森马官方店真假 编辑:程序博客网 时间:2024/05/21 11:00

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

集合概述:
Java是面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。
而对多个元素进行存储,前面我们学习过数组,数组的弊端,长度固定。这样,数组将不能满足变化的要求。所以,Java就提供了集合供我们使用。

集合的特点:
1 长度可以发生改变。
2 只能存储对象。
3 可以存储多种类型对象(一般存储的还是同一种,因为1.5JDK的新特性 泛型)。

集合和数组的区别:
1 长度问题    数组固定,集合可变。
存储元素问题   数组可以是基本类型,也可以是引用类型。   集合只能是引用类型。(JDK1.5以后还可以存储基本数据类型,因为JDK1.5自动装箱拆箱)

是否同一类型   数组元素类型一致;   集合元素类型可以不一致。(建议还是同一种类型,因为JDK1.5出现了泛型)

功能是否一致
数组只能对数据进行存取操作,当然删除数组中的元素还可以删除,就是null。
集合不但可以对数据进行基本操作,还提供了更强大的功能,比如删除 修改...。


集合体系的由来

集合是存储多个元素的容器,但是,由于数据结构不同,Java就提供了多种集合类。
而这多种集合类有共性的功能,所以,通过不断的向上抽取,最终形成了集合体系
结构。


为什么会出现这么多的容器呢?
因为每一个容器对数据的存储方式都有不同,这个存储方式称之为:数据结构。
数据结构:数据存储的方式。


Collection:定义了集合框架的共性功能。
|------List(列表):元素是有序的,元素可以重复,因为该集合体系有索引。

|--ArrayList:底层是数组数据结构,查询速度很快,但是增删稍慢,线程不同步,默认10个元素。(线程不同步)

|--LinkedList:底层是链表数据结构,查询很慢,增删速度很快。(线程不同步)
|--Vector:底层是数组数据结构,和ArrayList一样,查询,增删,都很慢,Vector是1.0出现,ArrayList是1.2出现,(线程同步)但已经不用了。

|------Set(集):元素是无序的(存入和取出顺序不一定一致),元素不可以重复。

|--HashSet:底层数据结构是哈希表。线程是不同步的。

采用散列函数对元素进行排序(Asiic),是专门为快速查询而设计的。存入HashSet的对象必须定义hashCode方法。


|--TreeSet:底层的数据结构是二叉树。线程是不同步的。

对Set集合中的元素的进行指定(我们指定的比较器)顺序的排序。不同步。TreeSet底层的数据结构就是二叉树。

采用红黑树的数据结构进行排序元素,使用它可以从Set中提取有序(升序或者降序)的序列。

需要注意的是,存入自定义类时,TreeSet需要维护元素的存储顺序,因此自定义类要实现Comparable接口并定义compareTo方法。

如何学习和使用一个继承体系呢?
    学习顶层:因为顶层定义的是共性内容。
    使用底层:因为底层才是具体的实现。

Collection集合中的方法演示:


代码演示:


把取出方式定义在了集合的内部,这样就可以直接访问集合内部的元素。
这样取出方式就成了内部类。

而每一个容器的数据结构不同,
所以取出的动作也不一样。
判断和取出。那么可以将其共性抽取出来。

那么这些内部类都符合一个规则。改规则就是Iterator。
如何获取集合的取出对象呢?
通过一个对外的方法。
iterator();

迭代器就是取出集合中元素的方式。把取出的方式定义在集合的内部,就可以直接访问集合内的元素,那么取出方式就成了内部类。而每一个容器的数据结构不同,因此取出的动作也不同,但都有共性内容:判断和取出。那么可以将这些共性内容抽取得到了Iterator接口。ArrayList al = new ArrayList(); Iterator it = al.iterator();获取迭代器用于取出集合中的元素。


代码演示:


List:
特有方法,凡是可以操作角标的方法都是该体系特有的方法。


add(index,element);
addAll(index,Collection);

remove(index);

set(index,element);

get(index);
subList(from,to);
ListIterator();

List集合特有的迭代器,ListIterator是Iterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素,会发生并发修改异常。ConcurrentModificationException
所以在迭代时,只能用迭代器的方法操作元素,但是Iterator的方法是有限的
只能对元素进行判断,取出,删除等操作。
如果想要其他的操作如添加,修改等。就需要使用其子接口,ListIterator。

该接口只能通过List集合的ListIterator方法获取。

Arraylist集合代码演示


ArrayList小测试一个,

代码演示:


LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询速度稍慢。

LinkedList:特有方法:
addFirst();
addLast();

getFirst();
getLast();
获取元素,但不删除。如果集合中没有元素,会出现NoSuchElementsException异常。

removeFirst();
removeLast();
获取元素,并删除元素。如果集合中没有元素,会出现NoSuchElementsException异常。

在JDK1.6版本以后出现了替代方法。

offerFirst();
offerLast();

peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有该元素,则返回null。

pollFirst();
polllast();
获取元素,并删除元素。如果集合中没有该元素,返回null。


代码演示:





LinkedList小测试

代码演示:



listIterator(int index)方法可以控制迭代器位置,当参数为集合size时,调用previous可反向遍历集合

当一个集合创建了两个迭代器,一个迭代器对集合进行了修改,或者集合本身方法对集合进行了修改,另一个迭代器发现了这些修改会抛出ConcurrentModification异常(布尔方法不会抛出异常)。

list <String> s=new LinkedList<String>();

Listiterator it=s.listIterator();

ListIterator it2=s.listIterator();

it.add("123");

it.add("321");//抛出ConcurrentModification异常

为了避免此异常的发生需遵循下列原则:可以根据需要给容器附加许多的迭代器,但是这些迭代器只能读取列表。另外再单独附加一个既能读又能写的迭代器。
集合采用一个简单的方法检测并发修改。集合跟踪记录操作次数,每个迭代器都维护一个计数值,当计数值和集合的操作数不一致时,抛出异常。

0 0
原创粉丝点击