zoukankan      html  css  js  c++  java
  • 数据结构与算法分析java——线性表2(ArrarList )

    ArrayList

    ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。


    ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。


    ArrayList 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。稍后,我们会比较List的“快速随机访问”和“通过Iterator迭代器访问”的效率。


    ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。


    ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。


    和Vector不同,ArrayList中的操作不是线程安全的。所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。

    1. 成员变量和初始化

    private static final int DEFAULT_CAPACITY = 10;
    private static final Object[] EMPTY_ELEMENTDATA = {};
    private transient Object[] elementData;
    private int size;

     默认的大小为10。

    EMPTY_ELEMENTDATA是用于无参初始化,即一个等于null的对象数组。

    elemenData则用于有参初始化的变量,也是我们下面操作的主体对象。

    下面看看有参初始化的源码:

    public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                                initialCapacity);
        this.elementData = new Object[initialCapacity];
    }

    此处初始化一个大小为initialCapacity的对象数组

    由初始化的过程可以看出:ArrayList是基于动态数组实现的

    2. 常用操作

    // Collection中定义的API
    boolean             add(E object)
    boolean             addAll(Collection<? extends E> collection)
    void                clear()
    boolean             contains(Object object)
    boolean             containsAll(Collection<?> collection)
    boolean             equals(Object object)
    int                 hashCode()
    boolean             isEmpty()
    Iterator<E>         iterator()
    boolean             remove(Object object)
    boolean             removeAll(Collection<?> collection)
    boolean             retainAll(Collection<?> collection)
    int                 size()
    <T> T[]             toArray(T[] array)
    Object[]            toArray()
    // AbstractCollection中定义的API void add(int location, E object) boolean addAll(int location, Collection<? extends E> collection) E get(int location) int indexOf(Object object) int lastIndexOf(Object object) ListIterator<E> listIterator(int location) ListIterator<E> listIterator() E remove(int location) E set(int location, E object) List<E> subList(int start, int end)
    // ArrayList新增的API Object clone() void ensureCapacity(int minimumCapacity) void trimToSize() void removeRange(int fromIndex, int toIndex)

    3. 遍历方式

    1)随机访问,通过索引获取元素。ArrayList实现了RandomAccess接口

    Integer value=null;
    int size=list.size();
    for(int i=0;i<size;i++){
        value=(Integer) list.get(i);
    }

    2)for循环

    Integer value=null;
    for(Integer integ:list){
        value=integ;
    }

    3)迭代器

    Integer value=null;
    Integer iter=list.iterator();
    while (iter.hasNext()) {
        value=(Integer) iter.next();
    }

    4. 例子

    import java.util.*;
    
    public class ArrayListTest {
        public static void main(String[] args) {
    
            // 创建ArrayList
            ArrayList list = new ArrayList();
            // 将“”
            list.add("1");
            list.add("2");
            list.add("3");
            list.add("4");
            // 将下面的元素添加到第1个位置
            list.add(0, "5");
            // 获取第1个元素
            System.out.println("the first element is: "+ list.get(0));
            // 删除“3”
            list.remove("3");
            // 获取ArrayList的大小
            System.out.println("Arraylist size=: "+ list.size());
            // 判断list中是否包含"3"
            System.out.println("ArrayList contains 3 is: "+ list.contains(3));
            // 设置第2个元素为10
            list.set(1, "10");
            // 通过Iterator遍历ArrayList
            for(Iterator iter = list.iterator(); iter.hasNext(); ) {
                System.out.println("next is: "+ iter.next());
            }
            // 将ArrayList转换为数组
            String[] arr = (String[])list.toArray(new String[0]);
            for (String str:arr)
                System.out.println("str: "+ str);
            // 清空ArrayList
            list.clear();
            // 判断ArrayList是否为空
            System.out.println("ArrayList is empty: "+ list.isEmpty());
        }
    }
  • 相关阅读:
    LeetCode 1110. Delete Nodes And Return Forest
    LeetCode 473. Matchsticks to Square
    LeetCode 886. Possible Bipartition
    LeetCode 737. Sentence Similarity II
    LeetCode 734. Sentence Similarity
    LeetCode 491. Increasing Subsequences
    LeetCode 1020. Number of Enclaves
    LeetCode 531. Lonely Pixel I
    LeetCode 1091. Shortest Path in Binary Matrix
    LeetCode 590. N-ary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/zxqstrong/p/5417186.html
Copyright © 2011-2022 走看看