您的位置:首页 > 职场人生

黑马程序员_集合学习Collection之List学习笔记

2013-04-07 11:35 267 查看
------- android培训java培训、期待与您交流! ----------

集合

在集合框架中,Collection为与这个框架的顶层,它有两个子接口,List和Set

在List和Set接口下,又有很多特殊的容器。因为每一个容器对数据的存储方式都有不同,这个存储方式称之为:数据结构,它们自身具备的特点不同。

Collection

作为一个集合,应该具有的方法:增删改查

在collection中,存在这样一些抽象方法

add(),增加一个元素

addAll(),一次增加一堆元素(实现并集)

remove 删除一个元素

removeAll 删除一堆元素(实现差集)A-B

retainAll 保留两个集合中共有的元素。交集

对象创建在堆内存中,而对象的引用在栈内存中。

在集合中存储的都是对象的引用(地址)。

ArrayList al = newArrayList();

//添加元素

al.add("01");

al.add("02");

al.add("03");

al.add("04");

//获取个数,集合的长度

System.out.println(al.size());

//删除元素

al.remove("01");

//判断元素

System.out.println(al.contains("02"));

ArrayList al2 = new ArrayList();

al2.add("01");

al2.add("02");

//取交集,al中存放的为交集

System.out.println(al.retainAll(al2));

System.out.println(al);


当我们取出元素中的集合时候,就可以使用迭代器,其实就是集合取出元素的方式

每个集合中有各自特定的取出方式,也就有一个特定的迭代器。取出这个类就定义在集合的内部。也就是用来取元素,在集合内部操作,这个迭代器内部类抽取了一些共性的方法,叫做Iterator接口,这个接口定义了抽象的方法,在各自不同的数据结构中,取出和判断的方式不同,故各个数据结构实现了自己特定的迭代器对象。可以使用 数据结构对象.iterator();得到其内部实现的迭代器。

实例:List集合中所定义的迭代器内部类,用于实现特定的取出元素的操作,定义为内部类

private class ListItr extends Itr implements ListIterator<E> {

ListItr(int index) {

cursor = index;

}

publicbooleanhasPrevious() {

returncursor != 0;

}

}


对于每一个容器来说,取出动作的细节也不一样,但是有共性内容,判断和取出,提取了一个Iterator接口。

其实迭代器就是取出元素的方式

Iterator it =al.iterator();//得到了相应集合中特定实现的迭代器

while(it.hasNext())//判断是否有下一个元素

{

System.out.println(it.next());

}


Collection中,有两类常见的子接口(各自有各自体系下的特定的方法)

List:元素是有序的(按照存入的前后),元素可以重复。因为该集合体系有索引。可以在指定位置对元素进行操作。凡是带角标的,底层的实现都是数组结构。

对于List集合来说:比较元素是否相等使用的是存入元素的equals方法。

而且在删除元素的时候,也是使用equals去寻找有没有。然后去删除。

Set:元素是无序(内部其实有序,但是对于用户来说,是无序的,不根据用户的存入前后,顺序的存放)的,元素不可以重复。

对于List和Set中的共性方法,都在Collection中已经定义了,现在学习List和Set中的特殊方法。

List(最大的特定就是通过索引对集合中的元素进行操作)

增 add(index,element);

add(index,Collection);

删 remove(index);

改 set(index,element);

查 get(index);

subList(from,to);

ListIterator();

实例:

ArrayList al = new ArrayList();

al.add("00");

//添加元素使用特有方法

al.add(1,"01");

System.out.println(al);

//删除指定位置的元素

al.remove(0);

System.out.println(al);

//修改元素。

al.set(0, "001");

System.out.println(al);

//通过角标获取元素

System.out.println(al.get(0));

//获取所有的元素

for(int x =0;x<al.size();x++)

{

System.out.println(al.get(x));

}

//使用迭代器的方式

Iterator it = al.iterator();

while(it.hasNext())

{

System.out.println(it.next());

}

//返回某一个特定元素在集合中的位置

System.out.println(al.indexOf("001"));

al.clear();

al.add("11");

al.add("12");

al.add("13");

List sub = al.subList(0,2);

System.out.println(sub);


List中具体的列表迭代器的作用:

需求:现在要使用迭代器去集合中的元素取出,在取出的过程中进行一些操作。

但是,我们在使用普通迭代器操作集合对象的时候,再使用集合对象对元素进行操作

会出现并发操作的安全隐患。不能同时既使用集合操作集合中元素,又使用迭代器操作集合中元素。

解决方式:要么都使用集合的方式,要么都使用迭代器的方式。

例子:

Iterator it =al.iterator();

while(it.hasNext())

{

if(it.next().equals("02"))

{

it.remove();//也就是删除next得到的那个元素,不能同时使用两次remove。

}

}

System.out.println(al);


对于公共类型的迭代器,只能进行三种类型的操作,判断,取出和删除。不能做添加动作,有局限性。

所以提供了一个ListIterator。

List集合特有的迭代器,ListIterator是Iterator子接口。,它提供了更加强大的功能。

该接口通过List集合对象.ListIterator()方法获取。

特点:在遍历过程中的增删改查。。。(由于不能通过集合对象的方法操作集合中的元素)

实例:

ArrayList al = new ArrayList();

al.add("01");

al.add("02");

al.add("03");

//使用列表迭代器

ListIterator li =al.listIterator();

while(li.hasNext())

{

Object obj = li.next();

if(obj.equals("02"))

{

//     li.add("0000");//在next遍历到的元素之后加入该新元素

li.set("006");//修改当前next遍历到的元素。

}

}

System.out.println(al);

while(li.hasPrevious())

{

Object obj = li.previous();//当指针移动到最后的时候,它就有了前一个元素

//从集合的后往前遍历。

System.out.println(obj);

}


List中常见的共性方法介绍结束,现在讲解List常见的三个子类对象。(由于底层的数据结构不一样而出现的,以适应不同的条件)

ArrayList的特点:底层的数据结构是数组数据结构,查询,修改速度很快,但是增加,删除元素很慢。线程不同步。默认的情况下,长度为10,超过长度的时候,按照50%进行延长。变成15。(这也就是可变长度的数组的原理)

LinkedList:底层使用的是列表数据结构,增删的速度很快,查询比较慢

Vector :底层是数组数据结构,线程同步。默认长度为10.超过长度的时候,按照100%进行延长,变成20。

Vetor的特别学习(有一个特别的东西值得去学习)

Vector v = new Vector();

v.add("01");

v.add("02");

v.add("03");

//特有方法。枚举(就像一个迭代器,是为了在io中去使用)

Enumeration e = v.elements();

while(e.hasMoreElements())

{

System.out.println(e.nextElement());

}


LinkedList的学习(介绍它的特有方法)

LinkedList link= new LinkedList();

link.add("01");

link.add("02");

link.add("03");

//LinkedList的特有方法

link.addFirst("first");//在集合的开始添加元素

link.addLast("last");//在集合的结尾添加元素

System.out.println(link);

link.getFirst();//得到集合的一个元素

link.getLast();//得到自己和的最后一个元素

link.removeFirst();//删除第一个元素,并得到

link.removeLast();//删除最后一个元素,并得到

//当集合中没有元素的时候,调用get和remove的方法会抛出异常

//使用pollFirst去替代remove,当没有元素的时候,返回null;

//使用offerFirst()替换getFirst()

link.clear();

System.out.println(link.pollFirst());//null
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐