ArrayList数组列表

ArrayList数组列表

Collection接口和List接口的区别

  • List接口扩充了Collection接口,添加了索引相关的方法。
  • code example
    Object get(int index)
    Object set(int index,Object element)
    int indexOf(Object elem)
    void add(int index,Object element)
    Object remove(int index)
  • List接口中的大多数方法是基于索引的。

ArrayList类

1、可以看成一维数组的改良版,支持随机访问,ArrayList对象的大小自动调整。 2、ArrayList对象中每个元素的相对位置都是利用索引表示,索引范围0~n-1 3、给定一个索引,访问这个索引位置上的元素时间是常数级别。 4、删除元素,最坏情况是O(n-index),所以删除靠后面的元素花费的时间越少。 5、插入元素,最坏情况是O(n-index),所以插入末尾操作花费时间越少。

源码方法分析(具体可以看java documnet)

public ArrayList Object(int initialCapacity);
指定初始化容量的大小
public boolean add(Object o);
在末尾插入元素
public int size();
返回容器的有效元素个数

......

ArrayList对象的可串行化

ObjectOutputStream

ArrayList对象的可克隆性

实现了Clonable接口 方法:

public Object clone();

复制的是ArrayList对象中元素的引用,并不是对象,所以称为“浅复制”。

public class ArrayListDemo {

    public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<Integer>(3);
        list.add(1);
        list.add(2);
        System.out.println("list size="+list.size());
        ArrayList<Integer> temp=(ArrayList<Integer>) list.clone();
        System.out.println("temp size="+temp.size());
        //www.90168.org不改变克隆对象
        list.add(3);
        System.out.println("list result size="+list.size());
        System.out.println("temp result size="+temp.size());
    }

}

/*
*list size=2
*temp size=2
*list result size=3
*temp result size=2
*/

ArrayList的扩充,分摊时间

1、数组一般扩充50% 2、add()方法将newCapacity设置成(oldCapacity*3)/2+1并没有实际的意义,只是为了时间和空间的平衡。

Fail-First迭代器

1、继承了AbstractList的modCount字段 add()、remove()modCount加1 一旦next()方法激活,就不能修改ArrayList。

public class ArrayListDemo2 {

    public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<Integer>();
        list.add(2);
        list.add(3);

        Iterator it=list.iterator();
        while(it.hasNext()){
            int ele=(int) it.next();
            //进行修改,会抛异常
            list.add(1, 4);
            System.out.println(ele);
        }
    }

}

与Vector类的区别

1、Vector类也是基于数组实现 2、Vector类的方法大都是同步的。

时间: 2025-01-02 05:19:16

ArrayList数组列表的相关文章

泛型数组列表 ArrayList

为什么使用泛型数组列表而不使用普通数组? 1.普通数组经常会发生容量太大以致浪费的情况 2.普通数组无法动态更改数组 基本概念: 1.采用[类型参数]的[类]---->[泛型类] 2.[泛型类型]就是类型参数的类型 对泛型数组列表的操作: 1.添加元素,add方法,默认在尾部添加,变化参数可以插入到中间.删除元素 2.初始化容量(ensurecapacity或是把初始容量传递给构造器) 3.回收多余的存储空间(trimToSize) 4.访问数组元素 get(i) 5.转化为数组 toArray

.NET重思(三)-数组列表与数组的区别,栈集合和队列结合的区别

数组列表和数组十分相似,区别在于数组列表的容量是可以动态变化的,而数组的容量是固定的.数组即Array类,数组列表即ArrayList类,两者十分相似.不过,Array类在System命名空间下,ArrayList类在System.Collections命名空间下.数组在初始化时需要指定容量,并且指定之后无法改变,而数组列表可以动态的改变容量. //初始化ArrayList ArrayList lst = new ArrayList(); //初始化ArrayList并将容量设置为100 Arr

自定义数组列表和队列

最近一直在研究数据结构与算法,涉及到自定义数组和队列,感觉对JDK源代码的底层功能实现学习有一定的帮助,故作此总结,以供参考. ps:JDK的源代码更加复杂,我的自定义数组列表和队列只是一些简单的逻辑实现. 1.自定义数组列表(MyArrayList.java) package com.BlueStarWei.arrayList; /** * * show all fields and method,please click "ctrl + o" * * * 开发过程遇到的问题: *

java-基础入门-泛型数组列表-解决运行时动态更改数组的问题

泛型数组列表,主要是为了解决运行时动态更改数组的问题 平常我们会定义一个部门里面的人员的一个数组, 但是在实际业务当中,这个数组的大小往往是不确定的, 如果定义过大,那么会浪费空间,定义过小,又不够用, 因为为了解决运行时动态更改数组的问题,我们提出下面的解决方案. package com.ray.object; import java.util.ArrayList; /** * 泛型数组列表 ,解决运行时动态更改数组的问题 * * @author ray * @since 2015-05-04

泛型数组列表

java.util.ArrayList<T> ArrayList<>() 构造一个空数组列表 ArrayList<T>(int initialCapacity) 用指定容量构造一个空数组列表 boolean add(T obj) 在数组列表的尾端添加一个元素 int size() 返回存储在数组列表中的当前元素数量.(这个值小于或等于数组列表的容量) void ensureCapacity(int capacity) 确保数组列表在不重新分配存储空间的情况下就能够保存给

关于JAVA核心技术(卷一)读后的思考(泛型数组列表的讨论)

在C++中编译时是要确定数组大小的,而Java有所不同,它允许在运行时确定数组的大小.但是如果仅通过数组是无法改变运行时无法动态更改数组的问题.一旦确定了数组大小,就很难改变他了数组的大小了,要解决这个问题,就需要引入ArrayList的类.它使用起来有点像数组,但在添加或删除元素时,具有自动调节数组容量的功能,而不需要为此编写任何代码. ArrayList是一个采用类型参数的泛型类.为了指定数组列表保存的元素对象类型,需要用一对尖括号将类名括起来加在后面.下面是声明和构造一个保存Employe

数组与数组列表

数组 数组代表一系列对象或者基本数据类型,所有相同的类型都封装到一起——采用一个统一的标识符名称.简单来讲,数组就是一组相关数据的集合,是一连串的变量.Java中数组的定义和使用时通过方括号索引运算符进行的({}),一般来说,有两种定义数组的方法,只需在类型名或标识符后跟一对方括号即可. int[] a1; int a1[]; 两种表示方法是完全一样的.此时只是声明了指向数组的一个对象,并未对其分配任何空间,为了创建数组相应的存储空间,就必须要写一个初始化表达式.如: int b = {1, 2

遍历ArrayList数组时可能存在的问题

我们都知道ArrayList类中有个重要的方法是Add(),该方法用于向集合中添加元素,它有一个object类型的参数,表示通过该方法可以向集合中添加任意类型的项,由于ArrayList动态数组中的元素可以多样化,当使用foreach语句遍历ArrayList数组时,可能会给程序带来潜在的问题. 我们来讨论下,代码如下: class Program { //遍历arraylist出现的问题分析 static void Main(string[] args) { ArrayList arr = g

随机的将1-100之间的数据添加到 ArrayList数组中

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace ConsoleApplication2 { class Program { //随机的将1-100之间的数据添加到 ArrayList数组中 static void Main(string[] args) { ArrayList arrlist = new