Collection子接口之一:List接口

文章详细介绍了Java集合框架中的Collection和Map接口,以及List接口的三个主要实现类ArrayList、LinkedList和Vector。ArrayList是基于变长数组实现的,适合随机访问,而LinkedList采用双向链表,适合频繁的插入和删除操作。Vector作为古老的集合类,是线程安全的,但效率较低。文章还涉及了List接口中的关键方法及其用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.java 集合可分为CollectionMap两种体系

  • Collection接口:单列数据,定义了存取一组对象的方法的集合

    • List:元素有序、可重复的集合

    • Set:元素无序、不可重复的集合

  • Map接口:双列数据,保存具有映射关系“key-value对”的集合

List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
JDK AP中List接口的实现类常用的有:ArrayList、LinkedList和 Vector.


 
    |----Collection接口:单列集合,用来存储一个一个的对象
        |----List接口:存储有序的、可重复的数据。  -->“动态”数组,替换原有的数组
              |----ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储
              |----LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
              |----Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储

2源码分析

    2.1 ArrayList的源码分析

     ArrayList是List 接口的典型实现类、主要实现类

     本质上,ArrayList是对象引用的一个”变长”数组

  ArrayList list = new ArrayList();//底层Object[] elementData初始化为{}.并没有创建长度为10的数组

      list.add(123);//第一次调用add()时,底层才创建了长度10的数组,并将数据123添加到elementData[0]

2.2 LinkedList的源码分析

  • 对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高

  • LinkedList:双向链表,内部没有声明数组,而是定义了Node类型的first和last,用于记录首末元素。同时,定义内部类Node,作为LinkedList中保存数据的基本结构。

  LinkedList list = new LinkedList(); 内部声明了Node类型的first和last属性,默认值为null
  *       list.add(123);//将123封装到Node中,创建了Node对象。
  *
  *       其中,Node定义为:体现了LinkedList的双向链表的说法
  *       private static class Node<E> {
  *            E item;
  *            Node<E> next;
  *            Node<E> prev;
  *
  *            Node(Node<E> prev, E element, Node<E> next) {
  *            this.item = element;
  *            this.next = next;     //next变量记录下一个元素的位置
  *            this.prev = prev;     //prev变量记录前一个元素的位置
  *            }
  *        }

 2.3 Vector的源码分析

  • Vector 是一个古老的集合,JDK1.0就有了。大多数操作与ArrayList相同,区别之处在于Vector是线程安全的。

  • 在各种list中,最好把ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList;Vector总是比ArrayList慢,所以尽量避免使用。

 Vector的源码分析:jdk7和jdk8中通过Vector()构造器创建对象时,底层都创建了长度为10的数组。
       在扩容方面,默认扩容为原来的数组长度的2倍。
 

3.List接口中的常用方法

  • void add(intindex, Object ele):在index位置插入ele元素

  • boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来

  • Object get(int index):获取指定index位置的元素

  • int indexOf(Object obj):返回obj在集合中首次出现的位置

  • int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置

  • Object remove(int index):移除指定index位置的元素,并返回此元素

  • Object set(int index, Object ele):设置指定index位置的元素为ele

  • List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值