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