Java - 集合(二) List ArrayList LinkedList

本文深入解析ArrayList与LinkedList两种Java集合框架中的线性表实现。详细介绍了它们的数据结构特点、内部实现原理及应用场景,并通过示例代码展示了如何使用这两种数据结构。

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

List
–ArrayList 线性表中的顺序表在 内存中分配连续的空间 查 效率高 增 删效率低
–LinkedList 线性表中的双向链表 内存中分配离散的空间 查 效率低 增 删效率高

一 ArrayList

class ArrayList<E> extends AbstractList<E> implements List<E>

·size 和 capacity 的区别:

size 指的是ArrayList数组元素的个数,是成员变量,在增删的时候记得维护
capacity 指的是ArrayList开辟的内存空间

·常用方法

boolean isEmpty()
int size()
boolean add(Object obj)
boolean addAll(Collection c)
boolean remove(Object obj)
set()
get()
indexOf()

代码示例,一些简单的方法就不写了

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestArrayList {
    public static void main(String[] args) {
        //这里使用了泛型,有两个好处:1 解决了繁琐的强制转换 2 锁定了数据类型,更加安全
        List<Integer> list = new ArrayList<>(); //声明一个ArrayList并申请空间,且用到了Java对象的多态,接口的引用指向实现类对象.

        System.out.println(list.size());

        list.add(43); // 这里其实进行了自动装箱,因为add()的参数是Object,这里自动转成Interger
        list.add(35);
        list.add(43);

        System.out.println(list.get(0));
        System.out.println(list.get(0).getClass()); // getClass() 是Object的方法,返回数据类型

        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(9);
        list2.add(22);

        list.addAll(2,list2); //可以在某个位置添加一个Collection
        System.out.println(list);

        //遍历
        //1 for 循环
        for (int i = 0; i < list.size(); i++) {
            int elem = list.get(i);
            System.out.println(i + "  " + elem);
        }


        //2 foreach 循环 JDK1.5特性
        for (int elem: list) {
            System.out.println(elem);
        }

        //3 Iterator迭代器
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            int elem = it.next();
            System.out.println(elem);
        }
    }
}

二 LinkedList

java.lang.Object
   ↳     java.util.AbstractCollection<E>
         ↳     java.util.AbstractList<E>
               ↳     java.util.AbstractSequentialList<E>
                     ↳     java.util.LinkedList<E>

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable {}

可以看到LinkedList不仅实现了List接口,有List的方法,还实现了Deque接口(双端队列),有双端队列的方法,(Deque implements queue).实际上Java中的队列就是靠LinkedList实现的.如:

Queue q = new LinkedList();

LinkedList的本质是双向链表。
(01) LinkedList继承于AbstractSequentialList,并且实现了Dequeue接口。
(02) LinkedList包含两个重要的成员:header 和 size。
  header是双向链表的表头,它是双向链表节点所对应的类Entry的实例。Entry中包含成员变量: previous, next, element。其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值。
  size是双向链表中节点的个数。

常用方法比ArrayList多了一些
使用时要注意如果是作为队列就不能使用下面部分方法

boolean       add(E object)
void          add(int location, E object)
boolean       addAll(Collection<? extends E> collection)
boolean       addAll(int location, Collection<? extends E> collection)
void          addFirst(E object)
void          addLast(E object)
boolean       contains(Object object)
Iterator<E>   descendingIterator()
E             element()
E             get(int location)
E             getFirst()
E             getLast()
int           indexOf(Object object)
boolean       offer(E o)
E             peek()
E             poll()
E             pop()
void          push(E e)
E             remove()
E             remove(int location)
boolean       remove(Object object)
int           size()
<T> T[]       toArray(T[] contents)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值