## JDK源码--ArrayList

概述

1 List接口的可变数组的实现,数组默认初始化容量为10 。采用复制的方式,影响性能,尽量预估需要的容量大小:

public ArrayList(int initialCapacity);
public ArrayList(Collection<? extend E>);

2 自动增长采用拷贝的方式:

private void grow(int minCapacity){
    int newCapacity=elementData.length+(elementData.length>>1);
    ... 判断上限和下限问题
    elementData=Arrays.Copy(elementData,newCapacity);
}

自动扩容,采用复制的方式,在添加大量元素前,可以手动调用 ensureeCapacity(int minCapacity)方法扩容。

扩容过程不是线程安全的,多线程操作需要外部保证线程安全。创建同步线程的ArrayList

List list=Collections.synchronizedList(new ArrayList());

3 add函数

 public boolean add(E e){
        elementData[size++]=e;
        //将元素加到数组最后
    }

public void add(int index,E element){
    System.arraycopy(elementData,index,elementData,index+1,size-index);
    elementData[index]=element;
    size++;
}

关于arraycopy方法:

public static native void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);

native修饰符标识该方法的实现体并非java,而是c++或者其他语言,有助于提高性能。

4 序列化

 transient Object[] elementData;

ArrayList需要开辟多余空间来保存数据,而序列化和反序列化这些没有存放数据的空间需要消耗更多资源,所有ArrayList数组声明为transient,并且自己实现writeObject(ObjectOutputStream o)和readObject(ObjectOutputStream o)方法。

5 modCount

向ArrayList添加、删除元素或者手动修改数组大小,会引起结构改变,导致Iterator报ConcurrentModificationException异常。

当ArrayList使用了iterator()方法产生自身对应的Iterator后,只能使用Iterator自身的remove和add方法来修改ArrayList的结构,其他修改都会引起ConcurrentModificationException异常。

6 clone()方法
实现Cloneable接口(该接口是空的),表明是可以进行浅拷贝的,可以调用Object.clone()返回该对象的浅拷贝。

浅拷贝:

(x.clone()!=x)==true,它们不是同一个对象
(x.clone().getClass()==x.getClass())==true,它们是同一类型的class
(x.equals(x.clone()))==true,逻辑上和内容上,应该是相同的。

7 补充材料

Java无法直接访问到操作系统底层,因此java使用native方法来扩展java程序的功能。实现步骤:
- 在java中声明native()方法,然后编译;
- 用javah产生一个.h文件;
- 写一个.cpp文件实现native导出方法,其中需要包含第二步才生的.h文件(其中又包含了JDK带的jni.h文件);
- 将第三步的.cpp文件编译成动态链接库文件
- 在java中使用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在java中被访问了。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值