【Java数据结构】线性表List

本文参考链接:
https://blog.csdn.net/BALAHuN/article/details/89065056
https://blog.csdn.net/u011497622/article/details/81284192
https://www.cnblogs.com/dongtian-blogs/p/10861138.html

1.List

List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。

public interface List<E> extends Collection<E> {}

【Java数据结构】线性表List_第1张图片
在Java中,我们在创建一个链表的时候,常用的有ArrayList,LinkedList这两种选择;
语法:

List<Integer> list = new ArrayList<>();
List<Integer> list = new LinkedList<>();

2.ArrayList

ArrayList,相当于C++中的vector,长度非固定,但是只能存储对象,不能存储原始数据类型例如int、char.
虽然相当于vector,但是ArrayList不能通过下标访问!

/**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

带参数的构造方法:

/**
     * Constructs an empty list with the specified initial capacity.
     *
     * @param  initialCapacity  the initial capacity of the list
     * @throws IllegalArgumentException if the specified initial capacity
     *         is negative
     */
    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
	}
Operation Method
添加 add(Object)
访问 get(int index)
更新 set(int index, Object newValue)
长度 length()
删除 remove(int index)
排序 java.util.Collections.sort(arraylist)

由上可知,ArrayList内部其实是用数组来实现的,其扩容方式为:

int newCapacity = oldCapacity + (oldCapacity >> 1);

3.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;
            this.prev = prev;
        }
	}

4.ArrayList和LinkedList总结

List 数据结构 存储方式 适用场景 不适用场景
ArrayList 动态数组 内存地址连续 对get和set的调用花费常数时间,查询快 对新项的插入和现有项的删除代价昂贵,除非变动是在ArrayList末端进行,即增删慢;线程不安全
LinkedList 双向链表 内存地址不连续 新项的插入和现有项的删除开销很小 ,增删快 不容易做索引,因此get的调用代价昂贵,除非调用非常接近表的端点,即查询慢;线程不安全

你可能感兴趣的:(【Java数据结构】线性表List)