关于ArrayList继承和实现的一些类的粗浅理解
自述
最近一段时间,想静下心来研究研究底层的一些东西,今天在做java线程之间通信时,运用到了ArrayList,正好我随手就点进去看看源码,如下
相关代码:
public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
如上它继承了抽象List、实现了list,RandomAccess, Cloneable, java.io.Serializable接口,其实刚开始只知道其中几个接口,其他都不太清楚,就有追进去了,
AbstractList
这里我就简单介绍,如下图所示AbstractList继承AbstractCollection,实现list接口,实现或者继承他们的相关的方法,自己再对自己本身进行新的功能扩展。

list
其实有时候真是最熟悉的陌生人,真的让我好好解释list,我倒真的不知道怎么解释了

RandomAccess
源码中该接口是空的
public interface RandomAccess { }
没有任何方法,但是听其他大神说这玩意可以让实现该接口的list拥有快速随机访问,总之就是一句话实现RandomAccess接口的的List可以通过简单的for循环来访问数据比使用iterator访问来的高效快速(后期实现一把)
Cloneable
这个玩意也是空的
public interface Cloneable { }
实现该接口可以进行字段级的拷贝

在一个没有实现Cloneable接口的类的实例(instance)上调用clone()方法,会导致抛出CloneNotSupportedException异常。同时,实现了Cloneable接口的类,应该重写clone()方法,并把clone()方法修改为public。由于Cloneable接口并不包含clone()方法,因此,即使某个类实现了Cloneable接口,也无法保证它能正确的克隆一个对象。即使通过反射方式调用clone()方法,也不能保证一定能成功(https://blog.csdn.net/zht666/article/details/51597546 ,实现了一下确实如此)
java.io.Serializable
这个就不用说了,实现序列化,结果去看源码时,关于arraylist的序列化和反序列化,又有新的门道。。。。。
摘自effective java:当一个对象的物理表示方法与它的逻辑数据内容有实质性差别时,使用默认序列化形式有N种缺陷,所以应该尽可能的根据实际情况重写序列化方法

浙公网安备 33010602011771号