和风细雨

世上本无难事,心以为难,斯乃真难。苟不存一难之见于心,则运用之术自出。

链表讲解

集合框架的继承体系

Java2中包含了6个集合接口,这些接口的通用目的实现类,以及一个集合实用类Collections,共同组成了集合框架的核心.
6个集合接口如下:
Collection及其以下的List,Set,以及Set下的SortedSet
Map及其以下的SortedMap

链表的通用实现

ArrayList:线程不安全的动态数组类,批量查询速度快,单个查找速度慢.
Vector:线程安全的动态数组类,效率比ArrayList低下.
LinkedList:动态链表类,适于在队列首尾频繁增删成员的场合.

链表的创建

List<Member> ls=new ArrayList<Member>();// 1.5版本及以上

List ls=new ArrayList();// 1.5版本以下

之所以将ls类型指定为List<Member>而不是ArrayList<Member>是因为 如果情况变化, ArrayList需要修改成Vector或LinkedList时无须修改其它代码,仅修改实例类型即可.

向List中添加元素

添加单个元素
ls.add(new Member("Andy",21));

从别的链表中添加多个元素
List<Member> ls2=new ArrayList<Member>();
ls2.add(new Member("Felex",21));
ls2.add(new Member("Gates",23));
ls.addAll(ls2);

注意:
1.5及其以上版本中,添加的元素必须和定义时一致,如ls的类型是List<Member>,那么向其中添加的元素必须是Member或其子类.
1.5以下版本中,对添加的元素不作检查,只要是Object即可,如果是基本类型则需装箱成类类型.如ls.add(new Integer(8));

删除链表中元素

ls.remove(member); // 直接删除对象,member=new Member("Edin",28)
ls.remove(2);           // 删除第三个元素
ls.clear();                // 将已有数据全部清除

对链表进行遍历

1) 1.5中独有的遍历方法,代码最短,使用最方便
for(Member member:ls){
     // member就是依次取出的每个元素
}

2) 常规方法,多用于需要取得下标的场合,各版本均适用
for(int i=0;i<ls.size();i++){
    Member member=ls.get(i);// member就是依次取出的每个元素, 1.5及其以上版本适用, ls.size()为链表长度
    Member member=(Member)ls.get(i);// 1.5以下版本适用
}

3) 使用Iterator对链表进行遍历的方法,各版本均适用
for(Iterator it=ls.iterator();it.hasNext();){
    Member member=(Member)it.next();
}

链表的其它常用的方法

ls.contains(Object o);// 返回链表中是否包含某元素
ls.indexOf(Object o);// 返回对象o是链表中的第几号元素
isEmpty();// 返回链表中是否有元素

对链表进行排序
1)让List中元素必须已经实现Comparable接口:
public class Member implements Comparable {
  private String name;

  private int age;

  public Member(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public int compareTo(Object obj) {
    Member another = (Member) obj;
    return this.name.compareTo(another.name);// 按名称排序,如果是this.age-another.age则按年龄排序
  }
 
  public String toString(){
    return "Member name="+name+" age="+age;
  }
}

2)排序过程
List<Member> ls=new ArrayList<Member>();

ls.add(new Member("Felex",21));
ls.add(new Member("Gates",23));
ls.add(new Member("Andy",21));
ls.add(new Member("Bill",23));
ls.add(new Member("Cindy",24));
ls.add(new Member("Dell",27));

Collections.sort(ls);

for(Member member:ls){
      System.out.println(member);
}

输出:
Member name=Andy age=21
Member name=Bill age=23
Member name=Cindy age=24
Member name=Dell age=27
Member name=Felex age=21
Member name=Gates age=23

// 如果需要逆序可以使用Collections.reverse(ls);

链表与数组之间的转换

1) List转换成数组
List<String> ls=new ArrayList<String>();

ls.add("Felex");
ls.add("Gates");
ls.add("Andy");
ls.add("Bill");
ls.add("Cindy");
ls.add("Dell");

Object[] arr=ls.toArray();
for(Object obj:arr){
      System.out.println((Object)obj);
}

输出为:
Felex
Gates
Andy
Bill
Cindy
Dell

2) 数组转换成List
String[] arr={"Andy","Bill","Cindy","Dell"};
List<String> ls=Arrays.asList(arr);
for(String str:ls){
     System.out.println(str);
}

输出:
Andy
Bill
Cindy
Dell

posted on 2008-02-21 19:26 和风细雨 阅读(478) 评论(0)  编辑  收藏 所属分类: J2SE


只有注册用户登录后才能发表评论。


网站导航: