java中的List接口及实现类

List接口

1、List基本情况

  • List 接口中的元素都是有序的,并且可以重复(有序指:存入元素的顺序与取出元素的顺序一致)
  • List接口中的每个元素都有其对应的顺序索引
  • API中List实现类有很多

2、List接口中的方法

  • add(Object obj) 默认将其添加到最后一个位置
  • add(int index,Object obj) :在 索引为index 的位置添加obj 元素
  • addAll(int index, Collection c )在索引为index的位置添加集合C中的元素
  • indexOf(Object obj) 返回obj 第一次出现的位置,没有则返回-1
  • lastIndexOf(object obj) 返回obj 在集合中最后一次出现的位置
  • remove(int index) 将下表为index的值删除
  • remove(Object obj) :将集合中obj的值删除,如果该集合中含有多个时,一次只能删除一个
  • set(int index,Object obj) 将索引为index的值该为obj;
  • subList(int i,int j) 返回一个list的子集合 [0,2); 左闭右开 后面的取不到

3、List接口的实现列类

(1)、ArrayList集合

  • 实现List集合

  • 可以添加null值,并且可以添加多个null值

  • ArrayList集合底层是数组

  • ArrayList集合基本等同于Vector集合,除了ArrayList集合是线程不安全,而Vector集合是线程安全的,方法前面加了synchronized 关键字

  • ArrayList 集合底层实现

    1. ArrayList底层维护一个Object类型的数组elementDate
    2. 当创建ArrayList集合对象时,如果使用无参构造,则初始化elementDate的容量为0,第一次添加,将elementDate的容量为10,如果在扩容将容量扩容为原来的1.5倍
    3. 创建指定大小的构造器,初始化elementDate的容量为指定的大小,如果需要扩容,则直接扩容为原来大小的1.5倍

    transient :表示瞬间,短暂的,表示该属性不会被序列化

(2)、Vector集合

  • Vector底层是一个对象数组
  • Vector是线程安全的,方法上有synchronized;
  • 在开发中,需要线程同步安全,考虑Vector集合,
  • 安全,效率不高,因为做了线程安全处理
  • 扩容:
    1. 无参,默认是10,满后,按两倍扩容
    2. 指定大小:每次直接按两倍扩容;

(3)、LinkedList集合

  • LinkedList底层是一个双向链表
  • 可以添加任意元素(元素可以重复,包括null值)
  • 线程不安全,没有实现同步
  • LinkedList维护了两个属性first 和last 分别指向首节点,和尾结点;
  • 每个节点都是一个Node对象,,里面维护了pre,next,item 属性,其中通过pre指向前一个,next指向后一个,最终实现双向链表
  • 因为linkedList底层是一个链表,所以不需要扩容
  • LInkedList元素的添加和删除效率比较高,不是通过数组完成的

ArrayList、LinkedList 与Vector结合三者的比较

ArrayListVectorLinkedList
底层结构数组数组双向链表
增删效率效率低效率低效率高
改查效率效率高效率高效率低
线程安全非线性安全线程安全非线程安全
扩容默认是0,第一次添加扩容为10,再次扩容时,扩容为原来的1.5倍链表实现,不考虑扩容默认就是10,每次扩容时,扩容为原来得2倍
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值