ArrayList的详解

目录

1.ArrayList简介

2.ArrayList的构造 

2.1ArrayList()

 2.2ArrayList(Collection c)

 2.3ArrayList(int initialCapacity)

3.ArrayList常见操作  

4.ArrayList的遍历的遍历

5.ArrayList优缺点总结


1.ArrayList简介

在集合框架中, ArrayList 是一个普通的类,实现了 List 接口,具体框架图如下:
ArrayList的详解_第1张图片

 说明:

1. ArrayList 是以泛型方式实现的,使用时必须要先实例化
2. ArrayList 实现了 RandomAccess 接口,表明 ArrayList 支持随机访问
3. ArrayList 实现了 Cloneable 接口,表明 ArrayList 是可以 clone
4. ArrayList 实现了 Serializable 接口,表明 ArrayList 是支持序列化的
5. Vector 不同, ArrayList 不是线程安全的,在单线程下可以使用,在多线程中可以选择 Vector 或者 CopyOnWriteArrayList
6. ArrayList 底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

2.ArrayList的构造 

2.1ArrayList()

 public static void main(String[] args) {
        ArrayList arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
    }

源代码:

ArrayList的详解_第2张图片

 2.2ArrayList(Collection c)

这是什么?
规定了类型上界,即该数组元素的类型上限是E,后面定义装载的元素类型必须是E本身或者E的子类。

public static void main(String[] args) {
        ArrayList arraylist = new ArrayList<>();
        arraylist.add(-1);
        arraylist.add(100);
        arraylist.add(200);
        ArrayList arrayList2 = new ArrayList<>(arraylist);
        arrayList2.add(-100);
        System.out.println(arrayList2);
    }

源代码:

ArrayList的详解_第3张图片

 2.3ArrayList(int initialCapacity)

 public static void main(String[] args) {
        ArrayList arrayList = new ArrayList<>(2);
        arrayList.add(100);
        arrayList.add(200);
    }

ArrayList的详解_第4张图片

汇总:

ArrayList的详解_第5张图片


3.ArrayList常见操作  

常用方法汇总:

方法
解释
boolean add (E e)
尾插 e
void add (int index, E element)
e 插入到 index 位置
boolean addAll (Collection c)
尾插 c 中的元素
E remove (int index)
删除 index 位置元素
boolean remove (Object o)
删除遇到的第一个 o
E get (int index)
获取下标 index 位置元素
E set (int index, E element)
将下标 index 位置元素设置为 element
void clear ()
清空
boolean contains (Object o)
判断 o 是否在线性表中
int indexOf (Object o)
返回第一个 o 所在下标
int lastIndexOf (Object o)
返回最后一个 o 的下标
List subList (int fromIndex, int toIndex)
截取部分 list

抓重点解析:

1.boolean add(E e)

源代码:

ArrayList的详解_第6张图片

 ArrayList的详解_第7张图片

总结
1. 检测是否真正需要扩容,如果是调用 grow 准备扩容
2. 预估需要库容的大小 初步预估按照1.5 倍大小扩容 如果用户所需大小超过预估1.5 倍大小,则按照用户所需大小扩容 ,真正扩容之前检测是否能扩容成功,防止太大导致扩容失败
3. 使用 copyOf 进行扩容

2. void add(int index, E element)

list index 位置插入指定元素, index 及后续的元素统一往后搬移一个位置
3.  E remove (int index)与boolean remove (Object o)
ArrayList arraylist = new ArrayList<>();
arraylist.add(1);
arraylist.add(100);
arraylist.add(0);
arraylist.remove(0);
System.out.println(arraylist);//删除的是下标为0的元素
arraylist.remove(new Integer(0));
System.out.println(arraylist);//删除的是元素0

删除指定元素,找到了就删除,该元素之后的元素统一往前搬移一个位置

 注意:删除那个下标的元素就会返回那个下标的元素

源代码:

ArrayList的详解_第8张图片

 4.List subList(int fromIndex, int toIndex)

构成一个新的 SubList 返回 , 但是和 ArrayList 共用一个 elementData 数组
public static void main(String[] args) {
        ArrayList arraylist = new ArrayList<>();
        arraylist.add(1);
        arraylist.add(100);
        arraylist.add(0);
        List sub = arraylist.subList(1, 3);
        System.out.println(sub);
        sub.set(0,100000);
        System.out.println(sub);
        System.out.println(arraylist);
    }

ArrayList的详解_第9张图片


4.ArrayList的遍历的遍历

ArrayList 可以使用三方方式遍历: for 循环 + 下标、 foreach 、使用迭代器
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// 使用下标+for遍历
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
// 借助foreach遍历
for (Integer integer : list) {
System.out.print(integer + " ");
}
System.out.println();
Iterator it = list.listIterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
System.out.println();
}

迭代器: 

ArrayList的详解_第10张图片


5.ArrayList优缺点总结

优点:

当给定下标时,查找速度非常快,适合给定下标的查找。

缺点:

1. ArrayList 底层使用连续的空间,任意位置插入或删除元素时,需要将该位置后序元素整体往前或者往后搬 移,故时间复杂度为O(N)
2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
3. 增容一般是呈 2 倍的增长,势必会有一定的空间浪费。例如当前容量为 100 ,满了以后增容到 200 ,我们再继 续插入了5 个数据,后面没有数据插入了,那么就浪费了 95 个数据空间。


以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 

你可能感兴趣的:(java,开发语言)