黑马程序员-集合(List)

来源:互联网 发布:表白网页源码下载 编辑:程序博客网 时间:2024/05/21 08:56

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

 

List

ArrayList:实质就是一个会自动增长的数组,数据结构就是一个数组

查询的效率比较高,增删效率比较低,适用于查询比较频繁,增删少的元素管理集合。如果查询和增删都频繁,也优先使用ArrayList

LinkedList:底层是用双向循环链表来实现的,数据结构就是一链表

如何理解双向循环链表呢?实际上就是一个元素会存储下一个元素的地址,同时还会存储上一个元素的地址,向前查询也以,向后查询也可以的双向的循环。

这个的查询效率比较低,增删效率就很高,适用于查询动作少,增删动作比较频繁的元素管理集合

Vector:低层是数组数据结构,Vector是线程同步的,增删查询都很慢,被ArrayList取代

介绍ArrayList的常用方法

boolean add():添加元素,添加成功返回boolean

ArrayList a1 = newArrayList();

a1.add("java01");//中只能存储对象,其实“java01”就是一个String类型的匿名对象

boolean addAll(Collection<?extends E> c):把另一个集合对象中的元素全部添加到本对象,添加成功返回boolean

<T> T[]toArray(T[] a):把一个集合转换成一个数组

boolean void remove(Objecto):删除指定元素

void clear():清空集合里面的所有元素

boolean removeAll(Collection<?>c):删除传入集合的交集元素

boolean contains(Object obj):判断是否存在某个元素,存在返回true,不存在返回false

bollean retainAll(collection e):传入一个集合,取两者交集保存在原集合中,如果两者不存在交集,则原集合变为空集。返回值是如果集合发生改变则返回true,如果返回false,说明两集合为相同的集合

 

bollean  removeAll(collectione):移除两集合的交集

 

Iteratoriterator():返回值类型就是Iterator

使用实例:

ArrayList a1 = new ArrayList();a1.add("java01");a1.add("java02");a1.add("java03");a1.add("java04");Iterator it = new a1.iterator();               While(it.haxtNext())//haxtNext()方法是判断集合里面是否还有下一个元素,有就返回true,没有就false{System.out.println(It.next());// next()返回集合中的下一个元素}

问题一

视频,中说到用迭代器可用while(),也可用for(),国外对内存的管理比较严格,用for循环输出集合元素,但是毕老师说用while的话不能节约内存,因为在外面要定义一个Iterator对象,使用完毕还在内存

for(Iterator it=ai.iterator();it.hasNext();)  {   System.out.println(it.next());  }Iterator it = a1.iterator();while(it.hasNext()){System.out.println(it.next());}


 

我能不能直接在把建立个匿名的对象在局部,这样也就使用完就移除内存了,还是说会有别的问题,能不能正确取出集合里的元素?如下所示

while(a1.iterator().hasNext()){System.out.println(a1.iterator().next());}

解答:

编译可以通过

结果陷入死循环,不断地输出第一个元素

并发修改异常:

ArrayList a1 = new ArrayList();a1.add("java01");a1.add("java02");a1.add("java03");Iterator it = new a1.iterator();While(it.haxtNext()){Object obj = it.next();//取出动作If(“java02”.equals(obj)){a1.add(“java10”);//添加动作}System.out.println(obj);}


 

上述代码会发生并发修改异常,迭代器iterator在对集合取元素时,不能对集合添加元素

IteratorlistIterator的区别

所以iterator的功能只局限在判断hasNext(),删除remove(),取出next()三种功能,如果要添加元素,就要使用iterator的子类listIterator(),用法一样,增删改查都可以

listIterator还有两个特有的功能,判断前一个是否有元素hasProvious()

取前一个元素previous();

有一点必须注意:

Iterator迭代器ListSet两者都有,这是因为list集合元素都带角标的缘故,但是,listIteratorlist接口的特有,具有增删改查功能。

previous();方法的原理是游标先向上移动一个单元,再取出元素

next():方法的原理是先取出当前的元素,再把游标向下移动一单位

VectorArrayList有什么区别:

相同点:VectorArrayList底层都是通过Object类型的数组实现

不同点:Vector是线程同步的,效率低,ArrayList是线程同步的效率高,在JDK1.2VectorArrayList取代

为什么Vector会被ArrayList取代?

因为Vector是线程同步的,每次操作的时候都要判断锁,导致效率很低,而ArrayList是非同步的,如果需要实现同步,可以手动加锁

介绍LinkedList的常用方法:

addFirst():添加到链表头,offerFirst()取代

addLast():添加到链表末尾,offerLast()取代

getFirst():取表头的元素返回,无元素则抛异常,geekFirst()取代

get Last():取表末尾的元素返回,无元素,则抛异常,geekLast()取代

removeFirst ():取出表头的元素返回,并且从链表中删除该元素,如果表内无元素,则抛异常,被pollFirst()取代

removeLast():取出表末尾的元素返回,并且从链表中删除该元素,如果表内无元素,则抛异常。,被pollLast()取代

以下六个方法都是JDK1.6才有的,以后优先用这些

offerFirst():添加元素到链表头,替代addFirst()

offerLast():添加元素链表末尾,替代addLast()

geekFirst():取表头的元素返回,替代getFirst(),如果表内无元素,返回null

geekLast():取表末尾的元素返回,替代get Last(),如果表内无元素,返回null

pollFirst():取出表头的元素返回,并且从链表中删除该元素,如果表内无元素,则返回null

pollLast():取出表末尾的元素返回,并且从链表中删除该元素,如果表内无元素,则返回null

 

在编写代码的时候一个细节需要注意

ArrayList a1 = new ArrayList();//Iterator it = new a1.iterator();不能在添加元素之前就创建迭代器,此时创建的迭代器只会关联当前的空集合a1.add("java01");a1.add("java02");a1.add("java03");Iterator it = new a1.iterator();必须在集合内的元素发生改变之后创建迭代器While(it.haxtNext()){System.out.println(it.next());}

 

 

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net 

原创粉丝点击