线性存储结构-ArrayList、Vector

本文深入探讨了ArrayList的数据结构特点及其内部实现原理,包括增删操作的时间复杂度、System.arraycopy的具体实现方式,以及与Vector的主要区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ArrayList:采用数组的内部构建形式,也就是顺序存储模式。当新增一个对象时,如果当前长度超过预设,会使用System.arraycopy(定义一个更长的数组进行复制处理),这个时候开销比较大。

System.arraycopy,数组长度小于32的采用的是java层的遍历处理,长数组采用的是native层的处理
  /**
  * The byte array length threshold below which to use a Java
  * (non-native) version of arraycopy() instead of the native
  * version. See b/7103825.
  */
  private static final int ARRAYCOPY_SHORT_BYTE_ARRAY_THRESHOLD = 32;

  /**
  * The byte[] specialized version of arraycopy().
  *
  * @hide internal use only
  */
  public static void arraycopy(byte[] src, int srcPos, byte[] dst, int dstPos, int length) {
  if (src == null) {
  throw new NullPointerException("src == null");
  }
  if (dst == null) {
  throw new NullPointerException("dst == null");
  }
  if (srcPos < 0 || dstPos < 0 || length < 0 ||
  srcPos > src.length - length || dstPos > dst.length - length) {
  throw new ArrayIndexOutOfBoundsException(
  "src.length=" + src.length + " srcPos=" + srcPos +
  " dst.length=" + dst.length + " dstPos=" + dstPos + " length=" + length);
  }
  if (length <= ARRAYCOPY_SHORT_BYTE_ARRAY_THRESHOLD) {
  // Copy byte by byte for shorter arrays.
  if (src == dst && srcPos < dstPos && dstPos < srcPos + length) {
  // Copy backward (to avoid overwriting elements before
  // they are copied in case of an overlap on the same
  // array.)
  for (int i = length - 1; i >= 0; --i) {
  dst[dstPos + i] = src[srcPos + i];
  }
  } else {
  // Copy forward.
  for (int i = 0; i < length; ++i) {
  dst[dstPos + i] = src[srcPos + i];
  }
  }
  } else {
  // Call the native version for longer arrays.
  arraycopyByteUnchecked(src, srcPos, dst, dstPos, length);
  }
  }
新增时间复杂度o(n)

  @Override public boolean add(E object) {
  Object[] a = array;
  int s = size;
  if (s == a.length) {
  Object[] newArray = new Object[s +
  (s < (MIN_CAPACITY_INCREMENT / 2) ?
  MIN_CAPACITY_INCREMENT : s >> 1)];
  System.arraycopy(a, 0, newArray, 0, s);
  array = a = newArray;
  }
  a[s] = object;
  size = s + 1;
  modCount++;
  return true;
  }

删除时间复杂度o(n)

  @Override public E remove(int index) {
  Object[] a = array;
  int s = size;
  if (index >= s) {
  throwIndexOutOfBoundsException(index, s);
  }
  @SuppressWarnings("unchecked") E result = (E) a[index];
  System.arraycopy(a, index + 1, a, index, --s - index);
  a[s] = null; // Prevent memory leak
  size = s;
  modCount++;
  return result;
  }
获取数据,采用的是数据下标的形式,具有高的查询效率时间复杂度o(1)

 @SuppressWarnings("unchecked") @Override public E get(int index) {
  if (index >= size) {
  throwIndexOutOfBoundsException(index, size);
  }
  return (E) array[index];
  }
ArrayList,是一个顺序存储结构,内部采用数组的形式构建。能够高效的随机访问元素,时间复杂度为0(1),但对于快速插入及删除元素,效率较低,时间复杂度为0(n)。
另外Vector跟ArrayList都是实现了List接口。Vector同样也是顺序的存储结构。两者主要的区别如下:
(1)Vector是线程安全,ArrayList是非线程安全
(2)2者扩容机制不一样,Vector可以设置capacityIncrement增长因子,ArrayList大于MIN_CAPACITY_INCREMENT/2时增长0.5倍数。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值