数据结构之ArrayList

ArrayList详解

ArrayList概念

​ ArrayList其实是一个数组,数组是一种线性表数据结构,使用一组连续的内存空间来存储同一种数据类型;特点:

​ 1:增删慢,每次删除元素都要更改数组长度,拷贝和移动元素位置;(为了保证数据的连续性)

​ 2:查询快,可以根据地址+索引的方式快速获取对应位置上的元素;

​ 内存寻址:计算机在分配内存的时候,会给每个内存单元都分配了一个地址,然后通过地址来访问数据;比如new int[5]; 计算机会给数组分配一块连续的内存空间,并且得到这个内存空间的起始位置,比如从0-4;,所以如果要通过地址来访问数据的时候,计算机有一个寻址公式来到得到其地址;

ArrayList类

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

Serializable 标记性接口

不实现这个类的接口将不会使用任何状态序列化或反序列化,可序列化类的所有子类型都是可以序列化的;

而且这个序列化的接口是没有方法或者字段的,仅仅是标识可串行序列化的语义;

那么序列化有什么作用呢?

序列化:将对象得数据写入到文件(写对象)

反序列化:将对象数据从文件中读取出来

不使用就会无法写入数据,写入到文件中;

Cloneable 标记性接口

克隆就是可以创建一份新的完全一样的数据拷贝,如果不实现这个接口,克隆的时候会出问题;CloneNotSupprotedException

源码分析:clone方法其实调用的native层的clone,(super.Clone)的时候,调用的是object对象的clone方法;

拷贝分为以下两种方式:

浅拷贝:基本数据类型可以达到复制,引用数据类型则不可以;引用类型只会拷贝对象的地址,所以当原对象发生改变的时候,拷贝的对象也会发生改变。

使用浅拷贝的时候,该类需要实现Cloneable接口,并且实现clone()方法;

深拷贝:主类的基本数据类型和引用数据类型都可以进行拷贝,但需要注意的是,主类中的所有引用类型数据需要重写clone方法;然后在主类中修改clone方法,clone的时候依次去调用引用类的clone方法。

RandomAccess 标记性接口

该接口主要由List实现,用来表示支持快速随机访问;这个接口的目的是为了让一些通用的算法可以更改行为;比如随机访问列表或者顺序访问列表的时候能够提供更好的性能;

for(int i=0;i=list.size();i++){
	list.get(i) // 这种方式就是典型的随机访问列表,因为我们可以根据i来指定我们需要访问具体的某个索引上的值;
}

随机访问列表的速度要比顺序访问的速度要快

Iterator<String> it = list.iterator();
while (it.hasNext()){
    it.next();// 这种方式就是典型的顺序访问,因为它的访问顺序是一个接着一个;
}

RandomAccess接口测试

AbstractList 抽象类

该类提供了List接口的骨架实现,以最小化实现由“随机存取”数据存储(如阵列)支持的此接口所需的工作量,对于顺序访问数据(例如链表列表),应该使用AbstractSequentialList优先;

要实现一个不可修改的列表,开发者只需要拓展这个类并提供get(int)和size()方法实现;

要实现可修改的列表,开发者必须覆盖set(int,E)方法(否则将抛出UnsupportedOprationException),如果列表可变大小,开发者必须覆盖add(int,E)和remove(int)方法。

根据Collection接口规范中的建议,开发者通常情况下应该提供一个无参以及集合构造函数;

而且程序员不必提供迭代器实现,迭代器和列表迭代器由此类实现;

(以上皆来自JDK官方对于AbstractList定义)

通俗的解释:AbstractList针对List集合做了一些通用的定义,如果你要自定义List,该List的行为与AbstractList中的功能重合,则不必自己实现,然后根据自己的需求去重写AbstractList其他的方法;

ArrayL

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值