List详解

原文链接: http://www.programcreek.com/2013/03/arraylist-vs-linkedlist-vs-vector/

1. List概述

List是元素有序列表。当我们讨论List时,将其与Set作对比是一个很好的办法,Set集合中的元素是无序且唯一的。
下图是Collection的类继承图,从图中你可以对本文所讨论的知识有大致的了解.

 

2.ArrayList、LinkedList与Vector的对比

    从图中可以看出,这三者都实现了List 接口.所有使用方式也很相似,主要区别在于因为实现方式的不同,所以对不同的操作具有不同的效率。
    ArrayList是一个可改变大小的数组:随机定位。当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组.
    LinkedList是一个双链表:移动指针一步一步的移动到节点处,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.
当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比,如果数据和运算量很小,那么对比将失去意义.
    Vector和ArrayList类似,但属于强同步类。如果你的程序本身是线程安全的(thread-safe,没有在多个线程之间共享同一个集合/对象),那么使用ArrayList是更好的选择。
Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.
    而 LinkedList 还实现了 Queue 接口,该接口比List提供了更多的方法,包括offer(),peek(),poll()等.
注意: 默认情况下ArrayList的初始容量非常小,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销。
3. ArrayList与LinkedList性能对比
时间复杂度对比如下:

 

* 表中的 add() 代表add(E e),而 remove()代表remove(int index)'

  • ArrayList 对于随机位置的add/remove,时间复杂度为 O(n),但是对于列表末尾的添加/删除操作,时间复杂度是 O(1). 
  • LinkedList对于随机位置的add/remove,时间复杂度为 O(n),但是对于列表 末尾/开头 的添加/删除操作,时间复杂度是 O(1).

我使用下面的代码来测试他们的性能:

LinkedList更适用于:

  • 没有大规模的随机读取
  • 大量的增加/删除操作

排序

List<String> list = new ArrayList();//Vector、LinkedList
/* 1.java提供的默认list排序方法*/
//升序:是根据汉字的拼音的字母排序的,而不是根据汉字一般的排序方法
Collections.sort(list,Collator.getInstance(java.util.Locale.CHINA));
//Collections.reverse(list);//降序排列

/* 2.自定义的排序规则:*/
/* 1) model类实现 Comparable(lang包下) 接口,重写 public int compareTo(Object o)方法 */
public int compareTo(Object o){
    return this.age.compareTo(o.getAge);
}
Collections.sort(studentList);  //按照age升序 22,23
Collections.reverse(studentList);  //按照age降序 23,22

/* 2)一种是比较器类实现Comparator接口,重写int compare(Object o1, Object o2)方法*/
Collections.sort(setList, new Comparator<Object>() {
    public int compare(Object o1, Object o2) {
        return o1.toString().compareTo(o2.toString());
        //反序return o2.toString().compareTo(o1.toString());
    }
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值