本篇博客的目的是理清为什么数组数据结构可以直接根据索引得到元素,而不是需要像链表一样遍历查找。 自己实现一个非循环双向链表请看上篇:Java-链表结构、自己实现一个LinkedList
一:基本数据类型数组怎么根据索引直接得到元素?
创建一个int类型的数组,int[] arr=new int[5];此时就会知道数组arr的首地址为x和元素类型为int,那么a[i]的地址为x+i*sizeof(int)。
所以a[0]的地址=x //数组开始的地址和数组第一个元素的地址是同一个地址
a[1]的地址=x+1*4=x+4
a[2]的地址=x+2*4=x+4
所以只要给出一个数组的第一个元素开始的地址和这个数组元素的类型就能求得这个数组中所有元素的地址了,从而可以直接访问数组中所有元素的值了。
现在我们知道了数组根据索引直接得到元素的原理,此时就不禁在想,基本类型如int可以确定每一个int变量都是占用4个字节大小,那引用类型对象怎么确定所占内存大小呢?并且这个引用类型对象占用内存大小会随对象内容变化而变化吗?那就请继续往下看。
二:引用数据类型对象怎么确定它所占内存大小应该是多少?
假如有一个Person类,
public class Student{
int id;
String name;
int age;
Date birthday;
}
现在创建一个数组Student[] arrPer=new Student[5];此时就会知道arrPer的首地址为x,元素类型为Student,那么arrPer [i] 的地址为x+i*sizeof(Student)。所以原理都是一样的,现在的问题是一个Student类型对象在内存中到底占用几个字节呢?下面我们就来解决这个问题。水平线下面主要参考:Java一个对象占用多少字节 - 玄同太子 - 博客园,此篇文章都是待考