ArrayList源码感受

ArrayList源码的体会

ArrayListLinkedList的异同
1.ArrayList是Array(动态数组)的数据结构,LinkedListLink(链表)的数据结构,其中数组一旦被创建,大小就固定了,数组的大小是不可以被改变的,无论静态的还是动态的,数组的长度已经确立了
2.ArrayList访问数据是随机且高效的,LinkedList随机插入删除数据是高效的
3.ArrayList自由性较低,需要考虑容量问题,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用
ArrayList扩容的方法中:
private void grow(int minCapacity) 
{
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
}
----------------------------------------------------------------
>> 右位移运算符
右移一位相当于除2,右移n位相当于除以2的n次方
所以上面是将数组扩容1.5倍
扩容1.5倍原因:
1.扩容容量不能太小,防止频繁扩容,频繁申请内存空间+数组频繁复制
2.扩容容量不能太大,需要充分利用空间,避免浪费过多空间
----------------------------------------------------------------
<< 左位移运算符
左移一位都相当于乘以21次方,左移n位就相当于乘以2的n次方
异常之throw1.throw出现在方法中,用于抛出异常信息
2.当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw
3.用于给调用者一个返回异常信息的对象,可以作为一个方法的结束,而且可以的得到一个异常
eg:
switch(true)
{
  case 1:······;break;
  case 2:······;break;
  default:throw new exception("抛出异常");
}
ArrayList.toString[]方法:
ArrayList.toString()方法在ArrayList中没有,在AbstractCollectiontoString()方法被重写为:
 public String toString() 
{
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }
在重写ArrayList时需要对方法进行重写:
/**
 * 重写toString方法用于输出数组
 */
public String toString() 
{
     StringBuilder str = new StringBuilder();
     for (int i = 0; i < size; i++)
     {
         if (i != size - 1)
         {
             str.append(eleData[i]).append(" ");
         }
         else
         {
             str.append(eleData[i]);
         }
     }
     return str.toString();
 }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值