Java集合ArrayList源码分析(一)

7 篇文章 0 订阅
6 篇文章 0 订阅

一、ArrayList简介:
1.1ArrayList 概述
1)ArrayList是是一个可以动态修改的数组,它是基于数组实现的List接口。
2)ArrayList类喂鱼java.util包中,使用前需要引入,语法格式如下:

import java.util.ArrayList;//引入ArrayList类
ArrayList<E> objectName = new ArrayList<>();//初始化

3)ArrayList和Vector的区别:
ArrayList是线程不安全的,当多条线程同时访问同一个ArrayList集合时,程序需要手动保证该集合的同步性,而Vector则是线程安全的。
4)ArrayList是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
二、ArrayList的数据结构:
分析一个类的时候,数据结构往往是灵魂所在,ArrayList的数据结构是:
底层的数据结构是数组,数组元素类型为Object类型,即可以存放所有的类型数据。所有的操作都是基于数组的。
三、ArrayList继承结构和层次关系:

ArrayList extends AbstractList
AbstractList extends AbstractCollection

所有的类都继承Object
在这里插入图片描述

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{}

分析:
1、为什吗要先继承AbstractList,而让AbstractList 先实现List? 而不是让ArrayList直接实现List?

A:接口中全都是抽象的方法,而抽象类中可以有抽象方法,还可以有具体的实现方法,正是利用这一点,让AbstractList实现接口中的一些普通的方法;
B:具体的类,如ArrayList就继承这个AbstractList类,拿到一些通用的方法,然后自己再实现一些自己的特有方法,这样子让代码更简洁,就继承结构最低成的类中通用的方法都抽取出来。
C: 先一起实现了,减少代码重复, 一般看到一个类上面还有一个抽象类,大部分都是在这个作用。

2、ArrayList实现了那些接口?

1)RandomAccess接口:这是一个标记性接口,用来跨苏随机存取,有关效率的问题,在实现了该接口的话,使用普通的for循环遍历,性能更高。
而没有实现该接口的话,使用Iterator来迭代,这样性能更高,例如linkedList。所以这个标记性只是为了让我们知道我们用什么样的方式去获取数据性能更好。
2)Cloneable接口:实现了该接口就可以使用Object.Clone()方法了。
3)Serializable接口:实现该序列化接口,表明该类可以被序列化。
序列化:简单的说就是能够从类变成字节流传输,然后还能从字节流变成原来的类。

四、ArrayList类中的属性:

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneble, java.io.Serializable{
//版本号
private static final long serialVersionUID = 8683452581122892189L;
//缺省属性
private static final int DEFAULT_CAPACITY = 10;
//空对象数组
private static final Object[] EMPTY_ELEMENTDATA = {};
//缺省空对象数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//元素数组
transient Object[] elementData;
//实际元素大小  默认为0 
praivate int size;
//最打数组容量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE -8;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何忧何虑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值