Java集合之List

Java集合之List

List集合是一个有序的、可重复的集合,List通过索引来查找元素在集合中的位置,所以List保存数据的时候也是根据索引来保存的,而List默认是按照添加的顺序设置元素的索引。例如第一个添加的元素是0,第二个是1……

List不仅可以使用Collection的所有方法,而且还添加了一些根据索引来操作的方法,比如add(int index, Object o)、get(int index)等等。

List添加的时候是自动添加到索引的最后一个位置,那么List是怎么删除的呢?首先可以根据索引来删除一个元素,而且List还可以根据传入的对象来删除一个元素。当然,只是删除找到第一个的元素,即使后面还有相同的对象,那也不删除。

而如何判断两个元素是同一个对象呢?List是通过equals方法来判断的,如果equals返回的是true,那么List就会判断这两个对象是同一个对象。

class A{
    @override
    public boolean equals(Object o){
        return true;
    }
}
public class Test{
    public static void main(String[] args){
        List list = new ArrayList();
        list.add(new String("1"));
        list.add(new String("2"));
        list.add(new String("3"));
        System.out.println(list);
        list.remove(new A());
        System.out.println(list);
        list.remove(new A());
        System.out.println(list);
    }
}

从上面的代码运行的结果可以看出当调用remove方法后都是删除了第一个元素,而后面的元素是不会删除的。所以List是根据equals方法来判断两个对象是否是同一个对象的,同时,当删除List中的元素时,也是每次只能删除一个,不管后面还有没有跟要删除的对象是同一个的对象。

从前面的文章中我们知道Set有一个Iterator接口,是用来遍历的。List也有一个Iterator接口:ListIterator接口。ListIterator与Iterator不同的是不仅提供了向后迭代的方法,而且还有向前迭代的方法。hasPrevious()、previous()。

List除了用ListIterator接口来迭代外,还可以通过普通的for循环来迭代,根据索引来获取到List中的元素。

ArrayList和Vector

ArrayList和Vector是List的两个实现类,它们都是基于数组来实现的。而这个数组是动态的、允许再分配的Object数组。当创建一个对象时,都会分配一个Object数组,而这个数组的默认长度是10。也可以根据其另外的构造方法(带有initialCapacity参数的)来创建一个初始化任意长度的对象。

当然,我们程序猿不需要关心它们的initialCapacity,但是如果想它们中添加大量的元素时,我们可以通过带有initialCapacity参数的构造方法来创建对象,这样可以减少分配的次数,从而提高性能。而且要是我们知道要添加的元素个数,则完全可以根据这个来创建一个对象。ArrayList和Vector还提供了重新分配数组的方法:ensureCapacity(int minCapacity)、trimToSize。

ArrayList和Vector在用法上几乎完全一样,但由于Vector是一个古老的集合,从JDK1.0就有了。那个时候还没有集合框架,所以Vector提供了很多方法名很长的方法,从JDK1.2以后Java提供了系统的集合框架,就将Vector改为实现List接口,作为List的实现之一,从而导致有一些功能重复的方法。

还有一点:ArrayList是线程不安全的,所以当多个线程同时访问并修改ArrayList时需要手动保持线程同步。而Vector则是线程安全的。所以从这就可以看出ArrayList的性能肯定是比Vector的要好。当我们需要保证线程安全的时候也不建议使用Vector,有一个Collections类可以把一个ArrayList变成线程安全的。

因为Vector不推荐使用了,所以关于它的子类什么的这里就不在多说,想要了解的可以自己去查资料,Vector有一个Stack子类,可以率先了解一下。

固定长度的List

有一种方法可以获取到固定长度的List,通过Arrays类的asList方法可以获取到一个固定长度的List对象,这个集合只能遍历,增加删除操作都会抛出UnsupportedOperationException异常。

List list = Arrays.asList("1","2","3");
for(int i=0; i < list.size(); i++){
    System.out.println(list.get(i));
}
list.add("4");
list.remove("2");

这段代码的最后两句都会抛出异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值