java基础-arrayList
Posted 永不停歇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础-arrayList相关的知识,希望对你有一定的参考价值。
ArrayList:
结构之钱了解了,ArrayList()会构造出一个初始容量=10的空的列表;
ArrayList()的增加和删除都是拷贝数组到新的数组(如果当前数组容量不足的话),把数组内的元素全部前移/后移去完成,然后把引用指向新的数组;
LinkedList()是直接删除引用节点,并且重新改变前后节点的引用到前后元素;
ArrayList()可以通过下标迅速找到对应的元素;
线程同步,同样ArrayList不是线程安全的list,和LinkedList一样;
ArrayList()扩容是按照当前容量的1.5倍扩容的(源码内写死的):
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
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);
}
右移,>>为右移运算符,num >> 1,相当于num除以2
int newCapacity = oldCapacity + (oldCapacity >> 1);
这里相当于1.5倍;
hashCode()和equals():
到现在只用过equals,没用过hashCode;
hashCode() 和 equal() 和 ==,在Java里用来对比两个对象是否相等一致;
==是对比引用地址(变量是否相等);
equal是对比值(对比对象是否相等,默认等同于==,的也是对比对象的地址,但是对比对象内容的时候不等同==);
hashCode是对比哈希值(返回哈希值,如果两个对象相等,那么它们的哈希值一定是相同的);
如果两个对象根据eqaul()方法比较不相等,那么产生的哈希值不一定相等(碰撞的情况下还是会相等的);
但是有一点:
重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢? 因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠;
1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
以上是关于java基础-arrayList的主要内容,如果未能解决你的问题,请参考以下文章