源代码阅读

ArrayList源码分析

jdk 源码模块

 

继承结构和层次

代码:

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

1.ArrayList继承这个AbstractList类

2.ArrayList实现了List<E>,RandomAccess,Cloneable,java.io.Serializable等接口

作用:

(1)List<E>接口:一个 List 是一个元素有序的、可以重复、可以为 null 的集合(有时候我们也叫它“序列”)。

(2)RandomAccess接口:

这个是一个标记性接口,通过查看api文档,它的作用就是用来快速随机存取,有关效率的问题,在实现了该接口的话,那么使用普通的for循环来遍历,性能更高,例如arrayList

(3)Cloneable接口:

实现了该接口,就可以使用Object.Clone()方法了。

(4)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;    *// 元素数组*
     
 private int size;  //实际元素大小,默认为0
​
 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;  *// 最大数组容量*

构造

1)无参构造方法:

public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

2)有参构造函数一:

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);
    }
}

3)有参构造函数二:

public ArrayList(Collection<? extends E> c) {
    Object[] a = c.toArray();
    if ((size = a.length) != 0) {
        if (c.getClass() == ArrayList.class) {
            elementData = a;
        } else {
            elementData = Arrays.copyOf(a, size, Object[].class);
        }
    } else {
        // replace with empty array.
        elementData = EMPTY_ELEMENTDATA;
    }
}

总结:arrayList的构造方法就做一件事情,就是初始化一下储存数据的容器,其实本质上就是一个数组,在其中就叫elementData。

核心方法

 1)boolean contains(Object o);//如果这个list中有这个数据就用 indexof(Object o)这个方法返回指定元素第一次出现的索引

public boolean contains(Object o) {
    return indexOf(o) >= 0;
}
public int indexOf(Object o) {
     return indexOfRange(o, 0, size);
    }

2)lastIndexOf(Object o)//返回元素最后一个出现的位置索引

public int lastIndexOf(Object o) {
    return lastIndexOfRange(o, 0, size);
}
​
int lastIndexOfRange(Object o, int start, int end) {
    Object[] es = elementData;
    if (o == null) {
        for (int i = end - 1; i >= start; i--) {
            if (es[i] == null) {
                return i;
            }
        }
    } else {
        for (int i = end - 1; i >= start; i--) {
            if (o.equals(es[i])) {
                return i;
            }
        }
    }
    return -1;
}

3)Object clone()//此{@CodeArrayList}实例的克隆,返回此实例的浅层副本。(*图元本身不会被复制。)

public Object clone() {
    try {
        ArrayList<?> v = (ArrayList<?>) super.clone();
        v.elementData = Arrays.copyOf(elementData, size);
        v.modCount = 0;
        return v;
    } catch (CloneNotSupportedException e) {
        // this shouldn't happen, since we are Cloneable
        throw new InternalError(e);
    }
}

4)E get (int index) //返回这个元素的句子位置

public E get(int index) {
    Objects.checkIndex(index, size);
    return elementData(index);
}

5)E set(int index, E element)//用新的元素替换旧的元素

public E set(int index, E element) {
    Objects.checkIndex(index, size);
    E oldValue = elementData(index);
    elementData[index] = element;
    return oldValue;
}

6)boolean add(E e)//将指定的元素追加到此列表的末尾

  public boolean add(E e) {
        modCount++;
        add(e, elementData, size);
        return true;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阅读Android源代码是一个复杂且庞大的任务,但以下步骤可以帮助你开始: 1. 下载源代码:首先,你需要下载Android源代码。你可以从Android开源项目(AOSP)网站获取最新的Android源代码。根据你的需求,选择并下载相应的代码库。 2. 设置开发环境:在阅读Android源代码之前,确保你已经设置好了开发环境。这包括安装Java开发工具、Android SDK和相关的开发工具链。确保你能够编译和构建源代码。 3. 确定学习目标:由于Android源代码非常庞大,你可能无法一次性阅读完整个代码库。因此,建议先确定你的学习目标。你可以选择阅读特定模块或功能的实现,或者专注于某个特定版本的Android。 4. 阅读文档:Android源代码附带了一些文档,如API文档、开发者指南等。阅读这些文档可以帮助你理解源代码的结构和使用方式。 5. 选择关键模块:Android源代码中有许多关键的模块,如Framework层、系统服务、应用程序等。你可以选择其中一个模块作为起点,逐步深入学习和理解。 6. 阅读源代码和注释:Android源代码中包含了大量的注释,这些注释对于理解代码逻辑和实现细节非常有帮助。同时,你也可以通过阅读源代码来了解Android的设计和实现方式。 7. 调试和运行代码:在阅读源代码的过程中,你可以使用调试工具来跟踪代码执行过程,帮助你理解代码的工作原理。你还可以尝试编译和运行一些简单的代码,验证你对源代码的理解。 8. 参考其他资源:除了Android源代码本身,还有一些优秀的开源项目、书籍和在线教程可以作为辅助学习资源。你可以参考这些资源,加深对Android源代码的理解。 需要注意的是,阅读Android源代码需要一定的编程经验和知识基础,并且需要花费一定的时间和精力。建议在开始之前,先确保你有足够的时间和兴趣去深入学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值