java数组在内存中的存储方式
数组的引用存在栈中,而数组中的元素都存储在堆中。数组作为一种容器,它在堆中所被分配的是一段连续的空间。用来存放元素,这段连续的空间每一个空间都有下标,下标是连续的对应的!
数组作为一种元素容器,它可以存储任意类型的元素,因为可以定义成Object[] 因为它在内存中的存储方式是连续空间,每一个空间下面都有一个下标,所以数组的读取速度是非常的快的,假设要读取arr[9]的数据,那么只需要将数组下标的指针移动9+1个位置,然后就可以找到对应的数据,这对计算机来说是非常快的。
如图 ,这个可以看出来我创建的数组长度为7,数组在创建时在堆中分配空间时长度就已经给定了,它不能做扩展!这也导致了它的机动性大大的降低!为什么不能做扩展?因为数组空间的前面的空间和后面的空间也可能存储着其他的数据,数组要扩展的话只能找别的空间,从而无法保证自己空间连续的特性!
那我们用着用着数组长度不够了怎么办?直接往里面存会怎么样?
!!!我靠!直接Java.lang.ArrayIndexOutOfBoundsException
数组下标越界异常!那到底怎么办呢!
Arrays类中提供了这样的一个静态方法copyOf();
这个方法干了个啥事?他直接在堆里开辟了一个新的空间!数组长度定义的更大,然后把原来数组的元素全都复制过来!这样就产生了一个新的数组!
然后我们再把原数组的引用指向新的数组,这样就实现了数组的扩容了!
集合类ArrayList的数据存储方式就是数组!这个集合的特点就是有序,动态扩展,值可重复!其中它的可扩展性就是通过我上述的这个方法来实现的!
那么也可以看出来这个集合的读取速度是非常快!但是扩展速度是非常的慢的!每一次添加数据他都需要复制一次!如果数据量庞大的话,那就非常的慢了!