浅谈Arraylist、LinkedList、Vector

第一、ArrayList

ArrayList:底层数据结构是数组,数组的物理地址是连续的,可以通过位置快速定位到具体元素的地址,所以改查效率高 

但是如果是增加和删除元素时,可能会涉及到新建数组,复制元素,移动元素等操作,比较耗时,所以增删效率低

ArrayList是命名空间System.Collections下的一部分,在使用该类时必须进行引用,同时继承了IList接口,提供了数据存储和检索。ArrayList对象的大小是按照其中存储的数据来动态扩充与收缩的。所以,在声明ArrayList对象时并不需要指定它的长度

ArrarList默认创建的集合有12条数据,ArrayList所说没有用的值并不是null,而是ArrayList每次增长会预申请多一点空间,1.5倍,而不是两倍这样就会出现当size() = 100的时候,ArrayList已经申请了150空间的情况

trimToSize 的作用只是去掉预留元素位置,就是删除多余的50,改为只申请100,内存紧张的时候会用到

java中list和ArrarList区别

List是一个接口,而ArrarList是一个类。 

List list = new ArrayList();这句创建了一个ArrayList的对象。此时它是一个List对象了,有些ArrayList但是没有List的属性和方法
而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。

为什么要用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢?
问题就在于List有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如 LinkedList或者Vector等等,这时你只要改变这一行就行了: 
List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。 
假设你开始用 ArrayList alist = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。

地区用 List arr = new ArrayList();定义;行业用 ArrayListarr = new ArrayList();定义;则说明,行业里用到了ArrayList的特殊的方法.


第二、LinkedList

LinkedList其实也就是我们在数据结构中的链表,这种数据结构有这样的特性:

  • 分配内存空间不是必须是连续的;
  • 插入、删除操作很快,只要修改前后指针就OK了,时间复杂度为O(1);
  • 访问比较慢,必须得从第一个元素开始遍历,时间复杂度为O(n);

ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

第三、Vector

Vector:默认放置10个元素,底层数据结构也是数组结构,是线程同步的(安全的),效率低,被ArrayList替代了。1.2版本以后的集合都是不同步的,当放满了10个元素后,集合容器的长度增加2倍。


你可能感兴趣的:(java基础)