List 接口常用子类及其特点

List 常用子类:

- Vector: 内部是数组数据结构,是同步的. 增删, 查询都很慢
- ArrayList: 内部是数组数据结构,是不同步的,替代了 Vector,不同步的效率较高. 特点: 查询速度快
- LinkedList: 内部是链接列表实现,链表数据结构,是不同步的,有角标. 特点: 增删元素的速度很快

Vector (了解)

  • 取出元素的特有方法: Enumeration elements();
Vector v = new Vector();

v.addElement("abc1");
v.addElement("abc2");
v.addElement("abc3");

Enumeration en = v.elements();
while(en.hasMoreElements()){
    System.out.println(en.nextElement());
}

备注: Enumeration 接口和 Iterator 接口的功能是重复的, 新的实现优先考虑 Iterator 接口.

LinkedList

  • 操作列表的开头和结尾
addFirst(); : 将指定元素添加到列表的开头
addLast();  : 将指定元素添加到列表的结尾

getFirst(); : 获取列表的第一个元素, 但不移除. 如果链表为空,抛出 NoSuchElementException 异常
getLast();  : 获取列表的最后一个元素, 但不移除. 如果链表为空,抛出 NoSuchElementException 异常

removeFirst(); : 获取列表的第一个元素, 但移除. 如果链表为空,抛出 NoSuchElementException 异常
removeLast();  : 获取列表的最后一个元素, 但移除. 如果链表为空,抛出 NoSuchElementException 异常

// JDK 1.6 以后升级

offerFirst(); : 将指定元素添加到列表的开头
offerLast();  : 将指定元素添加到列表的结尾

peekFirst(); : 获取列表的第一个元素, 但不移除. 如果链表为空,返回 null
peekLast();  : 获取列表的最后一个元素, 但不移除. 如果链表为空,返回 null

pollFirst(); : 获取列表的第一个元素, 但移除. 如果链表为空,返回 null
pollLast();  : 获取列表的最后一个元素, 但移除. 如果链表为空,返回 null
  • 练习: 请使用 LinkedList 来模拟一个堆栈或者队列数据结构
// 分析:
// 堆栈: 先进后出, First in Last Out, 简写为 FILO
// 队列: 先进先出, First in First Out, 简写为: FIFO.  (例如排队)

// 我们应该描述这样一个容器, 给使用者提供一个容器对象完成这两种结构中的一种.

class DuiLie {
    private LinkedList link;

    // 构造函数
    public DuiLie(){
    link = new LinkedList();
}

    // 队列添加元素的功能
    public void myAdd(Object obj){
    link.addLast(obj);
}

    public void myGet(){
    return link.removeFrist();
}

    public boolean isNull(){
    return link.isEmpty();
}

}

ArrayList

  • 存储自定义对象
// 自定义 Person 对象
public class Person {
    private String name;
    private int age;

    public Person(){
        super();
    }

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

    public String getName(){
        return name;
    }

    public void setName(String name){
        this.name = name;
    }

    public void getAge(){
        return age;
    }

    public void setAge(int age){
        this.age = age;
    }
}

// ArrayList 集合中存储自定义对象 Person
public class ArrayListTest {
    public static void main(String[] args){

        ArrayList al = new ArrayList();

        al.add(new Person("lisi1",21));
        al.add(new Person("lisi2",22));
        al.add(new Person("lisi3",23));
        al.add(new Person("lisi4",24));

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

// 输出结果为:
// cn.itcast.p.bean.Person@7852e922
// cn.itcast.p.bean.Person@4e25154f
// cn.itcast.p.bean.Person@70dea4e
// cn.itcast.p.bean.Person@5c647e05

// 原因分析: add(Object obj); Person 对象存入 ArrayList 集合中,向上转型(多态)
// 直接 it.next().getName(); 错误, 因为 Object 对象没有 getName() 方法

// 升级:
Iterator it = al.iterator();
while(it.hasNext()){
    Person p = (Person)it.next(); // 向下转型
    System.out.println(p.getName()+" : " + p.getAge());
}

ArrayList 集合中存储的是 Person 对象的引用

其他: ArrayList 集合不能存储基本数据类型

al.add(5); // 代表着: al.add(new Integer(5)); 自动装箱
           // add() 方法的元素为 Object, Object obj = new Integer(5); 多态





参考资料

  • JavaSE 基础视频(毕向东)
  • JDK 1.6 中文文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值